0bea2223cabbcf26cde7bf52ffab6173a6841874
[rust-lightning] / lightning / src / routing / scoring.rs
1 // This file is Copyright its original authors, visible in version control
2 // history.
3 //
4 // This file is licensed under the Apache License, Version 2.0 <LICENSE-APACHE
5 // or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
6 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
7 // You may not use this file except in accordance with one or both of these
8 // licenses.
9
10 //! Utilities for scoring payment channels.
11 //!
12 //! [`ProbabilisticScorer`] may be given to [`find_route`] to score payment channels during path
13 //! finding when a custom [`ScoreLookUp`] implementation is not needed.
14 //!
15 //! # Example
16 //!
17 //! ```
18 //! # extern crate bitcoin;
19 //! #
20 //! # use lightning::routing::gossip::NetworkGraph;
21 //! # use lightning::routing::router::{RouteParameters, find_route};
22 //! # use lightning::routing::scoring::{ProbabilisticScorer, ProbabilisticScoringFeeParameters, ProbabilisticScoringDecayParameters};
23 //! # use lightning::sign::KeysManager;
24 //! # use lightning::util::logger::{Logger, Record};
25 //! # use bitcoin::secp256k1::PublicKey;
26 //! #
27 //! # struct FakeLogger {};
28 //! # impl Logger for FakeLogger {
29 //! #     fn log(&self, record: Record) { unimplemented!() }
30 //! # }
31 //! # fn find_scored_route(payer: PublicKey, route_params: RouteParameters, network_graph: NetworkGraph<&FakeLogger>) {
32 //! # let logger = FakeLogger {};
33 //! #
34 //! // Use the default channel penalties.
35 //! let params = ProbabilisticScoringFeeParameters::default();
36 //! let decay_params = ProbabilisticScoringDecayParameters::default();
37 //! let scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
38 //!
39 //! // Or use custom channel penalties.
40 //! let params = ProbabilisticScoringFeeParameters {
41 //!     liquidity_penalty_multiplier_msat: 2 * 1000,
42 //!     ..ProbabilisticScoringFeeParameters::default()
43 //! };
44 //! let decay_params = ProbabilisticScoringDecayParameters::default();
45 //! let scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
46 //! # let random_seed_bytes = [42u8; 32];
47 //!
48 //! let route = find_route(&payer, &route_params, &network_graph, None, &logger, &scorer, &params, &random_seed_bytes);
49 //! # }
50 //! ```
51 //!
52 //! # Note
53 //!
54 //! Persisting when built with feature `no-std` and restoring without it, or vice versa, uses
55 //! different types and thus is undefined.
56 //!
57 //! [`find_route`]: crate::routing::router::find_route
58
59 use crate::ln::msgs::DecodeError;
60 use crate::routing::gossip::{EffectiveCapacity, NetworkGraph, NodeId};
61 use crate::routing::router::{Path, CandidateRouteHop};
62 use crate::util::ser::{Readable, ReadableArgs, Writeable, Writer};
63 use crate::util::logger::Logger;
64
65 use crate::prelude::*;
66 use core::{cmp, fmt};
67 use core::cell::{RefCell, RefMut, Ref};
68 use core::convert::TryInto;
69 use core::ops::{Deref, DerefMut};
70 use core::time::Duration;
71 use crate::io::{self, Read};
72 use crate::sync::{Mutex, MutexGuard, RwLock, RwLockReadGuard, RwLockWriteGuard};
73
74 /// We define Score ever-so-slightly differently based on whether we are being built for C bindings
75 /// or not. For users, `LockableScore` must somehow be writeable to disk. For Rust users, this is
76 /// no problem - you move a `Score` that implements `Writeable` into a `Mutex`, lock it, and now
77 /// you have the original, concrete, `Score` type, which presumably implements `Writeable`.
78 ///
79 /// For C users, once you've moved the `Score` into a `LockableScore` all you have after locking it
80 /// is an opaque trait object with an opaque pointer with no type info. Users could take the unsafe
81 /// approach of blindly casting that opaque pointer to a concrete type and calling `Writeable` from
82 /// there, but other languages downstream of the C bindings (e.g. Java) can't even do that.
83 /// Instead, we really want `Score` and `LockableScore` to implement `Writeable` directly, which we
84 /// do here by defining `Score` differently for `cfg(c_bindings)`.
85 macro_rules! define_score { ($($supertrait: path)*) => {
86 /// An interface used to score payment channels for path finding.
87 ///
88 /// `ScoreLookUp` is used to determine the penalty for a given channel.
89 ///
90 /// Scoring is in terms of fees willing to be paid in order to avoid routing through a channel.
91 pub trait ScoreLookUp {
92         /// A configurable type which should contain various passed-in parameters for configuring the scorer,
93         /// on a per-routefinding-call basis through to the scorer methods,
94         /// which are used to determine the parameters for the suitability of channels for use.
95         type ScoreParams;
96         /// Returns the fee in msats willing to be paid to avoid routing `send_amt_msat` through the
97         /// given channel in the direction from `source` to `target`.
98         ///
99         /// The channel's capacity (less any other MPP parts that are also being considered for use in
100         /// the same payment) is given by `capacity_msat`. It may be determined from various sources
101         /// such as a chain data, network gossip, or invoice hints. For invoice hints, a capacity near
102         /// [`u64::max_value`] is given to indicate sufficient capacity for the invoice's full amount.
103         /// Thus, implementations should be overflow-safe.
104         fn channel_penalty_msat(
105                 &self, candidate: &CandidateRouteHop, usage: ChannelUsage, score_params: &Self::ScoreParams
106         ) -> u64;
107 }
108
109 /// `ScoreUpdate` is used to update the scorer's internal state after a payment attempt.
110 pub trait ScoreUpdate {
111         /// Handles updating channel penalties after failing to route through a channel.
112         fn payment_path_failed(&mut self, path: &Path, short_channel_id: u64, duration_since_epoch: Duration);
113
114         /// Handles updating channel penalties after successfully routing along a path.
115         fn payment_path_successful(&mut self, path: &Path, duration_since_epoch: Duration);
116
117         /// Handles updating channel penalties after a probe over the given path failed.
118         fn probe_failed(&mut self, path: &Path, short_channel_id: u64, duration_since_epoch: Duration);
119
120         /// Handles updating channel penalties after a probe over the given path succeeded.
121         fn probe_successful(&mut self, path: &Path, duration_since_epoch: Duration);
122
123         /// Scorers may wish to reduce their certainty of channel liquidity information over time.
124         /// Thus, this method is provided to allow scorers to observe the passage of time - the holder
125         /// of this object should call this method regularly (generally via the
126         /// `lightning-background-processor` crate).
127         fn time_passed(&mut self, duration_since_epoch: Duration);
128 }
129
130 /// A trait which can both lookup and update routing channel penalty scores.
131 ///
132 /// This is used in places where both bounds are required and implemented for all types which
133 /// implement [`ScoreLookUp`] and [`ScoreUpdate`].
134 ///
135 /// Bindings users may need to manually implement this for their custom scoring implementations.
136 pub trait Score : ScoreLookUp + ScoreUpdate $(+ $supertrait)* {}
137
138 #[cfg(not(c_bindings))]
139 impl<T: ScoreLookUp + ScoreUpdate $(+ $supertrait)*> Score for T {}
140
141 #[cfg(not(c_bindings))]
142 impl<S: ScoreLookUp, T: Deref<Target=S>> ScoreLookUp for T {
143         type ScoreParams = S::ScoreParams;
144         fn channel_penalty_msat(
145                 &self, candidate: &CandidateRouteHop, usage: ChannelUsage, score_params: &Self::ScoreParams
146         ) -> u64 {
147                 self.deref().channel_penalty_msat(candidate, usage, score_params)
148         }
149 }
150
151 #[cfg(not(c_bindings))]
152 impl<S: ScoreUpdate, T: DerefMut<Target=S>> ScoreUpdate for T {
153         fn payment_path_failed(&mut self, path: &Path, short_channel_id: u64, duration_since_epoch: Duration) {
154                 self.deref_mut().payment_path_failed(path, short_channel_id, duration_since_epoch)
155         }
156
157         fn payment_path_successful(&mut self, path: &Path, duration_since_epoch: Duration) {
158                 self.deref_mut().payment_path_successful(path, duration_since_epoch)
159         }
160
161         fn probe_failed(&mut self, path: &Path, short_channel_id: u64, duration_since_epoch: Duration) {
162                 self.deref_mut().probe_failed(path, short_channel_id, duration_since_epoch)
163         }
164
165         fn probe_successful(&mut self, path: &Path, duration_since_epoch: Duration) {
166                 self.deref_mut().probe_successful(path, duration_since_epoch)
167         }
168
169         fn time_passed(&mut self, duration_since_epoch: Duration) {
170                 self.deref_mut().time_passed(duration_since_epoch)
171         }
172 }
173 } }
174
175 #[cfg(c_bindings)]
176 define_score!(Writeable);
177
178 #[cfg(not(c_bindings))]
179 define_score!();
180
181 /// A scorer that is accessed under a lock.
182 ///
183 /// Needed so that calls to [`ScoreLookUp::channel_penalty_msat`] in [`find_route`] can be made while
184 /// having shared ownership of a scorer but without requiring internal locking in [`ScoreUpdate`]
185 /// implementations. Internal locking would be detrimental to route finding performance and could
186 /// result in [`ScoreLookUp::channel_penalty_msat`] returning a different value for the same channel.
187 ///
188 /// [`find_route`]: crate::routing::router::find_route
189 pub trait LockableScore<'a> {
190         /// The [`ScoreUpdate`] type.
191         type ScoreUpdate: 'a + ScoreUpdate;
192         /// The [`ScoreLookUp`] type.
193         type ScoreLookUp: 'a + ScoreLookUp;
194
195         /// The write locked [`ScoreUpdate`] type.
196         type WriteLocked: DerefMut<Target = Self::ScoreUpdate> + Sized;
197
198         /// The read locked [`ScoreLookUp`] type.
199         type ReadLocked: Deref<Target = Self::ScoreLookUp> + Sized;
200
201         /// Returns read locked scorer.
202         fn read_lock(&'a self) -> Self::ReadLocked;
203
204         /// Returns write locked scorer.
205         fn write_lock(&'a self) -> Self::WriteLocked;
206 }
207
208 /// Refers to a scorer that is accessible under lock and also writeable to disk
209 ///
210 /// We need this trait to be able to pass in a scorer to `lightning-background-processor` that will enable us to
211 /// use the Persister to persist it.
212 pub trait WriteableScore<'a>: LockableScore<'a> + Writeable {}
213
214 #[cfg(not(c_bindings))]
215 impl<'a, T> WriteableScore<'a> for T where T: LockableScore<'a> + Writeable {}
216 #[cfg(not(c_bindings))]
217 impl<'a, T: Score + 'a> LockableScore<'a> for Mutex<T> {
218         type ScoreUpdate = T;
219         type ScoreLookUp = T;
220
221         type WriteLocked = MutexGuard<'a, Self::ScoreUpdate>;
222         type ReadLocked = MutexGuard<'a, Self::ScoreLookUp>;
223
224         fn read_lock(&'a self) -> Self::ReadLocked {
225                 Mutex::lock(self).unwrap()
226         }
227
228         fn write_lock(&'a self) -> Self::WriteLocked {
229                 Mutex::lock(self).unwrap()
230         }
231 }
232
233 #[cfg(not(c_bindings))]
234 impl<'a, T: Score + 'a> LockableScore<'a> for RefCell<T> {
235         type ScoreUpdate = T;
236         type ScoreLookUp = T;
237
238         type WriteLocked = RefMut<'a, Self::ScoreUpdate>;
239         type ReadLocked = Ref<'a, Self::ScoreLookUp>;
240
241         fn write_lock(&'a self) -> Self::WriteLocked {
242                 self.borrow_mut()
243         }
244
245         fn read_lock(&'a self) -> Self::ReadLocked {
246                 self.borrow()
247         }
248 }
249
250 #[cfg(not(c_bindings))]
251 impl<'a, T: Score + 'a> LockableScore<'a> for RwLock<T> {
252         type ScoreUpdate = T;
253         type ScoreLookUp = T;
254
255         type WriteLocked = RwLockWriteGuard<'a, Self::ScoreLookUp>;
256         type ReadLocked = RwLockReadGuard<'a, Self::ScoreUpdate>;
257
258         fn read_lock(&'a self) -> Self::ReadLocked {
259                 RwLock::read(self).unwrap()
260         }
261
262         fn write_lock(&'a self) -> Self::WriteLocked {
263                 RwLock::write(self).unwrap()
264         }
265 }
266
267 #[cfg(c_bindings)]
268 /// A concrete implementation of [`LockableScore`] which supports multi-threading.
269 pub struct MultiThreadedLockableScore<T: Score> {
270         score: RwLock<T>,
271 }
272
273 #[cfg(c_bindings)]
274 impl<'a, T: Score + 'a> LockableScore<'a> for MultiThreadedLockableScore<T> {
275         type ScoreUpdate = T;
276         type ScoreLookUp = T;
277         type WriteLocked = MultiThreadedScoreLockWrite<'a, Self::ScoreUpdate>;
278         type ReadLocked = MultiThreadedScoreLockRead<'a, Self::ScoreLookUp>;
279
280         fn read_lock(&'a self) -> Self::ReadLocked {
281                 MultiThreadedScoreLockRead(self.score.read().unwrap())
282         }
283
284         fn write_lock(&'a self) -> Self::WriteLocked {
285                 MultiThreadedScoreLockWrite(self.score.write().unwrap())
286         }
287 }
288
289 #[cfg(c_bindings)]
290 impl<T: Score> Writeable for MultiThreadedLockableScore<T> {
291         fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
292                 self.score.read().unwrap().write(writer)
293         }
294 }
295
296 #[cfg(c_bindings)]
297 impl<'a, T: Score + 'a> WriteableScore<'a> for MultiThreadedLockableScore<T> {}
298
299 #[cfg(c_bindings)]
300 impl<T: Score> MultiThreadedLockableScore<T> {
301         /// Creates a new [`MultiThreadedLockableScore`] given an underlying [`Score`].
302         pub fn new(score: T) -> Self {
303                 MultiThreadedLockableScore { score: RwLock::new(score) }
304         }
305 }
306
307 #[cfg(c_bindings)]
308 /// A locked `MultiThreadedLockableScore`.
309 pub struct MultiThreadedScoreLockRead<'a, T: Score>(RwLockReadGuard<'a, T>);
310
311 #[cfg(c_bindings)]
312 /// A locked `MultiThreadedLockableScore`.
313 pub struct MultiThreadedScoreLockWrite<'a, T: Score>(RwLockWriteGuard<'a, T>);
314
315 #[cfg(c_bindings)]
316 impl<'a, T: 'a + Score> Deref for MultiThreadedScoreLockRead<'a, T> {
317         type Target = T;
318
319         fn deref(&self) -> &Self::Target {
320                 self.0.deref()
321         }
322 }
323
324 #[cfg(c_bindings)]
325 impl<'a, T: Score> ScoreLookUp for MultiThreadedScoreLockRead<'a, T> {
326         type ScoreParams = T::ScoreParams;
327         fn channel_penalty_msat(&self, candidate:&CandidateRouteHop, usage: ChannelUsage, score_params: &Self::ScoreParams
328         ) -> u64 {
329                 self.0.channel_penalty_msat(candidate, usage, score_params)
330         }
331 }
332
333 #[cfg(c_bindings)]
334 impl<'a, T: Score> Writeable for MultiThreadedScoreLockWrite<'a, T> {
335         fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
336                 self.0.write(writer)
337         }
338 }
339
340 #[cfg(c_bindings)]
341 impl<'a, T: 'a + Score> Deref for MultiThreadedScoreLockWrite<'a, T> {
342         type Target = T;
343
344         fn deref(&self) -> &Self::Target {
345                 self.0.deref()
346         }
347 }
348
349 #[cfg(c_bindings)]
350 impl<'a, T: 'a + Score> DerefMut for MultiThreadedScoreLockWrite<'a, T> {
351         fn deref_mut(&mut self) -> &mut Self::Target {
352                 self.0.deref_mut()
353         }
354 }
355
356 #[cfg(c_bindings)]
357 impl<'a, T: Score> ScoreUpdate for MultiThreadedScoreLockWrite<'a, T> {
358         fn payment_path_failed(&mut self, path: &Path, short_channel_id: u64, duration_since_epoch: Duration) {
359                 self.0.payment_path_failed(path, short_channel_id, duration_since_epoch)
360         }
361
362         fn payment_path_successful(&mut self, path: &Path, duration_since_epoch: Duration) {
363                 self.0.payment_path_successful(path, duration_since_epoch)
364         }
365
366         fn probe_failed(&mut self, path: &Path, short_channel_id: u64, duration_since_epoch: Duration) {
367                 self.0.probe_failed(path, short_channel_id, duration_since_epoch)
368         }
369
370         fn probe_successful(&mut self, path: &Path, duration_since_epoch: Duration) {
371                 self.0.probe_successful(path, duration_since_epoch)
372         }
373
374         fn time_passed(&mut self, duration_since_epoch: Duration) {
375                 self.0.time_passed(duration_since_epoch)
376         }
377 }
378
379
380 /// Proposed use of a channel passed as a parameter to [`ScoreLookUp::channel_penalty_msat`].
381 #[derive(Clone, Copy, Debug, PartialEq)]
382 pub struct ChannelUsage {
383         /// The amount to send through the channel, denominated in millisatoshis.
384         pub amount_msat: u64,
385
386         /// Total amount, denominated in millisatoshis, already allocated to send through the channel
387         /// as part of a multi-path payment.
388         pub inflight_htlc_msat: u64,
389
390         /// The effective capacity of the channel.
391         pub effective_capacity: EffectiveCapacity,
392 }
393
394 #[derive(Clone)]
395 /// [`ScoreLookUp`] implementation that uses a fixed penalty.
396 pub struct FixedPenaltyScorer {
397         penalty_msat: u64,
398 }
399
400 impl FixedPenaltyScorer {
401         /// Creates a new scorer using `penalty_msat`.
402         pub fn with_penalty(penalty_msat: u64) -> Self {
403                 Self { penalty_msat }
404         }
405 }
406
407 impl ScoreLookUp for FixedPenaltyScorer {
408         type ScoreParams = ();
409         fn channel_penalty_msat(&self, _: &CandidateRouteHop, _: ChannelUsage, _score_params: &Self::ScoreParams) -> u64 {
410                 self.penalty_msat
411         }
412 }
413
414 impl ScoreUpdate for FixedPenaltyScorer {
415         fn payment_path_failed(&mut self, _path: &Path, _short_channel_id: u64, _duration_since_epoch: Duration) {}
416
417         fn payment_path_successful(&mut self, _path: &Path, _duration_since_epoch: Duration) {}
418
419         fn probe_failed(&mut self, _path: &Path, _short_channel_id: u64, _duration_since_epoch: Duration) {}
420
421         fn probe_successful(&mut self, _path: &Path, _duration_since_epoch: Duration) {}
422
423         fn time_passed(&mut self, _duration_since_epoch: Duration) {}
424 }
425
426 impl Writeable for FixedPenaltyScorer {
427         #[inline]
428         fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
429                 write_tlv_fields!(w, {});
430                 Ok(())
431         }
432 }
433
434 impl ReadableArgs<u64> for FixedPenaltyScorer {
435         #[inline]
436         fn read<R: Read>(r: &mut R, penalty_msat: u64) -> Result<Self, DecodeError> {
437                 read_tlv_fields!(r, {});
438                 Ok(Self { penalty_msat })
439         }
440 }
441
442 /// [`ScoreLookUp`] implementation using channel success probability distributions.
443 ///
444 /// Channels are tracked with upper and lower liquidity bounds - when an HTLC fails at a channel,
445 /// we learn that the upper-bound on the available liquidity is lower than the amount of the HTLC.
446 /// When a payment is forwarded through a channel (but fails later in the route), we learn the
447 /// lower-bound on the channel's available liquidity must be at least the value of the HTLC.
448 ///
449 /// These bounds are then used to determine a success probability using the formula from
450 /// *Optimally Reliable & Cheap Payment Flows on the Lightning Network* by Rene Pickhardt
451 /// and Stefan Richter [[1]] (i.e. `(upper_bound - payment_amount) / (upper_bound - lower_bound)`).
452 ///
453 /// This probability is combined with the [`liquidity_penalty_multiplier_msat`] and
454 /// [`liquidity_penalty_amount_multiplier_msat`] parameters to calculate a concrete penalty in
455 /// milli-satoshis. The penalties, when added across all hops, have the property of being linear in
456 /// terms of the entire path's success probability. This allows the router to directly compare
457 /// penalties for different paths. See the documentation of those parameters for the exact formulas.
458 ///
459 /// The liquidity bounds are decayed by halving them every [`liquidity_offset_half_life`].
460 ///
461 /// Further, we track the history of our upper and lower liquidity bounds for each channel,
462 /// allowing us to assign a second penalty (using [`historical_liquidity_penalty_multiplier_msat`]
463 /// and [`historical_liquidity_penalty_amount_multiplier_msat`]) based on the same probability
464 /// formula, but using the history of a channel rather than our latest estimates for the liquidity
465 /// bounds.
466 ///
467 /// [1]: https://arxiv.org/abs/2107.05322
468 /// [`liquidity_penalty_multiplier_msat`]: ProbabilisticScoringFeeParameters::liquidity_penalty_multiplier_msat
469 /// [`liquidity_penalty_amount_multiplier_msat`]: ProbabilisticScoringFeeParameters::liquidity_penalty_amount_multiplier_msat
470 /// [`liquidity_offset_half_life`]: ProbabilisticScoringDecayParameters::liquidity_offset_half_life
471 /// [`historical_liquidity_penalty_multiplier_msat`]: ProbabilisticScoringFeeParameters::historical_liquidity_penalty_multiplier_msat
472 /// [`historical_liquidity_penalty_amount_multiplier_msat`]: ProbabilisticScoringFeeParameters::historical_liquidity_penalty_amount_multiplier_msat
473 pub struct ProbabilisticScorer<G: Deref<Target = NetworkGraph<L>>, L: Deref>
474 where L::Target: Logger {
475         decay_params: ProbabilisticScoringDecayParameters,
476         network_graph: G,
477         logger: L,
478         channel_liquidities: HashMap<u64, ChannelLiquidity>,
479 }
480
481 /// Parameters for configuring [`ProbabilisticScorer`].
482 ///
483 /// Used to configure base, liquidity, and amount penalties, the sum of which comprises the channel
484 /// penalty (i.e., the amount in msats willing to be paid to avoid routing through the channel).
485 ///
486 /// The penalty applied to any channel by the [`ProbabilisticScorer`] is the sum of each of the
487 /// parameters here.
488 #[derive(Clone)]
489 pub struct ProbabilisticScoringFeeParameters {
490         /// A fixed penalty in msats to apply to each channel.
491         ///
492         /// Default value: 500 msat
493         pub base_penalty_msat: u64,
494
495         /// A multiplier used with the total amount flowing over a channel to calculate a fixed penalty
496         /// applied to each channel, in excess of the [`base_penalty_msat`].
497         ///
498         /// The purpose of the amount penalty is to avoid having fees dominate the channel cost (i.e.,
499         /// fees plus penalty) for large payments. The penalty is computed as the product of this
500         /// multiplier and `2^30`ths of the total amount flowing over a channel (i.e. the payment
501         /// amount plus the amount of any other HTLCs flowing we sent over the same channel).
502         ///
503         /// ie `base_penalty_amount_multiplier_msat * amount_msat / 2^30`
504         ///
505         /// Default value: 8,192 msat
506         ///
507         /// [`base_penalty_msat`]: Self::base_penalty_msat
508         pub base_penalty_amount_multiplier_msat: u64,
509
510         /// A multiplier used in conjunction with the negative `log10` of the channel's success
511         /// probability for a payment, as determined by our latest estimates of the channel's
512         /// liquidity, to determine the liquidity penalty.
513         ///
514         /// The penalty is based in part on the knowledge learned from prior successful and unsuccessful
515         /// payments. This knowledge is decayed over time based on [`liquidity_offset_half_life`]. The
516         /// penalty is effectively limited to `2 * liquidity_penalty_multiplier_msat` (corresponding to
517         /// lower bounding the success probability to `0.01`) when the amount falls within the
518         /// uncertainty bounds of the channel liquidity balance. Amounts above the upper bound will
519         /// result in a `u64::max_value` penalty, however.
520         ///
521         /// `-log10(success_probability) * liquidity_penalty_multiplier_msat`
522         ///
523         /// Default value: 30,000 msat
524         ///
525         /// [`liquidity_offset_half_life`]: ProbabilisticScoringDecayParameters::liquidity_offset_half_life
526         pub liquidity_penalty_multiplier_msat: u64,
527
528         /// A multiplier used in conjunction with the total amount flowing over a channel and the
529         /// negative `log10` of the channel's success probability for the payment, as determined by our
530         /// latest estimates of the channel's liquidity, to determine the amount penalty.
531         ///
532         /// The purpose of the amount penalty is to avoid having fees dominate the channel cost (i.e.,
533         /// fees plus penalty) for large payments. The penalty is computed as the product of this
534         /// multiplier and `2^20`ths of the amount flowing over this channel, weighted by the negative
535         /// `log10` of the success probability.
536         ///
537         /// `-log10(success_probability) * liquidity_penalty_amount_multiplier_msat * amount_msat / 2^20`
538         ///
539         /// In practice, this means for 0.1 success probability (`-log10(0.1) == 1`) each `2^20`th of
540         /// the amount will result in a penalty of the multiplier. And, as the success probability
541         /// decreases, the negative `log10` weighting will increase dramatically. For higher success
542         /// probabilities, the multiplier will have a decreasing effect as the negative `log10` will
543         /// fall below `1`.
544         ///
545         /// Default value: 192 msat
546         pub liquidity_penalty_amount_multiplier_msat: u64,
547
548         /// A multiplier used in conjunction with the negative `log10` of the channel's success
549         /// probability for the payment, as determined based on the history of our estimates of the
550         /// channel's available liquidity, to determine a penalty.
551         ///
552         /// This penalty is similar to [`liquidity_penalty_multiplier_msat`], however, instead of using
553         /// only our latest estimate for the current liquidity available in the channel, it estimates
554         /// success probability based on the estimated liquidity available in the channel through
555         /// history. Specifically, every time we update our liquidity bounds on a given channel, we
556         /// track which of several buckets those bounds fall into, exponentially decaying the
557         /// probability of each bucket as new samples are added.
558         ///
559         /// Default value: 10,000 msat
560         ///
561         /// [`liquidity_penalty_multiplier_msat`]: Self::liquidity_penalty_multiplier_msat
562         pub historical_liquidity_penalty_multiplier_msat: u64,
563
564         /// A multiplier used in conjunction with the total amount flowing over a channel and the
565         /// negative `log10` of the channel's success probability for the payment, as determined based
566         /// on the history of our estimates of the channel's available liquidity, to determine a
567         /// penalty.
568         ///
569         /// The purpose of the amount penalty is to avoid having fees dominate the channel cost for
570         /// large payments. The penalty is computed as the product of this multiplier and `2^20`ths
571         /// of the amount flowing over this channel, weighted by the negative `log10` of the success
572         /// probability.
573         ///
574         /// This penalty is similar to [`liquidity_penalty_amount_multiplier_msat`], however, instead
575         /// of using only our latest estimate for the current liquidity available in the channel, it
576         /// estimates success probability based on the estimated liquidity available in the channel
577         /// through history. Specifically, every time we update our liquidity bounds on a given
578         /// channel, we track which of several buckets those bounds fall into, exponentially decaying
579         /// the probability of each bucket as new samples are added.
580         ///
581         /// Default value: 64 msat
582         ///
583         /// [`liquidity_penalty_amount_multiplier_msat`]: Self::liquidity_penalty_amount_multiplier_msat
584         pub historical_liquidity_penalty_amount_multiplier_msat: u64,
585
586         /// Manual penalties used for the given nodes. Allows to set a particular penalty for a given
587         /// node. Note that a manual penalty of `u64::max_value()` means the node would not ever be
588         /// considered during path finding.
589         ///
590         /// This is not exported to bindings users
591         pub manual_node_penalties: HashMap<NodeId, u64>,
592
593         /// This penalty is applied when `htlc_maximum_msat` is equal to or larger than half of the
594         /// channel's capacity, (ie. htlc_maximum_msat >= 0.5 * channel_capacity) which makes us
595         /// prefer nodes with a smaller `htlc_maximum_msat`. We treat such nodes preferentially
596         /// as this makes balance discovery attacks harder to execute, thereby creating an incentive
597         /// to restrict `htlc_maximum_msat` and improve privacy.
598         ///
599         /// Default value: 250 msat
600         pub anti_probing_penalty_msat: u64,
601
602         /// This penalty is applied when the total amount flowing over a channel exceeds our current
603         /// estimate of the channel's available liquidity. The total amount is the amount of the
604         /// current HTLC plus any HTLCs which we've sent over the same channel.
605         ///
606         /// Note that in this case all other penalties, including the
607         /// [`liquidity_penalty_multiplier_msat`] and [`liquidity_penalty_amount_multiplier_msat`]-based
608         /// penalties, as well as the [`base_penalty_msat`] and the [`anti_probing_penalty_msat`], if
609         /// applicable, are still included in the overall penalty.
610         ///
611         /// If you wish to avoid creating paths with such channels entirely, setting this to a value of
612         /// `u64::max_value()` will guarantee that.
613         ///
614         /// Default value: 1_0000_0000_000 msat (1 Bitcoin)
615         ///
616         /// [`liquidity_penalty_multiplier_msat`]: Self::liquidity_penalty_multiplier_msat
617         /// [`liquidity_penalty_amount_multiplier_msat`]: Self::liquidity_penalty_amount_multiplier_msat
618         /// [`base_penalty_msat`]: Self::base_penalty_msat
619         /// [`anti_probing_penalty_msat`]: Self::anti_probing_penalty_msat
620         pub considered_impossible_penalty_msat: u64,
621
622         /// In order to calculate most of the scores above, we must first convert a lower and upper
623         /// bound on the available liquidity in a channel into the probability that we think a payment
624         /// will succeed. That probability is derived from a Probability Density Function for where we
625         /// think the liquidity in a channel likely lies, given such bounds.
626         ///
627         /// If this flag is set, that PDF is simply a constant - we assume that the actual available
628         /// liquidity in a channel is just as likely to be at any point between our lower and upper
629         /// bounds.
630         ///
631         /// If this flag is *not* set, that PDF is `(x - 0.5*capacity) ^ 2`. That is, we use an
632         /// exponential curve which expects the liquidity of a channel to lie "at the edges". This
633         /// matches experimental results - most routing nodes do not aggressively rebalance their
634         /// channels and flows in the network are often unbalanced, leaving liquidity usually
635         /// unavailable.
636         ///
637         /// Thus, for the "best" routes, leave this flag `false`. However, the flag does imply a number
638         /// of floating-point multiplications in the hottest routing code, which may lead to routing
639         /// performance degradation on some machines.
640         ///
641         /// Default value: false
642         pub linear_success_probability: bool,
643 }
644
645 impl Default for ProbabilisticScoringFeeParameters {
646         fn default() -> Self {
647                 Self {
648                         base_penalty_msat: 500,
649                         base_penalty_amount_multiplier_msat: 8192,
650                         liquidity_penalty_multiplier_msat: 30_000,
651                         liquidity_penalty_amount_multiplier_msat: 192,
652                         manual_node_penalties: HashMap::new(),
653                         anti_probing_penalty_msat: 250,
654                         considered_impossible_penalty_msat: 1_0000_0000_000,
655                         historical_liquidity_penalty_multiplier_msat: 10_000,
656                         historical_liquidity_penalty_amount_multiplier_msat: 64,
657                         linear_success_probability: false,
658                 }
659         }
660 }
661
662 impl ProbabilisticScoringFeeParameters {
663         /// Marks the node with the given `node_id` as banned,
664         /// i.e it will be avoided during path finding.
665         pub fn add_banned(&mut self, node_id: &NodeId) {
666                 self.manual_node_penalties.insert(*node_id, u64::max_value());
667         }
668
669         /// Marks all nodes in the given list as banned, i.e.,
670         /// they will be avoided during path finding.
671         pub fn add_banned_from_list(&mut self, node_ids: Vec<NodeId>) {
672                 for id in node_ids {
673                         self.manual_node_penalties.insert(id, u64::max_value());
674                 }
675         }
676
677         /// Removes the node with the given `node_id` from the list of nodes to avoid.
678         pub fn remove_banned(&mut self, node_id: &NodeId) {
679                 self.manual_node_penalties.remove(node_id);
680         }
681
682         /// Sets a manual penalty for the given node.
683         pub fn set_manual_penalty(&mut self, node_id: &NodeId, penalty: u64) {
684                 self.manual_node_penalties.insert(*node_id, penalty);
685         }
686
687         /// Removes the node with the given `node_id` from the list of manual penalties.
688         pub fn remove_manual_penalty(&mut self, node_id: &NodeId) {
689                 self.manual_node_penalties.remove(node_id);
690         }
691
692         /// Clears the list of manual penalties that are applied during path finding.
693         pub fn clear_manual_penalties(&mut self) {
694                 self.manual_node_penalties = HashMap::new();
695         }
696 }
697
698 #[cfg(test)]
699 impl ProbabilisticScoringFeeParameters {
700         fn zero_penalty() -> Self {
701                 Self {
702                         base_penalty_msat: 0,
703                         base_penalty_amount_multiplier_msat: 0,
704                         liquidity_penalty_multiplier_msat: 0,
705                         liquidity_penalty_amount_multiplier_msat: 0,
706                         historical_liquidity_penalty_multiplier_msat: 0,
707                         historical_liquidity_penalty_amount_multiplier_msat: 0,
708                         manual_node_penalties: HashMap::new(),
709                         anti_probing_penalty_msat: 0,
710                         considered_impossible_penalty_msat: 0,
711                         linear_success_probability: true,
712                 }
713         }
714 }
715
716 /// Parameters for configuring [`ProbabilisticScorer`].
717 ///
718 /// Used to configure decay parameters that are static throughout the lifetime of the scorer.
719 /// these decay parameters affect the score of the channel penalty and are not changed on a
720 /// per-route penalty cost call.
721 #[derive(Copy, Clone)]
722 pub struct ProbabilisticScoringDecayParameters {
723         /// If we aren't learning any new datapoints for a channel, the historical liquidity bounds
724         /// tracking can simply live on with increasingly stale data. Instead, when a channel has not
725         /// seen a liquidity estimate update for this amount of time, the historical datapoints are
726         /// decayed by half.
727         /// For an example of historical_no_updates_half_life being used see [`historical_estimated_channel_liquidity_probabilities`]
728         ///
729         /// Note that after 16 or more half lives all historical data will be completely gone.
730         ///
731         /// Default value: 14 days
732         ///
733         /// [`historical_estimated_channel_liquidity_probabilities`]: ProbabilisticScorer::historical_estimated_channel_liquidity_probabilities
734         pub historical_no_updates_half_life: Duration,
735
736         /// Whenever this amount of time elapses since the last update to a channel's liquidity bounds,
737         /// the distance from the bounds to "zero" is cut in half. In other words, the lower-bound on
738         /// the available liquidity is halved and the upper-bound moves half-way to the channel's total
739         /// capacity.
740         ///
741         /// Because halving the liquidity bounds grows the uncertainty on the channel's liquidity,
742         /// the penalty for an amount within the new bounds may change. See the [`ProbabilisticScorer`]
743         /// struct documentation for more info on the way the liquidity bounds are used.
744         ///
745         /// For example, if the channel's capacity is 1 million sats, and the current upper and lower
746         /// liquidity bounds are 200,000 sats and 600,000 sats, after this amount of time the upper
747         /// and lower liquidity bounds will be decayed to 100,000 and 800,000 sats.
748         ///
749         /// Default value: 6 hours
750         ///
751         /// # Note
752         ///
753         /// When built with the `no-std` feature, time will never elapse. Therefore, the channel
754         /// liquidity knowledge will never decay except when the bounds cross.
755         pub liquidity_offset_half_life: Duration,
756 }
757
758 impl Default for ProbabilisticScoringDecayParameters {
759         fn default() -> Self {
760                 Self {
761                         liquidity_offset_half_life: Duration::from_secs(6 * 60 * 60),
762                         historical_no_updates_half_life: Duration::from_secs(60 * 60 * 24 * 14),
763                 }
764         }
765 }
766
767 #[cfg(test)]
768 impl ProbabilisticScoringDecayParameters {
769         fn zero_penalty() -> Self {
770                 Self {
771                         liquidity_offset_half_life: Duration::from_secs(6 * 60 * 60),
772                         historical_no_updates_half_life: Duration::from_secs(60 * 60 * 24 * 14),
773                 }
774         }
775 }
776
777 /// Accounting for channel liquidity balance uncertainty.
778 ///
779 /// Direction is defined in terms of [`NodeId`] partial ordering, where the source node is the
780 /// first node in the ordering of the channel's counterparties. Thus, swapping the two liquidity
781 /// offset fields gives the opposite direction.
782 struct ChannelLiquidity {
783         /// Lower channel liquidity bound in terms of an offset from zero.
784         min_liquidity_offset_msat: u64,
785
786         /// Upper channel liquidity bound in terms of an offset from the effective capacity.
787         max_liquidity_offset_msat: u64,
788
789         min_liquidity_offset_history: HistoricalBucketRangeTracker,
790         max_liquidity_offset_history: HistoricalBucketRangeTracker,
791
792         /// Time when either liquidity bound was last modified as an offset since the unix epoch.
793         last_updated: Duration,
794
795         /// Time when the historical liquidity bounds were last modified as an offset against the unix
796         /// epoch.
797         offset_history_last_updated: Duration,
798 }
799
800 /// A snapshot of [`ChannelLiquidity`] in one direction assuming a certain channel capacity.
801 struct DirectedChannelLiquidity<L: Deref<Target = u64>, BRT: Deref<Target = HistoricalBucketRangeTracker>, T: Deref<Target = Duration>> {
802         min_liquidity_offset_msat: L,
803         max_liquidity_offset_msat: L,
804         liquidity_history: HistoricalMinMaxBuckets<BRT>,
805         capacity_msat: u64,
806         last_updated: T,
807         offset_history_last_updated: T,
808 }
809
810 impl<G: Deref<Target = NetworkGraph<L>>, L: Deref> ProbabilisticScorer<G, L> where L::Target: Logger {
811         /// Creates a new scorer using the given scoring parameters for sending payments from a node
812         /// through a network graph.
813         pub fn new(decay_params: ProbabilisticScoringDecayParameters, network_graph: G, logger: L) -> Self {
814                 Self {
815                         decay_params,
816                         network_graph,
817                         logger,
818                         channel_liquidities: HashMap::new(),
819                 }
820         }
821
822         #[cfg(test)]
823         fn with_channel(mut self, short_channel_id: u64, liquidity: ChannelLiquidity) -> Self {
824                 assert!(self.channel_liquidities.insert(short_channel_id, liquidity).is_none());
825                 self
826         }
827
828         /// Dump the contents of this scorer into the configured logger.
829         ///
830         /// Note that this writes roughly one line per channel for which we have a liquidity estimate,
831         /// which may be a substantial amount of log output.
832         pub fn debug_log_liquidity_stats(&self) {
833                 let graph = self.network_graph.read_only();
834                 for (scid, liq) in self.channel_liquidities.iter() {
835                         if let Some(chan_debug) = graph.channels().get(scid) {
836                                 let log_direction = |source, target| {
837                                         if let Some((directed_info, _)) = chan_debug.as_directed_to(target) {
838                                                 let amt = directed_info.effective_capacity().as_msat();
839                                                 let dir_liq = liq.as_directed(source, target, amt);
840
841                                                 let min_buckets = &dir_liq.liquidity_history.min_liquidity_offset_history.buckets;
842                                                 let max_buckets = &dir_liq.liquidity_history.max_liquidity_offset_history.buckets;
843
844                                                 log_debug!(self.logger, core::concat!(
845                                                         "Liquidity from {} to {} via {} is in the range ({}, {}).\n",
846                                                         "\tHistorical min liquidity bucket relative probabilities:\n",
847                                                         "\t\t{} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}\n",
848                                                         "\tHistorical max liquidity bucket relative probabilities:\n",
849                                                         "\t\t{} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}"),
850                                                         source, target, scid, dir_liq.min_liquidity_msat(), dir_liq.max_liquidity_msat(),
851                                                         min_buckets[ 0], min_buckets[ 1], min_buckets[ 2], min_buckets[ 3],
852                                                         min_buckets[ 4], min_buckets[ 5], min_buckets[ 6], min_buckets[ 7],
853                                                         min_buckets[ 8], min_buckets[ 9], min_buckets[10], min_buckets[11],
854                                                         min_buckets[12], min_buckets[13], min_buckets[14], min_buckets[15],
855                                                         min_buckets[16], min_buckets[17], min_buckets[18], min_buckets[19],
856                                                         min_buckets[20], min_buckets[21], min_buckets[22], min_buckets[23],
857                                                         min_buckets[24], min_buckets[25], min_buckets[26], min_buckets[27],
858                                                         min_buckets[28], min_buckets[29], min_buckets[30], min_buckets[31],
859                                                         // Note that the liquidity buckets are an offset from the edge, so we
860                                                         // inverse the max order to get the probabilities from zero.
861                                                         max_buckets[31], max_buckets[30], max_buckets[29], max_buckets[28],
862                                                         max_buckets[27], max_buckets[26], max_buckets[25], max_buckets[24],
863                                                         max_buckets[23], max_buckets[22], max_buckets[21], max_buckets[20],
864                                                         max_buckets[19], max_buckets[18], max_buckets[17], max_buckets[16],
865                                                         max_buckets[15], max_buckets[14], max_buckets[13], max_buckets[12],
866                                                         max_buckets[11], max_buckets[10], max_buckets[ 9], max_buckets[ 8],
867                                                         max_buckets[ 7], max_buckets[ 6], max_buckets[ 5], max_buckets[ 4],
868                                                         max_buckets[ 3], max_buckets[ 2], max_buckets[ 1], max_buckets[ 0]);
869                                         } else {
870                                                 log_debug!(self.logger, "No amount known for SCID {} from {:?} to {:?}", scid, source, target);
871                                         }
872                                 };
873
874                                 log_direction(&chan_debug.node_one, &chan_debug.node_two);
875                                 log_direction(&chan_debug.node_two, &chan_debug.node_one);
876                         } else {
877                                 log_debug!(self.logger, "No network graph entry for SCID {}", scid);
878                         }
879                 }
880         }
881
882         /// Query the estimated minimum and maximum liquidity available for sending a payment over the
883         /// channel with `scid` towards the given `target` node.
884         pub fn estimated_channel_liquidity_range(&self, scid: u64, target: &NodeId) -> Option<(u64, u64)> {
885                 let graph = self.network_graph.read_only();
886
887                 if let Some(chan) = graph.channels().get(&scid) {
888                         if let Some(liq) = self.channel_liquidities.get(&scid) {
889                                 if let Some((directed_info, source)) = chan.as_directed_to(target) {
890                                         let amt = directed_info.effective_capacity().as_msat();
891                                         let dir_liq = liq.as_directed(source, target, amt);
892                                         return Some((dir_liq.min_liquidity_msat(), dir_liq.max_liquidity_msat()));
893                                 }
894                         }
895                 }
896                 None
897         }
898
899         /// Query the historical estimated minimum and maximum liquidity available for sending a
900         /// payment over the channel with `scid` towards the given `target` node.
901         ///
902         /// Returns two sets of 32 buckets. The first set describes the lower-bound liquidity history,
903         /// the second set describes the upper-bound liquidity history. Each bucket describes the
904         /// relative frequency at which we've seen a liquidity bound in the bucket's range relative to
905         /// the channel's total capacity, on an arbitrary scale. Because the values are slowly decayed,
906         /// more recent data points are weighted more heavily than older datapoints.
907         ///
908         /// Note that the range of each bucket varies by its location to provide more granular results
909         /// at the edges of a channel's capacity, where it is more likely to sit.
910         ///
911         /// When scoring, the estimated probability that an upper-/lower-bound lies in a given bucket
912         /// is calculated by dividing that bucket's value with the total value of all buckets.
913         ///
914         /// For example, using a lower bucket count for illustrative purposes, a value of
915         /// `[0, 0, 0, ..., 0, 32]` indicates that we believe the probability of a bound being very
916         /// close to the channel's capacity to be 100%, and have never (recently) seen it in any other
917         /// bucket. A value of `[31, 0, 0, ..., 0, 0, 32]` indicates we've seen the bound being both
918         /// in the top and bottom bucket, and roughly with similar (recent) frequency.
919         ///
920         /// Because the datapoints are decayed slowly over time, values will eventually return to
921         /// `Some(([0; 32], [0; 32]))` or `None` if no data remains for a channel.
922         ///
923         /// In order to fetch a single success probability from the buckets provided here, as used in
924         /// the scoring model, see [`Self::historical_estimated_payment_success_probability`].
925         pub fn historical_estimated_channel_liquidity_probabilities(&self, scid: u64, target: &NodeId)
926         -> Option<([u16; 32], [u16; 32])> {
927                 let graph = self.network_graph.read_only();
928
929                 if let Some(chan) = graph.channels().get(&scid) {
930                         if let Some(liq) = self.channel_liquidities.get(&scid) {
931                                 if let Some((directed_info, source)) = chan.as_directed_to(target) {
932                                         let amt = directed_info.effective_capacity().as_msat();
933                                         let dir_liq = liq.as_directed(source, target, amt);
934
935                                         let min_buckets = dir_liq.liquidity_history.min_liquidity_offset_history.buckets;
936                                         let mut max_buckets = dir_liq.liquidity_history.max_liquidity_offset_history.buckets;
937
938                                         // Note that the liquidity buckets are an offset from the edge, so we inverse
939                                         // the max order to get the probabilities from zero.
940                                         max_buckets.reverse();
941                                         return Some((min_buckets, max_buckets));
942                                 }
943                         }
944                 }
945                 None
946         }
947
948         /// Query the probability of payment success sending the given `amount_msat` over the channel
949         /// with `scid` towards the given `target` node, based on the historical estimated liquidity
950         /// bounds.
951         ///
952         /// These are the same bounds as returned by
953         /// [`Self::historical_estimated_channel_liquidity_probabilities`] (but not those returned by
954         /// [`Self::estimated_channel_liquidity_range`]).
955         pub fn historical_estimated_payment_success_probability(
956                 &self, scid: u64, target: &NodeId, amount_msat: u64, params: &ProbabilisticScoringFeeParameters)
957         -> Option<f64> {
958                 let graph = self.network_graph.read_only();
959
960                 if let Some(chan) = graph.channels().get(&scid) {
961                         if let Some(liq) = self.channel_liquidities.get(&scid) {
962                                 if let Some((directed_info, source)) = chan.as_directed_to(target) {
963                                         let capacity_msat = directed_info.effective_capacity().as_msat();
964                                         let dir_liq = liq.as_directed(source, target, capacity_msat);
965
966                                         return dir_liq.liquidity_history.calculate_success_probability_times_billion(
967                                                 &params, amount_msat, capacity_msat
968                                         ).map(|p| p as f64 / (1024 * 1024 * 1024) as f64);
969                                 }
970                         }
971                 }
972                 None
973         }
974 }
975
976 impl ChannelLiquidity {
977         fn new(last_updated: Duration) -> Self {
978                 Self {
979                         min_liquidity_offset_msat: 0,
980                         max_liquidity_offset_msat: 0,
981                         min_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
982                         max_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
983                         last_updated,
984                         offset_history_last_updated: last_updated,
985                 }
986         }
987
988         /// Returns a view of the channel liquidity directed from `source` to `target` assuming
989         /// `capacity_msat`.
990         fn as_directed(
991                 &self, source: &NodeId, target: &NodeId, capacity_msat: u64,
992         ) -> DirectedChannelLiquidity<&u64, &HistoricalBucketRangeTracker, &Duration> {
993                 let (min_liquidity_offset_msat, max_liquidity_offset_msat, min_liquidity_offset_history, max_liquidity_offset_history) =
994                         if source < target {
995                                 (&self.min_liquidity_offset_msat, &self.max_liquidity_offset_msat,
996                                         &self.min_liquidity_offset_history, &self.max_liquidity_offset_history)
997                         } else {
998                                 (&self.max_liquidity_offset_msat, &self.min_liquidity_offset_msat,
999                                         &self.max_liquidity_offset_history, &self.min_liquidity_offset_history)
1000                         };
1001
1002                 DirectedChannelLiquidity {
1003                         min_liquidity_offset_msat,
1004                         max_liquidity_offset_msat,
1005                         liquidity_history: HistoricalMinMaxBuckets {
1006                                 min_liquidity_offset_history,
1007                                 max_liquidity_offset_history,
1008                         },
1009                         capacity_msat,
1010                         last_updated: &self.last_updated,
1011                         offset_history_last_updated: &self.offset_history_last_updated,
1012                 }
1013         }
1014
1015         /// Returns a mutable view of the channel liquidity directed from `source` to `target` assuming
1016         /// `capacity_msat`.
1017         fn as_directed_mut(
1018                 &mut self, source: &NodeId, target: &NodeId, capacity_msat: u64,
1019         ) -> DirectedChannelLiquidity<&mut u64, &mut HistoricalBucketRangeTracker, &mut Duration> {
1020                 let (min_liquidity_offset_msat, max_liquidity_offset_msat, min_liquidity_offset_history, max_liquidity_offset_history) =
1021                         if source < target {
1022                                 (&mut self.min_liquidity_offset_msat, &mut self.max_liquidity_offset_msat,
1023                                         &mut self.min_liquidity_offset_history, &mut self.max_liquidity_offset_history)
1024                         } else {
1025                                 (&mut self.max_liquidity_offset_msat, &mut self.min_liquidity_offset_msat,
1026                                         &mut self.max_liquidity_offset_history, &mut self.min_liquidity_offset_history)
1027                         };
1028
1029                 DirectedChannelLiquidity {
1030                         min_liquidity_offset_msat,
1031                         max_liquidity_offset_msat,
1032                         liquidity_history: HistoricalMinMaxBuckets {
1033                                 min_liquidity_offset_history,
1034                                 max_liquidity_offset_history,
1035                         },
1036                         capacity_msat,
1037                         last_updated: &mut self.last_updated,
1038                         offset_history_last_updated: &mut self.offset_history_last_updated,
1039                 }
1040         }
1041
1042         fn decayed_offset(
1043                 &self, offset: u64, duration_since_epoch: Duration,
1044                 decay_params: ProbabilisticScoringDecayParameters,
1045         ) -> u64 {
1046                 let half_life = decay_params.liquidity_offset_half_life.as_secs_f64();
1047                 if half_life != 0.0 {
1048                         let elapsed_time = duration_since_epoch.saturating_sub(self.last_updated).as_secs_f64();
1049                         ((offset as f64) * powf64(0.5, elapsed_time / half_life)) as u64
1050                 } else {
1051                         0
1052                 }
1053         }
1054 }
1055
1056 /// Bounds `-log10` to avoid excessive liquidity penalties for payments with low success
1057 /// probabilities.
1058 const NEGATIVE_LOG10_UPPER_BOUND: u64 = 2;
1059
1060 /// The rough cutoff at which our precision falls off and we should stop bothering to try to log a
1061 /// ratio, as X in 1/X.
1062 const PRECISION_LOWER_BOUND_DENOMINATOR: u64 = approx::LOWER_BITS_BOUND;
1063
1064 /// The divisor used when computing the amount penalty.
1065 const AMOUNT_PENALTY_DIVISOR: u64 = 1 << 20;
1066 const BASE_AMOUNT_PENALTY_DIVISOR: u64 = 1 << 30;
1067
1068 /// Raises three `f64`s to the 3rd power, without `powi` because it requires `std` (dunno why).
1069 #[inline(always)]
1070 fn three_f64_pow_3(a: f64, b: f64, c: f64) -> (f64, f64, f64) {
1071         (a * a * a, b * b * b, c * c * c)
1072 }
1073
1074 /// Given liquidity bounds, calculates the success probability (in the form of a numerator and
1075 /// denominator) of an HTLC. This is a key assumption in our scoring models.
1076 ///
1077 /// Must not return a numerator or denominator greater than 2^31 for arguments less than 2^31.
1078 ///
1079 /// min_zero_implies_no_successes signals that a `min_liquidity_msat` of 0 means we've not
1080 /// (recently) seen an HTLC successfully complete over this channel.
1081 #[inline(always)]
1082 fn success_probability(
1083         amount_msat: u64, min_liquidity_msat: u64, max_liquidity_msat: u64, capacity_msat: u64,
1084         params: &ProbabilisticScoringFeeParameters, min_zero_implies_no_successes: bool,
1085 ) -> (u64, u64) {
1086         debug_assert!(min_liquidity_msat <= amount_msat);
1087         debug_assert!(amount_msat < max_liquidity_msat);
1088         debug_assert!(max_liquidity_msat <= capacity_msat);
1089
1090         let (numerator, mut denominator) =
1091                 if params.linear_success_probability {
1092                         (max_liquidity_msat - amount_msat,
1093                                 (max_liquidity_msat - min_liquidity_msat).saturating_add(1))
1094                 } else {
1095                         let capacity = capacity_msat as f64;
1096                         let min = (min_liquidity_msat as f64) / capacity;
1097                         let max = (max_liquidity_msat as f64) / capacity;
1098                         let amount = (amount_msat as f64) / capacity;
1099
1100                         // Assume the channel has a probability density function of (x - 0.5)^2 for values from
1101                         // 0 to 1 (where 1 is the channel's full capacity). The success probability given some
1102                         // liquidity bounds is thus the integral under the curve from the amount to maximum
1103                         // estimated liquidity, divided by the same integral from the minimum to the maximum
1104                         // estimated liquidity bounds.
1105                         //
1106                         // Because the integral from x to y is simply (y - 0.5)^3 - (x - 0.5)^3, we can
1107                         // calculate the cumulative density function between the min/max bounds trivially. Note
1108                         // that we don't bother to normalize the CDF to total to 1, as it will come out in the
1109                         // division of num / den.
1110                         let (max_pow, amt_pow, min_pow) = three_f64_pow_3(max - 0.5, amount - 0.5, min - 0.5);
1111                         let num = max_pow - amt_pow;
1112                         let den = max_pow - min_pow;
1113
1114                         // Because our numerator and denominator max out at 0.5^3 we need to multiply them by
1115                         // quite a large factor to get something useful (ideally in the 2^30 range).
1116                         const BILLIONISH: f64 = 1024.0 * 1024.0 * 1024.0;
1117                         let numerator = (num * BILLIONISH) as u64 + 1;
1118                         let denominator = (den * BILLIONISH) as u64 + 1;
1119                         debug_assert!(numerator <= 1 << 30, "Got large numerator ({}) from float {}.", numerator, num);
1120                         debug_assert!(denominator <= 1 << 30, "Got large denominator ({}) from float {}.", denominator, den);
1121                         (numerator, denominator)
1122                 };
1123
1124         if min_zero_implies_no_successes && min_liquidity_msat == 0 &&
1125                 denominator < u64::max_value() / 21
1126         {
1127                 // If we have no knowledge of the channel, scale probability down by ~75%
1128                 // Note that we prefer to increase the denominator rather than decrease the numerator as
1129                 // the denominator is more likely to be larger and thus provide greater precision. This is
1130                 // mostly an overoptimization but makes a large difference in tests.
1131                 denominator = denominator * 21 / 16
1132         }
1133
1134         (numerator, denominator)
1135 }
1136
1137 impl<L: Deref<Target = u64>, BRT: Deref<Target = HistoricalBucketRangeTracker>, T: Deref<Target = Duration>>
1138 DirectedChannelLiquidity< L, BRT, T> {
1139         /// Returns a liquidity penalty for routing the given HTLC `amount_msat` through the channel in
1140         /// this direction.
1141         fn penalty_msat(&self, amount_msat: u64, score_params: &ProbabilisticScoringFeeParameters) -> u64 {
1142                 let available_capacity = self.capacity_msat;
1143                 let max_liquidity_msat = self.max_liquidity_msat();
1144                 let min_liquidity_msat = core::cmp::min(self.min_liquidity_msat(), max_liquidity_msat);
1145
1146                 let mut res = if amount_msat <= min_liquidity_msat {
1147                         0
1148                 } else if amount_msat >= max_liquidity_msat {
1149                         // Equivalent to hitting the else clause below with the amount equal to the effective
1150                         // capacity and without any certainty on the liquidity upper bound, plus the
1151                         // impossibility penalty.
1152                         let negative_log10_times_2048 = NEGATIVE_LOG10_UPPER_BOUND * 2048;
1153                         Self::combined_penalty_msat(amount_msat, negative_log10_times_2048,
1154                                         score_params.liquidity_penalty_multiplier_msat,
1155                                         score_params.liquidity_penalty_amount_multiplier_msat)
1156                                 .saturating_add(score_params.considered_impossible_penalty_msat)
1157                 } else {
1158                         let (numerator, denominator) = success_probability(amount_msat,
1159                                 min_liquidity_msat, max_liquidity_msat, available_capacity, score_params, false);
1160                         if denominator - numerator < denominator / PRECISION_LOWER_BOUND_DENOMINATOR {
1161                                 // If the failure probability is < 1.5625% (as 1 - numerator/denominator < 1/64),
1162                                 // don't bother trying to use the log approximation as it gets too noisy to be
1163                                 // particularly helpful, instead just round down to 0.
1164                                 0
1165                         } else {
1166                                 let negative_log10_times_2048 =
1167                                         approx::negative_log10_times_2048(numerator, denominator);
1168                                 Self::combined_penalty_msat(amount_msat, negative_log10_times_2048,
1169                                         score_params.liquidity_penalty_multiplier_msat,
1170                                         score_params.liquidity_penalty_amount_multiplier_msat)
1171                         }
1172                 };
1173
1174                 if amount_msat >= available_capacity {
1175                         // We're trying to send more than the capacity, use a max penalty.
1176                         res = res.saturating_add(Self::combined_penalty_msat(amount_msat,
1177                                 NEGATIVE_LOG10_UPPER_BOUND * 2048,
1178                                 score_params.historical_liquidity_penalty_multiplier_msat,
1179                                 score_params.historical_liquidity_penalty_amount_multiplier_msat));
1180                         return res;
1181                 }
1182
1183                 if score_params.historical_liquidity_penalty_multiplier_msat != 0 ||
1184                    score_params.historical_liquidity_penalty_amount_multiplier_msat != 0 {
1185                         if let Some(cumulative_success_prob_times_billion) = self.liquidity_history
1186                                 .calculate_success_probability_times_billion(
1187                                         score_params, amount_msat, self.capacity_msat)
1188                         {
1189                                 let historical_negative_log10_times_2048 = approx::negative_log10_times_2048(cumulative_success_prob_times_billion + 1, 1024 * 1024 * 1024);
1190                                 res = res.saturating_add(Self::combined_penalty_msat(amount_msat,
1191                                         historical_negative_log10_times_2048, score_params.historical_liquidity_penalty_multiplier_msat,
1192                                         score_params.historical_liquidity_penalty_amount_multiplier_msat));
1193                         } else {
1194                                 // If we don't have any valid points (or, once decayed, we have less than a full
1195                                 // point), redo the non-historical calculation with no liquidity bounds tracked and
1196                                 // the historical penalty multipliers.
1197                                 let (numerator, denominator) = success_probability(amount_msat, 0,
1198                                         available_capacity, available_capacity, score_params, true);
1199                                 let negative_log10_times_2048 =
1200                                         approx::negative_log10_times_2048(numerator, denominator);
1201                                 res = res.saturating_add(Self::combined_penalty_msat(amount_msat, negative_log10_times_2048,
1202                                         score_params.historical_liquidity_penalty_multiplier_msat,
1203                                         score_params.historical_liquidity_penalty_amount_multiplier_msat));
1204                         }
1205                 }
1206
1207                 res
1208         }
1209
1210         /// Computes the liquidity penalty from the penalty multipliers.
1211         #[inline(always)]
1212         fn combined_penalty_msat(amount_msat: u64, mut negative_log10_times_2048: u64,
1213                 liquidity_penalty_multiplier_msat: u64, liquidity_penalty_amount_multiplier_msat: u64,
1214         ) -> u64 {
1215                 negative_log10_times_2048 =
1216                         negative_log10_times_2048.min(NEGATIVE_LOG10_UPPER_BOUND * 2048);
1217
1218                 // Upper bound the liquidity penalty to ensure some channel is selected.
1219                 let liquidity_penalty_msat = negative_log10_times_2048
1220                         .saturating_mul(liquidity_penalty_multiplier_msat) / 2048;
1221                 let amount_penalty_msat = negative_log10_times_2048
1222                         .saturating_mul(liquidity_penalty_amount_multiplier_msat)
1223                         .saturating_mul(amount_msat) / 2048 / AMOUNT_PENALTY_DIVISOR;
1224
1225                 liquidity_penalty_msat.saturating_add(amount_penalty_msat)
1226         }
1227
1228         /// Returns the lower bound of the channel liquidity balance in this direction.
1229         #[inline(always)]
1230         fn min_liquidity_msat(&self) -> u64 {
1231                 *self.min_liquidity_offset_msat
1232         }
1233
1234         /// Returns the upper bound of the channel liquidity balance in this direction.
1235         #[inline(always)]
1236         fn max_liquidity_msat(&self) -> u64 {
1237                 self.capacity_msat
1238                         .saturating_sub(*self.max_liquidity_offset_msat)
1239         }
1240 }
1241
1242 impl<L: DerefMut<Target = u64>, BRT: DerefMut<Target = HistoricalBucketRangeTracker>, T: DerefMut<Target = Duration>>
1243 DirectedChannelLiquidity<L, BRT, T> {
1244         /// Adjusts the channel liquidity balance bounds when failing to route `amount_msat`.
1245         fn failed_at_channel<Log: Deref>(
1246                 &mut self, amount_msat: u64, duration_since_epoch: Duration, chan_descr: fmt::Arguments, logger: &Log
1247         ) where Log::Target: Logger {
1248                 let existing_max_msat = self.max_liquidity_msat();
1249                 if amount_msat < existing_max_msat {
1250                         log_debug!(logger, "Setting max liquidity of {} from {} to {}", chan_descr, existing_max_msat, amount_msat);
1251                         self.set_max_liquidity_msat(amount_msat, duration_since_epoch);
1252                 } else {
1253                         log_trace!(logger, "Max liquidity of {} is {} (already less than or equal to {})",
1254                                 chan_descr, existing_max_msat, amount_msat);
1255                 }
1256                 self.update_history_buckets(0, duration_since_epoch);
1257         }
1258
1259         /// Adjusts the channel liquidity balance bounds when failing to route `amount_msat` downstream.
1260         fn failed_downstream<Log: Deref>(
1261                 &mut self, amount_msat: u64, duration_since_epoch: Duration, chan_descr: fmt::Arguments, logger: &Log
1262         ) where Log::Target: Logger {
1263                 let existing_min_msat = self.min_liquidity_msat();
1264                 if amount_msat > existing_min_msat {
1265                         log_debug!(logger, "Setting min liquidity of {} from {} to {}", existing_min_msat, chan_descr, amount_msat);
1266                         self.set_min_liquidity_msat(amount_msat, duration_since_epoch);
1267                 } else {
1268                         log_trace!(logger, "Min liquidity of {} is {} (already greater than or equal to {})",
1269                                 chan_descr, existing_min_msat, amount_msat);
1270                 }
1271                 self.update_history_buckets(0, duration_since_epoch);
1272         }
1273
1274         /// Adjusts the channel liquidity balance bounds when successfully routing `amount_msat`.
1275         fn successful<Log: Deref>(&mut self,
1276                 amount_msat: u64, duration_since_epoch: Duration, chan_descr: fmt::Arguments, logger: &Log
1277         ) where Log::Target: Logger {
1278                 let max_liquidity_msat = self.max_liquidity_msat().checked_sub(amount_msat).unwrap_or(0);
1279                 log_debug!(logger, "Subtracting {} from max liquidity of {} (setting it to {})", amount_msat, chan_descr, max_liquidity_msat);
1280                 self.set_max_liquidity_msat(max_liquidity_msat, duration_since_epoch);
1281                 self.update_history_buckets(amount_msat, duration_since_epoch);
1282         }
1283
1284         /// Updates the history buckets for this channel. Because the history buckets track what we now
1285         /// know about the channel's state *prior to our payment* (i.e. what we assume is "steady
1286         /// state"), we allow the caller to set an offset applied to our liquidity bounds which
1287         /// represents the amount of the successful payment we just made.
1288         fn update_history_buckets(&mut self, bucket_offset_msat: u64, duration_since_epoch: Duration) {
1289                 self.liquidity_history.min_liquidity_offset_history.track_datapoint(
1290                         *self.min_liquidity_offset_msat + bucket_offset_msat, self.capacity_msat
1291                 );
1292                 self.liquidity_history.max_liquidity_offset_history.track_datapoint(
1293                         self.max_liquidity_offset_msat.saturating_sub(bucket_offset_msat), self.capacity_msat
1294                 );
1295                 *self.offset_history_last_updated = duration_since_epoch;
1296         }
1297
1298         /// Adjusts the lower bound of the channel liquidity balance in this direction.
1299         fn set_min_liquidity_msat(&mut self, amount_msat: u64, duration_since_epoch: Duration) {
1300                 *self.min_liquidity_offset_msat = amount_msat;
1301                 if amount_msat > self.max_liquidity_msat() {
1302                         *self.max_liquidity_offset_msat = 0;
1303                 }
1304                 *self.last_updated = duration_since_epoch;
1305         }
1306
1307         /// Adjusts the upper bound of the channel liquidity balance in this direction.
1308         fn set_max_liquidity_msat(&mut self, amount_msat: u64, duration_since_epoch: Duration) {
1309                 *self.max_liquidity_offset_msat = self.capacity_msat.checked_sub(amount_msat).unwrap_or(0);
1310                 if amount_msat < *self.min_liquidity_offset_msat {
1311                         *self.min_liquidity_offset_msat = 0;
1312                 }
1313                 *self.last_updated = duration_since_epoch;
1314         }
1315 }
1316
1317 impl<G: Deref<Target = NetworkGraph<L>>, L: Deref> ScoreLookUp for ProbabilisticScorer<G, L> where L::Target: Logger {
1318         type ScoreParams = ProbabilisticScoringFeeParameters;
1319         fn channel_penalty_msat(
1320                 &self, candidate: &CandidateRouteHop, usage: ChannelUsage, score_params: &ProbabilisticScoringFeeParameters
1321         ) -> u64 {
1322                 let (scid, target) = match candidate {
1323                         CandidateRouteHop::PublicHop { info, short_channel_id } => {
1324                                 (short_channel_id, info.target())
1325                         },
1326                         _ => return 0,
1327                 };
1328                 let source = candidate.source();
1329                 if let Some(penalty) = score_params.manual_node_penalties.get(&target) {
1330                         return *penalty;
1331                 }
1332
1333                 let base_penalty_msat = score_params.base_penalty_msat.saturating_add(
1334                         score_params.base_penalty_amount_multiplier_msat
1335                                 .saturating_mul(usage.amount_msat) / BASE_AMOUNT_PENALTY_DIVISOR);
1336
1337                 let mut anti_probing_penalty_msat = 0;
1338                 match usage.effective_capacity {
1339                         EffectiveCapacity::ExactLiquidity { liquidity_msat: amount_msat } |
1340                                 EffectiveCapacity::HintMaxHTLC { amount_msat } =>
1341                         {
1342                                 if usage.amount_msat > amount_msat {
1343                                         return u64::max_value();
1344                                 } else {
1345                                         return base_penalty_msat;
1346                                 }
1347                         },
1348                         EffectiveCapacity::Total { capacity_msat, htlc_maximum_msat } => {
1349                                 if htlc_maximum_msat >= capacity_msat/2 {
1350                                         anti_probing_penalty_msat = score_params.anti_probing_penalty_msat;
1351                                 }
1352                         },
1353                         _ => {},
1354                 }
1355
1356                 let amount_msat = usage.amount_msat.saturating_add(usage.inflight_htlc_msat);
1357                 let capacity_msat = usage.effective_capacity.as_msat();
1358                 self.channel_liquidities
1359                         .get(&scid)
1360                         .unwrap_or(&ChannelLiquidity::new(Duration::ZERO))
1361                         .as_directed(&source, &target, capacity_msat)
1362                         .penalty_msat(amount_msat, score_params)
1363                         .saturating_add(anti_probing_penalty_msat)
1364                         .saturating_add(base_penalty_msat)
1365         }
1366 }
1367
1368 impl<G: Deref<Target = NetworkGraph<L>>, L: Deref> ScoreUpdate for ProbabilisticScorer<G, L> where L::Target: Logger {
1369         fn payment_path_failed(&mut self, path: &Path, short_channel_id: u64, duration_since_epoch: Duration) {
1370                 let amount_msat = path.final_value_msat();
1371                 log_trace!(self.logger, "Scoring path through to SCID {} as having failed at {} msat", short_channel_id, amount_msat);
1372                 let network_graph = self.network_graph.read_only();
1373                 for (hop_idx, hop) in path.hops.iter().enumerate() {
1374                         let target = NodeId::from_pubkey(&hop.pubkey);
1375                         let channel_directed_from_source = network_graph.channels()
1376                                 .get(&hop.short_channel_id)
1377                                 .and_then(|channel| channel.as_directed_to(&target));
1378
1379                         let at_failed_channel = hop.short_channel_id == short_channel_id;
1380                         if at_failed_channel && hop_idx == 0 {
1381                                 log_warn!(self.logger, "Payment failed at the first hop - we do not attempt to learn channel info in such cases as we can directly observe local state.\n\tBecause we know the local state, we should generally not see failures here - this may be an indication that your channel peer on channel {} is broken and you may wish to close the channel.", hop.short_channel_id);
1382                         }
1383
1384                         // Only score announced channels.
1385                         if let Some((channel, source)) = channel_directed_from_source {
1386                                 let capacity_msat = channel.effective_capacity().as_msat();
1387                                 if at_failed_channel {
1388                                         self.channel_liquidities
1389                                                 .entry(hop.short_channel_id)
1390                                                 .or_insert_with(|| ChannelLiquidity::new(duration_since_epoch))
1391                                                 .as_directed_mut(source, &target, capacity_msat)
1392                                                 .failed_at_channel(amount_msat, duration_since_epoch,
1393                                                         format_args!("SCID {}, towards {:?}", hop.short_channel_id, target), &self.logger);
1394                                 } else {
1395                                         self.channel_liquidities
1396                                                 .entry(hop.short_channel_id)
1397                                                 .or_insert_with(|| ChannelLiquidity::new(duration_since_epoch))
1398                                                 .as_directed_mut(source, &target, capacity_msat)
1399                                                 .failed_downstream(amount_msat, duration_since_epoch,
1400                                                         format_args!("SCID {}, towards {:?}", hop.short_channel_id, target), &self.logger);
1401                                 }
1402                         } else {
1403                                 log_debug!(self.logger, "Not able to penalize channel with SCID {} as we do not have graph info for it (likely a route-hint last-hop).",
1404                                         hop.short_channel_id);
1405                         }
1406                         if at_failed_channel { break; }
1407                 }
1408         }
1409
1410         fn payment_path_successful(&mut self, path: &Path, duration_since_epoch: Duration) {
1411                 let amount_msat = path.final_value_msat();
1412                 log_trace!(self.logger, "Scoring path through SCID {} as having succeeded at {} msat.",
1413                         path.hops.split_last().map(|(hop, _)| hop.short_channel_id).unwrap_or(0), amount_msat);
1414                 let network_graph = self.network_graph.read_only();
1415                 for hop in &path.hops {
1416                         let target = NodeId::from_pubkey(&hop.pubkey);
1417                         let channel_directed_from_source = network_graph.channels()
1418                                 .get(&hop.short_channel_id)
1419                                 .and_then(|channel| channel.as_directed_to(&target));
1420
1421                         // Only score announced channels.
1422                         if let Some((channel, source)) = channel_directed_from_source {
1423                                 let capacity_msat = channel.effective_capacity().as_msat();
1424                                 self.channel_liquidities
1425                                         .entry(hop.short_channel_id)
1426                                         .or_insert_with(|| ChannelLiquidity::new(duration_since_epoch))
1427                                         .as_directed_mut(source, &target, capacity_msat)
1428                                         .successful(amount_msat, duration_since_epoch,
1429                                                 format_args!("SCID {}, towards {:?}", hop.short_channel_id, target), &self.logger);
1430                         } else {
1431                                 log_debug!(self.logger, "Not able to learn for channel with SCID {} as we do not have graph info for it (likely a route-hint last-hop).",
1432                                         hop.short_channel_id);
1433                         }
1434                 }
1435         }
1436
1437         fn probe_failed(&mut self, path: &Path, short_channel_id: u64, duration_since_epoch: Duration) {
1438                 self.payment_path_failed(path, short_channel_id, duration_since_epoch)
1439         }
1440
1441         fn probe_successful(&mut self, path: &Path, duration_since_epoch: Duration) {
1442                 self.payment_path_failed(path, u64::max_value(), duration_since_epoch)
1443         }
1444
1445         fn time_passed(&mut self, duration_since_epoch: Duration) {
1446                 let decay_params = self.decay_params;
1447                 self.channel_liquidities.retain(|_scid, liquidity| {
1448                         liquidity.min_liquidity_offset_msat =
1449                                 liquidity.decayed_offset(liquidity.min_liquidity_offset_msat, duration_since_epoch, decay_params);
1450                         liquidity.max_liquidity_offset_msat =
1451                                 liquidity.decayed_offset(liquidity.max_liquidity_offset_msat, duration_since_epoch, decay_params);
1452                         liquidity.last_updated = duration_since_epoch;
1453
1454                         let elapsed_time =
1455                                 duration_since_epoch.saturating_sub(liquidity.offset_history_last_updated);
1456                         if elapsed_time > decay_params.historical_no_updates_half_life {
1457                                 let half_life = decay_params.historical_no_updates_half_life.as_secs_f64();
1458                                 if half_life != 0.0 {
1459                                         let divisor = powf64(2048.0, elapsed_time.as_secs_f64() / half_life) as u64;
1460                                         for bucket in liquidity.min_liquidity_offset_history.buckets.iter_mut() {
1461                                                 *bucket = ((*bucket as u64) * 1024 / divisor) as u16;
1462                                         }
1463                                         for bucket in liquidity.max_liquidity_offset_history.buckets.iter_mut() {
1464                                                 *bucket = ((*bucket as u64) * 1024 / divisor) as u16;
1465                                         }
1466                                         liquidity.offset_history_last_updated = duration_since_epoch;
1467                                 }
1468                         }
1469                         liquidity.min_liquidity_offset_msat != 0 || liquidity.max_liquidity_offset_msat != 0 ||
1470                                 liquidity.min_liquidity_offset_history.buckets != [0; 32] ||
1471                                 liquidity.max_liquidity_offset_history.buckets != [0; 32]
1472                 });
1473         }
1474 }
1475
1476 #[cfg(c_bindings)]
1477 impl<G: Deref<Target = NetworkGraph<L>>, L: Deref> Score for ProbabilisticScorer<G, L>
1478 where L::Target: Logger {}
1479
1480 #[cfg(feature = "std")]
1481 #[inline]
1482 fn powf64(n: f64, exp: f64) -> f64 {
1483         n.powf(exp)
1484 }
1485 #[cfg(not(feature = "std"))]
1486 fn powf64(n: f64, exp: f64) -> f64 {
1487         libm::powf(n as f32, exp as f32) as f64
1488 }
1489
1490 mod approx {
1491         const BITS: u32 = 64;
1492         const HIGHEST_BIT: u32 = BITS - 1;
1493         const LOWER_BITS: u32 = 6;
1494         pub(super) const LOWER_BITS_BOUND: u64 = 1 << LOWER_BITS;
1495         const LOWER_BITMASK: u64 = (1 << LOWER_BITS) - 1;
1496
1497         /// Look-up table for `log10(x) * 2048` where row `i` is used for each `x` having `i` as the
1498         /// most significant bit. The next 4 bits of `x`, if applicable, are used for the second index.
1499         const LOG10_TIMES_2048: [[u16; (LOWER_BITS_BOUND) as usize]; BITS as usize] = [
1500                 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1501                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1502                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1503                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
1504                 [617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617,
1505                         617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617,
1506                         977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977,
1507                         977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977],
1508                 [1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233,
1509                         1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431,
1510                         1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594,
1511                         1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731],
1512                 [1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954,
1513                         2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2133, 2133, 2133, 2133, 2133, 2133, 2133, 2133,
1514                         2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281,
1515                         2347, 2347, 2347, 2347, 2347, 2347, 2347, 2347, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409],
1516                 [2466, 2466, 2466, 2466, 2520, 2520, 2520, 2520, 2571, 2571, 2571, 2571, 2619, 2619, 2619, 2619,
1517                         2665, 2665, 2665, 2665, 2708, 2708, 2708, 2708, 2749, 2749, 2749, 2749, 2789, 2789, 2789, 2789,
1518                         2827, 2827, 2827, 2827, 2863, 2863, 2863, 2863, 2898, 2898, 2898, 2898, 2931, 2931, 2931, 2931,
1519                         2964, 2964, 2964, 2964, 2995, 2995, 2995, 2995, 3025, 3025, 3025, 3025, 3054, 3054, 3054, 3054],
1520                 [3083, 3083, 3110, 3110, 3136, 3136, 3162, 3162, 3187, 3187, 3212, 3212, 3235, 3235, 3259, 3259,
1521                         3281, 3281, 3303, 3303, 3324, 3324, 3345, 3345, 3366, 3366, 3386, 3386, 3405, 3405, 3424, 3424,
1522                         3443, 3443, 3462, 3462, 3479, 3479, 3497, 3497, 3514, 3514, 3531, 3531, 3548, 3548, 3564, 3564,
1523                         3580, 3580, 3596, 3596, 3612, 3612, 3627, 3627, 3642, 3642, 3656, 3656, 3671, 3671, 3685, 3685],
1524                 [3699, 3713, 3726, 3740, 3753, 3766, 3779, 3791, 3804, 3816, 3828, 3840, 3852, 3864, 3875, 3886,
1525                         3898, 3909, 3919, 3930, 3941, 3951, 3962, 3972, 3982, 3992, 4002, 4012, 4022, 4031, 4041, 4050,
1526                         4060, 4069, 4078, 4087, 4096, 4105, 4114, 4122, 4131, 4139, 4148, 4156, 4164, 4173, 4181, 4189,
1527                         4197, 4205, 4213, 4220, 4228, 4236, 4243, 4251, 4258, 4266, 4273, 4280, 4287, 4294, 4302, 4309],
1528                 [4316, 4329, 4343, 4356, 4369, 4382, 4395, 4408, 4420, 4433, 4445, 4457, 4468, 4480, 4492, 4503,
1529                         4514, 4525, 4536, 4547, 4557, 4568, 4578, 4589, 4599, 4609, 4619, 4629, 4638, 4648, 4657, 4667,
1530                         4676, 4685, 4695, 4704, 4713, 4721, 4730, 4739, 4747, 4756, 4764, 4773, 4781, 4789, 4797, 4805,
1531                         4813, 4821, 4829, 4837, 4845, 4852, 4860, 4867, 4875, 4882, 4889, 4897, 4904, 4911, 4918, 4925],
1532                 [4932, 4946, 4959, 4973, 4986, 4999, 5012, 5024, 5037, 5049, 5061, 5073, 5085, 5097, 5108, 5119,
1533                         5131, 5142, 5153, 5163, 5174, 5184, 5195, 5205, 5215, 5225, 5235, 5245, 5255, 5264, 5274, 5283,
1534                         5293, 5302, 5311, 5320, 5329, 5338, 5347, 5355, 5364, 5372, 5381, 5389, 5397, 5406, 5414, 5422,
1535                         5430, 5438, 5446, 5453, 5461, 5469, 5476, 5484, 5491, 5499, 5506, 5513, 5520, 5527, 5535, 5542],
1536                 [5549, 5562, 5576, 5589, 5603, 5615, 5628, 5641, 5653, 5666, 5678, 5690, 5701, 5713, 5725, 5736,
1537                         5747, 5758, 5769, 5780, 5790, 5801, 5811, 5822, 5832, 5842, 5852, 5862, 5871, 5881, 5890, 5900,
1538                         5909, 5918, 5928, 5937, 5946, 5954, 5963, 5972, 5980, 5989, 5997, 6006, 6014, 6022, 6030, 6038,
1539                         6046, 6054, 6062, 6070, 6078, 6085, 6093, 6100, 6108, 6115, 6122, 6130, 6137, 6144, 6151, 6158],
1540                 [6165, 6179, 6192, 6206, 6219, 6232, 6245, 6257, 6270, 6282, 6294, 6306, 6318, 6330, 6341, 6352,
1541                         6364, 6375, 6386, 6396, 6407, 6417, 6428, 6438, 6448, 6458, 6468, 6478, 6488, 6497, 6507, 6516,
1542                         6526, 6535, 6544, 6553, 6562, 6571, 6580, 6588, 6597, 6605, 6614, 6622, 6630, 6639, 6647, 6655,
1543                         6663, 6671, 6679, 6686, 6694, 6702, 6709, 6717, 6724, 6732, 6739, 6746, 6753, 6761, 6768, 6775],
1544                 [6782, 6795, 6809, 6822, 6836, 6849, 6861, 6874, 6886, 6899, 6911, 6923, 6934, 6946, 6958, 6969,
1545                         6980, 6991, 7002, 7013, 7023, 7034, 7044, 7055, 7065, 7075, 7085, 7095, 7104, 7114, 7124, 7133,
1546                         7142, 7151, 7161, 7170, 7179, 7187, 7196, 7205, 7213, 7222, 7230, 7239, 7247, 7255, 7263, 7271,
1547                         7279, 7287, 7295, 7303, 7311, 7318, 7326, 7333, 7341, 7348, 7355, 7363, 7370, 7377, 7384, 7391],
1548                 [7398, 7412, 7425, 7439, 7452, 7465, 7478, 7490, 7503, 7515, 7527, 7539, 7551, 7563, 7574, 7585,
1549                         7597, 7608, 7619, 7629, 7640, 7651, 7661, 7671, 7681, 7691, 7701, 7711, 7721, 7731, 7740, 7749,
1550                         7759, 7768, 7777, 7786, 7795, 7804, 7813, 7821, 7830, 7838, 7847, 7855, 7864, 7872, 7880, 7888,
1551                         7896, 7904, 7912, 7919, 7927, 7935, 7942, 7950, 7957, 7965, 7972, 7979, 7986, 7994, 8001, 8008],
1552                 [8015, 8028, 8042, 8055, 8069, 8082, 8094, 8107, 8119, 8132, 8144, 8156, 8167, 8179, 8191, 8202,
1553                         8213, 8224, 8235, 8246, 8256, 8267, 8277, 8288, 8298, 8308, 8318, 8328, 8337, 8347, 8357, 8366,
1554                         8375, 8384, 8394, 8403, 8412, 8420, 8429, 8438, 8446, 8455, 8463, 8472, 8480, 8488, 8496, 8504,
1555                         8512, 8520, 8528, 8536, 8544, 8551, 8559, 8566, 8574, 8581, 8588, 8596, 8603, 8610, 8617, 8624],
1556                 [8631, 8645, 8659, 8672, 8685, 8698, 8711, 8723, 8736, 8748, 8760, 8772, 8784, 8796, 8807, 8818,
1557                         8830, 8841, 8852, 8862, 8873, 8884, 8894, 8904, 8914, 8924, 8934, 8944, 8954, 8964, 8973, 8982,
1558                         8992, 9001, 9010, 9019, 9028, 9037, 9046, 9054, 9063, 9071, 9080, 9088, 9097, 9105, 9113, 9121,
1559                         9129, 9137, 9145, 9152, 9160, 9168, 9175, 9183, 9190, 9198, 9205, 9212, 9219, 9227, 9234, 9241],
1560                 [9248, 9261, 9275, 9288, 9302, 9315, 9327, 9340, 9352, 9365, 9377, 9389, 9400, 9412, 9424, 9435,
1561                         9446, 9457, 9468, 9479, 9490, 9500, 9510, 9521, 9531, 9541, 9551, 9561, 9570, 9580, 9590, 9599,
1562                         9608, 9617, 9627, 9636, 9645, 9653, 9662, 9671, 9679, 9688, 9696, 9705, 9713, 9721, 9729, 9737,
1563                         9745, 9753, 9761, 9769, 9777, 9784, 9792, 9799, 9807, 9814, 9821, 9829, 9836, 9843, 9850, 9857],
1564                 [9864, 9878, 9892, 9905, 9918, 9931, 9944, 9956, 9969, 9981, 9993, 10005, 10017, 10029, 10040, 10051,
1565                         10063, 10074, 10085, 10095, 10106, 10117, 10127, 10137, 10147, 10157, 10167, 10177, 10187, 10197, 10206, 10215,
1566                         10225, 10234, 10243, 10252, 10261, 10270, 10279, 10287, 10296, 10304, 10313, 10321, 10330, 10338, 10346, 10354,
1567                         10362, 10370, 10378, 10385, 10393, 10401, 10408, 10416, 10423, 10431, 10438, 10445, 10452, 10460, 10467, 10474],
1568                 [10481, 10494, 10508, 10521, 10535, 10548, 10560, 10573, 10585, 10598, 10610, 10622, 10634, 10645, 10657, 10668,
1569                         10679, 10690, 10701, 10712, 10723, 10733, 10743, 10754, 10764, 10774, 10784, 10794, 10803, 10813, 10823, 10832,
1570                         10841, 10851, 10860, 10869, 10878, 10886, 10895, 10904, 10912, 10921, 10929, 10938, 10946, 10954, 10962, 10970,
1571                         10978, 10986, 10994, 11002, 11010, 11017, 11025, 11032, 11040, 11047, 11054, 11062, 11069, 11076, 11083, 11090],
1572                 [11097, 11111, 11125, 11138, 11151, 11164, 11177, 11189, 11202, 11214, 11226, 11238, 11250, 11262, 11273, 11284,
1573                         11296, 11307, 11318, 11328, 11339, 11350, 11360, 11370, 11380, 11390, 11400, 11410, 11420, 11430, 11439, 11448,
1574                         11458, 11467, 11476, 11485, 11494, 11503, 11512, 11520, 11529, 11538, 11546, 11554, 11563, 11571, 11579, 11587,
1575                         11595, 11603, 11611, 11618, 11626, 11634, 11641, 11649, 11656, 11664, 11671, 11678, 11685, 11693, 11700, 11707],
1576                 [11714, 11727, 11741, 11754, 11768, 11781, 11793, 11806, 11818, 11831, 11843, 11855, 11867, 11878, 11890, 11901,
1577                         11912, 11923, 11934, 11945, 11956, 11966, 11976, 11987, 11997, 12007, 12017, 12027, 12036, 12046, 12056, 12065,
1578                         12074, 12084, 12093, 12102, 12111, 12119, 12128, 12137, 12146, 12154, 12162, 12171, 12179, 12187, 12195, 12203,
1579                         12211, 12219, 12227, 12235, 12243, 12250, 12258, 12265, 12273, 12280, 12287, 12295, 12302, 12309, 12316, 12323],
1580                 [12330, 12344, 12358, 12371, 12384, 12397, 12410, 12423, 12435, 12447, 12459, 12471, 12483, 12495, 12506, 12517,
1581                         12529, 12540, 12551, 12561, 12572, 12583, 12593, 12603, 12613, 12623, 12633, 12643, 12653, 12663, 12672, 12682,
1582                         12691, 12700, 12709, 12718, 12727, 12736, 12745, 12753, 12762, 12771, 12779, 12787, 12796, 12804, 12812, 12820,
1583                         12828, 12836, 12844, 12851, 12859, 12867, 12874, 12882, 12889, 12897, 12904, 12911, 12918, 12926, 12933, 12940],
1584                 [12947, 12960, 12974, 12987, 13001, 13014, 13026, 13039, 13051, 13064, 13076, 13088, 13100, 13111, 13123, 13134,
1585                         13145, 13156, 13167, 13178, 13189, 13199, 13209, 13220, 13230, 13240, 13250, 13260, 13269, 13279, 13289, 13298,
1586                         13307, 13317, 13326, 13335, 13344, 13352, 13361, 13370, 13379, 13387, 13395, 13404, 13412, 13420, 13428, 13436,
1587                         13444, 13452, 13460, 13468, 13476, 13483, 13491, 13498, 13506, 13513, 13521, 13528, 13535, 13542, 13549, 13556],
1588                 [13563, 13577, 13591, 13604, 13617, 13630, 13643, 13656, 13668, 13680, 13692, 13704, 13716, 13728, 13739, 13750,
1589                         13762, 13773, 13784, 13794, 13805, 13816, 13826, 13836, 13846, 13857, 13866, 13876, 13886, 13896, 13905, 13915,
1590                         13924, 13933, 13942, 13951, 13960, 13969, 13978, 13986, 13995, 14004, 14012, 14020, 14029, 14037, 14045, 14053,
1591                         14061, 14069, 14077, 14084, 14092, 14100, 14107, 14115, 14122, 14130, 14137, 14144, 14151, 14159, 14166, 14173],
1592                 [14180, 14194, 14207, 14220, 14234, 14247, 14259, 14272, 14284, 14297, 14309, 14321, 14333, 14344, 14356, 14367,
1593                         14378, 14389, 14400, 14411, 14422, 14432, 14443, 14453, 14463, 14473, 14483, 14493, 14502, 14512, 14522, 14531,
1594                         14540, 14550, 14559, 14568, 14577, 14586, 14594, 14603, 14612, 14620, 14628, 14637, 14645, 14653, 14661, 14669,
1595                         14677, 14685, 14693, 14701, 14709, 14716, 14724, 14731, 14739, 14746, 14754, 14761, 14768, 14775, 14782, 14789],
1596                 [14796, 14810, 14824, 14837, 14850, 14863, 14876, 14889, 14901, 14913, 14925, 14937, 14949, 14961, 14972, 14984,
1597                         14995, 15006, 15017, 15027, 15038, 15049, 15059, 15069, 15079, 15090, 15099, 15109, 15119, 15129, 15138, 15148,
1598                         15157, 15166, 15175, 15184, 15193, 15202, 15211, 15219, 15228, 15237, 15245, 15253, 15262, 15270, 15278, 15286,
1599                         15294, 15302, 15310, 15317, 15325, 15333, 15340, 15348, 15355, 15363, 15370, 15377, 15384, 15392, 15399, 15406],
1600                 [15413, 15427, 15440, 15453, 15467, 15480, 15492, 15505, 15517, 15530, 15542, 15554, 15566, 15577, 15589, 15600,
1601                         15611, 15622, 15633, 15644, 15655, 15665, 15676, 15686, 15696, 15706, 15716, 15726, 15736, 15745, 15755, 15764,
1602                         15773, 15783, 15792, 15801, 15810, 15819, 15827, 15836, 15845, 15853, 15862, 15870, 15878, 15886, 15894, 15903,
1603                         15910, 15918, 15926, 15934, 15942, 15949, 15957, 15964, 15972, 15979, 15987, 15994, 16001, 16008, 16015, 16022],
1604                 [16029, 16043, 16057, 16070, 16083, 16096, 16109, 16122, 16134, 16146, 16158, 16170, 16182, 16194, 16205, 16217,
1605                         16228, 16239, 16250, 16260, 16271, 16282, 16292, 16302, 16312, 16323, 16332, 16342, 16352, 16362, 16371, 16381,
1606                         16390, 16399, 16408, 16417, 16426, 16435, 16444, 16452, 16461, 16470, 16478, 16486, 16495, 16503, 16511, 16519,
1607                         16527, 16535, 16543, 16550, 16558, 16566, 16573, 16581, 16588, 16596, 16603, 16610, 16618, 16625, 16632, 16639],
1608                 [16646, 16660, 16673, 16686, 16700, 16713, 16725, 16738, 16751, 16763, 16775, 16787, 16799, 16810, 16822, 16833,
1609                         16844, 16855, 16866, 16877, 16888, 16898, 16909, 16919, 16929, 16939, 16949, 16959, 16969, 16978, 16988, 16997,
1610                         17006, 17016, 17025, 17034, 17043, 17052, 17060, 17069, 17078, 17086, 17095, 17103, 17111, 17119, 17127, 17136,
1611                         17143, 17151, 17159, 17167, 17175, 17182, 17190, 17197, 17205, 17212, 17220, 17227, 17234, 17241, 17248, 17255],
1612                 [17262, 17276, 17290, 17303, 17316, 17329, 17342, 17355, 17367, 17379, 17391, 17403, 17415, 17427, 17438, 17450,
1613                         17461, 17472, 17483, 17493, 17504, 17515, 17525, 17535, 17546, 17556, 17565, 17575, 17585, 17595, 17604, 17614,
1614                         17623, 17632, 17641, 17650, 17659, 17668, 17677, 17685, 17694, 17703, 17711, 17719, 17728, 17736, 17744, 17752,
1615                         17760, 17768, 17776, 17784, 17791, 17799, 17806, 17814, 17821, 17829, 17836, 17843, 17851, 17858, 17865, 17872],
1616                 [17879, 17893, 17906, 17920, 17933, 17946, 17958, 17971, 17984, 17996, 18008, 18020, 18032, 18043, 18055, 18066,
1617                         18077, 18088, 18099, 18110, 18121, 18131, 18142, 18152, 18162, 18172, 18182, 18192, 18202, 18211, 18221, 18230,
1618                         18239, 18249, 18258, 18267, 18276, 18285, 18293, 18302, 18311, 18319, 18328, 18336, 18344, 18352, 18360, 18369,
1619                         18377, 18384, 18392, 18400, 18408, 18415, 18423, 18430, 18438, 18445, 18453, 18460, 18467, 18474, 18481, 18488],
1620                 [18495, 18509, 18523, 18536, 18549, 18562, 18575, 18588, 18600, 18612, 18624, 18636, 18648, 18660, 18671, 18683,
1621                         18694, 18705, 18716, 18726, 18737, 18748, 18758, 18768, 18779, 18789, 18799, 18808, 18818, 18828, 18837, 18847,
1622                         18856, 18865, 18874, 18883, 18892, 18901, 18910, 18919, 18927, 18936, 18944, 18952, 18961, 18969, 18977, 18985,
1623                         18993, 19001, 19009, 19017, 19024, 19032, 19039, 19047, 19054, 19062, 19069, 19076, 19084, 19091, 19098, 19105],
1624                 [19112, 19126, 19139, 19153, 19166, 19179, 19191, 19204, 19217, 19229, 19241, 19253, 19265, 19276, 19288, 19299,
1625                         19310, 19321, 19332, 19343, 19354, 19364, 19375, 19385, 19395, 19405, 19415, 19425, 19435, 19444, 19454, 19463,
1626                         19472, 19482, 19491, 19500, 19509, 19518, 19526, 19535, 19544, 19552, 19561, 19569, 19577, 19585, 19594, 19602,
1627                         19610, 19617, 19625, 19633, 19641, 19648, 19656, 19663, 19671, 19678, 19686, 19693, 19700, 19707, 19714, 19721],
1628                 [19728, 19742, 19756, 19769, 19782, 19795, 19808, 19821, 19833, 19845, 19857, 19869, 19881, 19893, 19904, 19916,
1629                         19927, 19938, 19949, 19960, 19970, 19981, 19991, 20001, 20012, 20022, 20032, 20041, 20051, 20061, 20070, 20080,
1630                         20089, 20098, 20107, 20116, 20125, 20134, 20143, 20152, 20160, 20169, 20177, 20185, 20194, 20202, 20210, 20218,
1631                         20226, 20234, 20242, 20250, 20257, 20265, 20272, 20280, 20287, 20295, 20302, 20309, 20317, 20324, 20331, 20338],
1632                 [20345, 20359, 20372, 20386, 20399, 20412, 20425, 20437, 20450, 20462, 20474, 20486, 20498, 20509, 20521, 20532,
1633                         20543, 20554, 20565, 20576, 20587, 20597, 20608, 20618, 20628, 20638, 20648, 20658, 20668, 20677, 20687, 20696,
1634                         20705, 20715, 20724, 20733, 20742, 20751, 20759, 20768, 20777, 20785, 20794, 20802, 20810, 20818, 20827, 20835,
1635                         20843, 20850, 20858, 20866, 20874, 20881, 20889, 20896, 20904, 20911, 20919, 20926, 20933, 20940, 20947, 20954],
1636                 [20961, 20975, 20989, 21002, 21015, 21028, 21041, 21054, 21066, 21078, 21090, 21102, 21114, 21126, 21137, 21149,
1637                         21160, 21171, 21182, 21193, 21203, 21214, 21224, 21234, 21245, 21255, 21265, 21274, 21284, 21294, 21303, 21313,
1638                         21322, 21331, 21340, 21349, 21358, 21367, 21376, 21385, 21393, 21402, 21410, 21418, 21427, 21435, 21443, 21451,
1639                         21459, 21467, 21475, 21483, 21490, 21498, 21505, 21513, 21520, 21528, 21535, 21542, 21550, 21557, 21564, 21571],
1640                 [21578, 21592, 21605, 21619, 21632, 21645, 21658, 21670, 21683, 21695, 21707, 21719, 21731, 21742, 21754, 21765,
1641                         21776, 21787, 21798, 21809, 21820, 21830, 21841, 21851, 21861, 21871, 21881, 21891, 21901, 21910, 21920, 21929,
1642                         21938, 21948, 21957, 21966, 21975, 21984, 21992, 22001, 22010, 22018, 22027, 22035, 22043, 22051, 22060, 22068,
1643                         22076, 22083, 22091, 22099, 22107, 22114, 22122, 22129, 22137, 22144, 22152, 22159, 22166, 22173, 22180, 22187],
1644                 [22194, 22208, 22222, 22235, 22248, 22261, 22274, 22287, 22299, 22311, 22323, 22335, 22347, 22359, 22370, 22382,
1645                         22393, 22404, 22415, 22426, 22436, 22447, 22457, 22467, 22478, 22488, 22498, 22507, 22517, 22527, 22536, 22546,
1646                         22555, 22564, 22573, 22582, 22591, 22600, 22609, 22618, 22626, 22635, 22643, 22651, 22660, 22668, 22676, 22684,
1647                         22692, 22700, 22708, 22716, 22723, 22731, 22738, 22746, 22753, 22761, 22768, 22775, 22783, 22790, 22797, 22804],
1648                 [22811, 22825, 22838, 22852, 22865, 22878, 22891, 22903, 22916, 22928, 22940, 22952, 22964, 22975, 22987, 22998,
1649                         23009, 23020, 23031, 23042, 23053, 23063, 23074, 23084, 23094, 23104, 23114, 23124, 23134, 23143, 23153, 23162,
1650                         23171, 23181, 23190, 23199, 23208, 23217, 23225, 23234, 23243, 23251, 23260, 23268, 23276, 23284, 23293, 23301,
1651                         23309, 23316, 23324, 23332, 23340, 23347, 23355, 23363, 23370, 23377, 23385, 23392, 23399, 23406, 23413, 23420],
1652                 [23427, 23441, 23455, 23468, 23481, 23494, 23507, 23520, 23532, 23544, 23556, 23568, 23580, 23592, 23603, 23615,
1653                         23626, 23637, 23648, 23659, 23669, 23680, 23690, 23700, 23711, 23721, 23731, 23740, 23750, 23760, 23769, 23779,
1654                         23788, 23797, 23806, 23815, 23824, 23833, 23842, 23851, 23859, 23868, 23876, 23884, 23893, 23901, 23909, 23917,
1655                         23925, 23933, 23941, 23949, 23956, 23964, 23972, 23979, 23986, 23994, 24001, 24008, 24016, 24023, 24030, 24037],
1656                 [24044, 24058, 24071, 24085, 24098, 24111, 24124, 24136, 24149, 24161, 24173, 24185, 24197, 24208, 24220, 24231,
1657                         24242, 24253, 24264, 24275, 24286, 24296, 24307, 24317, 24327, 24337, 24347, 24357, 24367, 24376, 24386, 24395,
1658                         24405, 24414, 24423, 24432, 24441, 24450, 24458, 24467, 24476, 24484, 24493, 24501, 24509, 24517, 24526, 24534,
1659                         24542, 24550, 24557, 24565, 24573, 24580, 24588, 24596, 24603, 24610, 24618, 24625, 24632, 24639, 24646, 24653],
1660                 [24660, 24674, 24688, 24701, 24714, 24727, 24740, 24753, 24765, 24777, 24790, 24801, 24813, 24825, 24836, 24848,
1661                         24859, 24870, 24881, 24892, 24902, 24913, 24923, 24933, 24944, 24954, 24964, 24973, 24983, 24993, 25002, 25012,
1662                         25021, 25030, 25039, 25048, 25057, 25066, 25075, 25084, 25092, 25101, 25109, 25117, 25126, 25134, 25142, 25150,
1663                         25158, 25166, 25174, 25182, 25189, 25197, 25205, 25212, 25219, 25227, 25234, 25241, 25249, 25256, 25263, 25270],
1664                 [25277, 25291, 25304, 25318, 25331, 25344, 25357, 25369, 25382, 25394, 25406, 25418, 25430, 25441, 25453, 25464,
1665                         25475, 25486, 25497, 25508, 25519, 25529, 25540, 25550, 25560, 25570, 25580, 25590, 25600, 25609, 25619, 25628,
1666                         25638, 25647, 25656, 25665, 25674, 25683, 25691, 25700, 25709, 25717, 25726, 25734, 25742, 25750, 25759, 25767,
1667                         25775, 25783, 25790, 25798, 25806, 25813, 25821, 25829, 25836, 25843, 25851, 25858, 25865, 25872, 25879, 25886],
1668                 [25893, 25907, 25921, 25934, 25947, 25960, 25973, 25986, 25998, 26010, 26023, 26034, 26046, 26058, 26069, 26081,
1669                         26092, 26103, 26114, 26125, 26135, 26146, 26156, 26166, 26177, 26187, 26197, 26206, 26216, 26226, 26235, 26245,
1670                         26254, 26263, 26272, 26281, 26290, 26299, 26308, 26317, 26325, 26334, 26342, 26351, 26359, 26367, 26375, 26383,
1671                         26391, 26399, 26407, 26415, 26422, 26430, 26438, 26445, 26453, 26460, 26467, 26474, 26482, 26489, 26496, 26503],
1672                 [26510, 26524, 26537, 26551, 26564, 26577, 26590, 26602, 26615, 26627, 26639, 26651, 26663, 26674, 26686, 26697,
1673                         26708, 26719, 26730, 26741, 26752, 26762, 26773, 26783, 26793, 26803, 26813, 26823, 26833, 26842, 26852, 26861,
1674                         26871, 26880, 26889, 26898, 26907, 26916, 26924, 26933, 26942, 26950, 26959, 26967, 26975, 26983, 26992, 27000,
1675                         27008, 27016, 27023, 27031, 27039, 27046, 27054, 27062, 27069, 27076, 27084, 27091, 27098, 27105, 27112, 27119],
1676                 [27126, 27140, 27154, 27167, 27180, 27193, 27206, 27219, 27231, 27243, 27256, 27267, 27279, 27291, 27302, 27314,
1677                         27325, 27336, 27347, 27358, 27368, 27379, 27389, 27399, 27410, 27420, 27430, 27439, 27449, 27459, 27468, 27478,
1678                         27487, 27496, 27505, 27514, 27523, 27532, 27541, 27550, 27558, 27567, 27575, 27584, 27592, 27600, 27608, 27616,
1679                         27624, 27632, 27640, 27648, 27655, 27663, 27671, 27678, 27686, 27693, 27700, 27707, 27715, 27722, 27729, 27736],
1680                 [27743, 27757, 27770, 27784, 27797, 27810, 27823, 27835, 27848, 27860, 27872, 27884, 27896, 27907, 27919, 27930,
1681                         27941, 27952, 27963, 27974, 27985, 27995, 28006, 28016, 28026, 28036, 28046, 28056, 28066, 28075, 28085, 28094,
1682                         28104, 28113, 28122, 28131, 28140, 28149, 28157, 28166, 28175, 28183, 28192, 28200, 28208, 28217, 28225, 28233,
1683                         28241, 28249, 28256, 28264, 28272, 28280, 28287, 28295, 28302, 28309, 28317, 28324, 28331, 28338, 28345, 28352],
1684                 [28359, 28373, 28387, 28400, 28413, 28426, 28439, 28452, 28464, 28476, 28489, 28501, 28512, 28524, 28535, 28547,
1685                         28558, 28569, 28580, 28591, 28601, 28612, 28622, 28633, 28643, 28653, 28663, 28672, 28682, 28692, 28701, 28711,
1686                         28720, 28729, 28738, 28747, 28756, 28765, 28774, 28783, 28791, 28800, 28808, 28817, 28825, 28833, 28841, 28849,
1687                         28857, 28865, 28873, 28881, 28888, 28896, 28904, 28911, 28919, 28926, 28933, 28941, 28948, 28955, 28962, 28969],
1688                 [28976, 28990, 29003, 29017, 29030, 29043, 29056, 29068, 29081, 29093, 29105, 29117, 29129, 29140, 29152, 29163,
1689                         29174, 29185, 29196, 29207, 29218, 29228, 29239, 29249, 29259, 29269, 29279, 29289, 29299, 29308, 29318, 29327,
1690                         29337, 29346, 29355, 29364, 29373, 29382, 29390, 29399, 29408, 29416, 29425, 29433, 29441, 29450, 29458, 29466,
1691                         29474, 29482, 29489, 29497, 29505, 29513, 29520, 29528, 29535, 29542, 29550, 29557, 29564, 29571, 29578, 29585],
1692                 [29592, 29606, 29620, 29633, 29646, 29659, 29672, 29685, 29697, 29709, 29722, 29734, 29745, 29757, 29768, 29780,
1693                         29791, 29802, 29813, 29824, 29834, 29845, 29855, 29866, 29876, 29886, 29896, 29906, 29915, 29925, 29934, 29944,
1694                         29953, 29962, 29971, 29980, 29989, 29998, 30007, 30016, 30024, 30033, 30041, 30050, 30058, 30066, 30074, 30082,
1695                         30090, 30098, 30106, 30114, 30121, 30129, 30137, 30144, 30152, 30159, 30166, 30174, 30181, 30188, 30195, 30202],
1696                 [30209, 30223, 30236, 30250, 30263, 30276, 30289, 30301, 30314, 30326, 30338, 30350, 30362, 30373, 30385, 30396,
1697                         30407, 30418, 30429, 30440, 30451, 30461, 30472, 30482, 30492, 30502, 30512, 30522, 30532, 30541, 30551, 30560,
1698                         30570, 30579, 30588, 30597, 30606, 30615, 30624, 30632, 30641, 30649, 30658, 30666, 30674, 30683, 30691, 30699,
1699                         30707, 30715, 30722, 30730, 30738, 30746, 30753, 30761, 30768, 30775, 30783, 30790, 30797, 30804, 30811, 30818],
1700                 [30825, 30839, 30853, 30866, 30879, 30892, 30905, 30918, 30930, 30943, 30955, 30967, 30978, 30990, 31001, 31013,
1701                         31024, 31035, 31046, 31057, 31067, 31078, 31088, 31099, 31109, 31119, 31129, 31139, 31148, 31158, 31167, 31177,
1702                         31186, 31195, 31204, 31213, 31222, 31231, 31240, 31249, 31257, 31266, 31274, 31283, 31291, 31299, 31307, 31315,
1703                         31323, 31331, 31339, 31347, 31354, 31362, 31370, 31377, 31385, 31392, 31399, 31407, 31414, 31421, 31428, 31435],
1704                 [31442, 31456, 31469, 31483, 31496, 31509, 31522, 31534, 31547, 31559, 31571, 31583, 31595, 31606, 31618, 31629,
1705                         31640, 31652, 31662, 31673, 31684, 31694, 31705, 31715, 31725, 31735, 31745, 31755, 31765, 31774, 31784, 31793,
1706                         31803, 31812, 31821, 31830, 31839, 31848, 31857, 31865, 31874, 31882, 31891, 31899, 31907, 31916, 31924, 31932,
1707                         31940, 31948, 31955, 31963, 31971, 31979, 31986, 31994, 32001, 32008, 32016, 32023, 32030, 32037, 32044, 32052],
1708                 [32058, 32072, 32086, 32099, 32112, 32125, 32138, 32151, 32163, 32176, 32188, 32200, 32211, 32223, 32234, 32246,
1709                         32257, 32268, 32279, 32290, 32300, 32311, 32321, 32332, 32342, 32352, 32362, 32372, 32381, 32391, 32400, 32410,
1710                         32419, 32428, 32437, 32446, 32455, 32464, 32473, 32482, 32490, 32499, 32507, 32516, 32524, 32532, 32540, 32548,
1711                         32556, 32564, 32572, 32580, 32587, 32595, 32603, 32610, 32618, 32625, 32632, 32640, 32647, 32654, 32661, 32668],
1712                 [32675, 32689, 32702, 32716, 32729, 32742, 32755, 32767, 32780, 32792, 32804, 32816, 32828, 32839, 32851, 32862,
1713                         32873, 32885, 32895, 32906, 32917, 32927, 32938, 32948, 32958, 32968, 32978, 32988, 32998, 33007, 33017, 33026,
1714                         33036, 33045, 33054, 33063, 33072, 33081, 33090, 33098, 33107, 33115, 33124, 33132, 33140, 33149, 33157, 33165,
1715                         33173, 33181, 33188, 33196, 33204, 33212, 33219, 33227, 33234, 33241, 33249, 33256, 33263, 33270, 33278, 33285],
1716                 [33292, 33305, 33319, 33332, 33345, 33358, 33371, 33384, 33396, 33409, 33421, 33433, 33444, 33456, 33467, 33479,
1717                         33490, 33501, 33512, 33523, 33533, 33544, 33554, 33565, 33575, 33585, 33595, 33605, 33614, 33624, 33633, 33643,
1718                         33652, 33661, 33670, 33680, 33688, 33697, 33706, 33715, 33723, 33732, 33740, 33749, 33757, 33765, 33773, 33781,
1719                         33789, 33797, 33805, 33813, 33820, 33828, 33836, 33843, 33851, 33858, 33865, 33873, 33880, 33887, 33894, 33901],
1720                 [33908, 33922, 33935, 33949, 33962, 33975, 33988, 34000, 34013, 34025, 34037, 34049, 34061, 34072, 34084, 34095,
1721                         34106, 34118, 34128, 34139, 34150, 34160, 34171, 34181, 34191, 34201, 34211, 34221, 34231, 34240, 34250, 34259,
1722                         34269, 34278, 34287, 34296, 34305, 34314, 34323, 34331, 34340, 34348, 34357, 34365, 34373, 34382, 34390, 34398,
1723                         34406, 34414, 34422, 34429, 34437, 34445, 34452, 34460, 34467, 34475, 34482, 34489, 34496, 34503, 34511, 34518],
1724                 [34525, 34538, 34552, 34565, 34578, 34591, 34604, 34617, 34629, 34642, 34654, 34666, 34677, 34689, 34700, 34712,
1725                         34723, 34734, 34745, 34756, 34766, 34777, 34787, 34798, 34808, 34818, 34828, 34838, 34847, 34857, 34866, 34876,
1726                         34885, 34894, 34904, 34913, 34921, 34930, 34939, 34948, 34956, 34965, 34973, 34982, 34990, 34998, 35006, 35014,
1727                         35022, 35030, 35038, 35046, 35053, 35061, 35069, 35076, 35084, 35091, 35098, 35106, 35113, 35120, 35127, 35134],
1728                 [35141, 35155, 35168, 35182, 35195, 35208, 35221, 35233, 35246, 35258, 35270, 35282, 35294, 35306, 35317, 35328,
1729                         35340, 35351, 35361, 35372, 35383, 35393, 35404, 35414, 35424, 35434, 35444, 35454, 35464, 35473, 35483, 35492,
1730                         35502, 35511, 35520, 35529, 35538, 35547, 35556, 35564, 35573, 35581, 35590, 35598, 35606, 35615, 35623, 35631,
1731                         35639, 35647, 35655, 35662, 35670, 35678, 35685, 35693, 35700, 35708, 35715, 35722, 35729, 35736, 35744, 35751],
1732                 [35758, 35771, 35785, 35798, 35811, 35824, 35837, 35850, 35862, 35875, 35887, 35899, 35910, 35922, 35934, 35945,
1733                         35956, 35967, 35978, 35989, 35999, 36010, 36020, 36031, 36041, 36051, 36061, 36071, 36080, 36090, 36099, 36109,
1734                         36118, 36127, 36137, 36146, 36154, 36163, 36172, 36181, 36189, 36198, 36206, 36215, 36223, 36231, 36239, 36247,
1735                         36255, 36263, 36271, 36279, 36287, 36294, 36302, 36309, 36317, 36324, 36331, 36339, 36346, 36353, 36360, 36367],
1736                 [36374, 36388, 36401, 36415, 36428, 36441, 36454, 36466, 36479, 36491, 36503, 36515, 36527, 36539, 36550, 36561,
1737                         36573, 36584, 36594, 36605, 36616, 36626, 36637, 36647, 36657, 36667, 36677, 36687, 36697, 36706, 36716, 36725,
1738                         36735, 36744, 36753, 36762, 36771, 36780, 36789, 36797, 36806, 36814, 36823, 36831, 36839, 36848, 36856, 36864,
1739                         36872, 36880, 36888, 36895, 36903, 36911, 36918, 36926, 36933, 36941, 36948, 36955, 36962, 36969, 36977, 36984],
1740                 [36991, 37004, 37018, 37031, 37044, 37057, 37070, 37083, 37095, 37108, 37120, 37132, 37143, 37155, 37167, 37178,
1741                         37189, 37200, 37211, 37222, 37232, 37243, 37253, 37264, 37274, 37284, 37294, 37304, 37313, 37323, 37332, 37342,
1742                         37351, 37360, 37370, 37379, 37388, 37396, 37405, 37414, 37422, 37431, 37439, 37448, 37456, 37464, 37472, 37480,
1743                         37488, 37496, 37504, 37512, 37520, 37527, 37535, 37542, 37550, 37557, 37564, 37572, 37579, 37586, 37593, 37600],
1744                 [37607, 37621, 37634, 37648, 37661, 37674, 37687, 37699, 37712, 37724, 37736, 37748, 37760, 37772, 37783, 37794,
1745                         37806, 37817, 37828, 37838, 37849, 37859, 37870, 37880, 37890, 37900, 37910, 37920, 37930, 37939, 37949, 37958,
1746                         37968, 37977, 37986, 37995, 38004, 38013, 38022, 38030, 38039, 38047, 38056, 38064, 38072, 38081, 38089, 38097,
1747                         38105, 38113, 38121, 38128, 38136, 38144, 38151, 38159, 38166, 38174, 38181, 38188, 38195, 38202, 38210, 38217],
1748                 [38224, 38237, 38251, 38264, 38278, 38290, 38303, 38316, 38328, 38341, 38353, 38365, 38376, 38388, 38400, 38411,
1749                         38422, 38433, 38444, 38455, 38465, 38476, 38486, 38497, 38507, 38517, 38527, 38537, 38546, 38556, 38565, 38575,
1750                         38584, 38593, 38603, 38612, 38621, 38629, 38638, 38647, 38655, 38664, 38672, 38681, 38689, 38697, 38705, 38713,
1751                         38721, 38729, 38737, 38745, 38753, 38760, 38768, 38775, 38783, 38790, 38797, 38805, 38812, 38819, 38826, 38833],
1752                 [38840, 38854, 38867, 38881, 38894, 38907, 38920, 38932, 38945, 38957, 38969, 38981, 38993, 39005, 39016, 39027,
1753                         39039, 39050, 39061, 39071, 39082, 39092, 39103, 39113, 39123, 39133, 39143, 39153, 39163, 39172, 39182, 39191,
1754                         39201, 39210, 39219, 39228, 39237, 39246, 39255, 39263, 39272, 39280, 39289, 39297, 39305, 39314, 39322, 39330,
1755                         39338, 39346, 39354, 39361, 39369, 39377, 39384, 39392, 39399, 39407, 39414, 39421, 39428, 39436, 39443, 39450],
1756         ];
1757
1758         /// Approximate `log10(numerator / denominator) * 2048` using a look-up table.
1759         #[inline]
1760         pub fn negative_log10_times_2048(numerator: u64, denominator: u64) -> u64 {
1761                 // Multiply the -1 through to avoid needing to use signed numbers.
1762                 (log10_times_2048(denominator) - log10_times_2048(numerator)) as u64
1763         }
1764
1765         #[inline]
1766         fn log10_times_2048(x: u64) -> u16 {
1767                 debug_assert_ne!(x, 0);
1768                 let most_significant_bit = HIGHEST_BIT - x.leading_zeros();
1769                 let lower_bits = (x >> most_significant_bit.saturating_sub(LOWER_BITS)) & LOWER_BITMASK;
1770                 LOG10_TIMES_2048[most_significant_bit as usize][lower_bits as usize]
1771         }
1772
1773         #[cfg(test)]
1774         mod tests {
1775                 use super::*;
1776
1777                 #[test]
1778                 fn prints_negative_log10_times_2048_lookup_table() {
1779                         for msb in 0..BITS {
1780                                 for i in 0..LOWER_BITS_BOUND {
1781                                         let x = ((LOWER_BITS_BOUND + i) << (HIGHEST_BIT - LOWER_BITS)) >> (HIGHEST_BIT - msb);
1782                                         let log10_times_2048 = ((x as f64).log10() * 2048.0).round() as u16;
1783                                         assert_eq!(log10_times_2048, LOG10_TIMES_2048[msb as usize][i as usize]);
1784
1785                                         if i % LOWER_BITS_BOUND == 0 {
1786                                                 print!("\t\t[{}, ", log10_times_2048);
1787                                         } else if i % LOWER_BITS_BOUND == LOWER_BITS_BOUND - 1 {
1788                                                 println!("{}],", log10_times_2048);
1789                                         } else if i % (LOWER_BITS_BOUND/4) == LOWER_BITS_BOUND/4 - 1 {
1790                                                 print!("{},\n\t\t\t", log10_times_2048);
1791                                         } else {
1792                                                 print!("{}, ", log10_times_2048);
1793                                         }
1794                                 }
1795                         }
1796                 }
1797         }
1798 }
1799
1800 mod bucketed_history {
1801         use super::*;
1802
1803         // Because liquidity is often skewed heavily in one direction, we store historical state
1804         // distribution in buckets of different size. For backwards compatibility, buckets of size 1/8th
1805         // must fit evenly into the buckets here.
1806         //
1807         // The smallest bucket is 2^-14th of the channel, for each of our 32 buckets here we define the
1808         // width of the bucket in 2^14'ths of the channel. This increases exponentially until we reach
1809         // a full 16th of the channel's capacity, which is reapeated a few times for backwards
1810         // compatibility. The four middle buckets represent full octiles of the channel's capacity.
1811         //
1812         // For a 1 BTC channel, this let's us differentiate between failures in the bottom 6k sats, or
1813         // between the 12,000th sat and 24,000th sat, while only needing to store and operate on 32
1814         // buckets in total.
1815
1816         const BUCKET_START_POS: [u16; 33] = [
1817                 0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 3072, 4096, 6144, 8192, 10240, 12288,
1818                 13312, 14336, 15360, 15872, 16128, 16256, 16320, 16352, 16368, 16376, 16380, 16382, 16383, 16384,
1819         ];
1820
1821         const LEGACY_TO_BUCKET_RANGE: [(u8, u8); 8] = [
1822                 (0, 12), (12, 14), (14, 15), (15, 16), (16, 17), (17, 18), (18, 20), (20, 32)
1823         ];
1824
1825         const POSITION_TICKS: u16 = 1 << 14;
1826
1827         fn pos_to_bucket(pos: u16) -> usize {
1828                 for bucket in 0..32 {
1829                         if pos < BUCKET_START_POS[bucket + 1] {
1830                                 return bucket;
1831                         }
1832                 }
1833                 debug_assert!(false);
1834                 return 32;
1835         }
1836
1837         #[cfg(test)]
1838         #[test]
1839         fn check_bucket_maps() {
1840                 const BUCKET_WIDTH_IN_16384S: [u16; 32] = [
1841                         1, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 1024, 1024, 2048, 2048,
1842                         2048, 2048, 1024, 1024, 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1, 1];
1843
1844                 let mut min_size_iter = 0;
1845                 let mut legacy_bucket_iter = 0;
1846                 for (bucket, width) in BUCKET_WIDTH_IN_16384S.iter().enumerate() {
1847                         assert_eq!(BUCKET_START_POS[bucket], min_size_iter);
1848                         for i in 0..*width {
1849                                 assert_eq!(pos_to_bucket(min_size_iter + i) as usize, bucket);
1850                         }
1851                         min_size_iter += *width;
1852                         if min_size_iter % (POSITION_TICKS / 8) == 0 {
1853                                 assert_eq!(LEGACY_TO_BUCKET_RANGE[legacy_bucket_iter].1 as usize, bucket + 1);
1854                                 if legacy_bucket_iter + 1 < 8 {
1855                                         assert_eq!(LEGACY_TO_BUCKET_RANGE[legacy_bucket_iter + 1].0 as usize, bucket + 1);
1856                                 }
1857                                 legacy_bucket_iter += 1;
1858                         }
1859                 }
1860                 assert_eq!(BUCKET_START_POS[32], POSITION_TICKS);
1861                 assert_eq!(min_size_iter, POSITION_TICKS);
1862         }
1863
1864         #[inline]
1865         fn amount_to_pos(amount_msat: u64, capacity_msat: u64) -> u16 {
1866                 let pos = if amount_msat < u64::max_value() / (POSITION_TICKS as u64) {
1867                         (amount_msat * (POSITION_TICKS as u64) / capacity_msat.saturating_add(1))
1868                                 .try_into().unwrap_or(POSITION_TICKS)
1869                 } else {
1870                         // Only use 128-bit arithmetic when multiplication will overflow to avoid 128-bit
1871                         // division. This branch should only be hit in fuzz testing since the amount would
1872                         // need to be over 2.88 million BTC in practice.
1873                         ((amount_msat as u128) * (POSITION_TICKS as u128)
1874                                         / (capacity_msat as u128).saturating_add(1))
1875                                 .try_into().unwrap_or(POSITION_TICKS)
1876                 };
1877                 // If we are running in a client that doesn't validate gossip, its possible for a channel's
1878                 // capacity to change due to a `channel_update` message which, if received while a payment
1879                 // is in-flight, could cause this to fail. Thus, we only assert in test.
1880                 #[cfg(test)]
1881                 debug_assert!(pos < POSITION_TICKS);
1882                 pos
1883         }
1884
1885         /// Prior to LDK 0.0.117 we used eight buckets which were split evenly across the either
1886         /// octiles. This was changed to use 32 buckets for accuracy reasons in 0.0.117, however we
1887         /// support reading the legacy values here for backwards compatibility.
1888         pub(super) struct LegacyHistoricalBucketRangeTracker {
1889                 buckets: [u16; 8],
1890         }
1891
1892         impl LegacyHistoricalBucketRangeTracker {
1893                 pub(crate) fn into_current(&self) -> HistoricalBucketRangeTracker {
1894                         let mut buckets = [0; 32];
1895                         for (idx, legacy_bucket) in self.buckets.iter().enumerate() {
1896                                 let mut new_val = *legacy_bucket;
1897                                 let (start, end) = LEGACY_TO_BUCKET_RANGE[idx];
1898                                 new_val /= (end - start) as u16;
1899                                 for i in start..end {
1900                                         buckets[i as usize] = new_val;
1901                                 }
1902                         }
1903                         HistoricalBucketRangeTracker { buckets }
1904                 }
1905         }
1906
1907         /// Tracks the historical state of a distribution as a weighted average of how much time was spent
1908         /// in each of 32 buckets.
1909         #[derive(Clone, Copy)]
1910         pub(super) struct HistoricalBucketRangeTracker {
1911                 pub(super) buckets: [u16; 32],
1912         }
1913
1914         /// Buckets are stored in fixed point numbers with a 5 bit fractional part. Thus, the value
1915         /// "one" is 32, or this constant.
1916         pub const BUCKET_FIXED_POINT_ONE: u16 = 32;
1917
1918         impl HistoricalBucketRangeTracker {
1919                 pub(super) fn new() -> Self { Self { buckets: [0; 32] } }
1920                 pub(super) fn track_datapoint(&mut self, liquidity_offset_msat: u64, capacity_msat: u64) {
1921                         // We have 32 leaky buckets for min and max liquidity. Each bucket tracks the amount of time
1922                         // we spend in each bucket as a 16-bit fixed-point number with a 5 bit fractional part.
1923                         //
1924                         // Each time we update our liquidity estimate, we add 32 (1.0 in our fixed-point system) to
1925                         // the buckets for the current min and max liquidity offset positions.
1926                         //
1927                         // We then decay each bucket by multiplying by 2047/2048 (avoiding dividing by a
1928                         // non-power-of-two). This ensures we can't actually overflow the u16 - when we get to
1929                         // 63,457 adding 32 and decaying by 2047/2048 leaves us back at 63,457.
1930                         //
1931                         // In total, this allows us to track data for the last 8,000 or so payments across a given
1932                         // channel.
1933                         //
1934                         // These constants are a balance - we try to fit in 2 bytes per bucket to reduce overhead,
1935                         // and need to balance having more bits in the decimal part (to ensure decay isn't too
1936                         // non-linear) with having too few bits in the mantissa, causing us to not store very many
1937                         // datapoints.
1938                         //
1939                         // The constants were picked experimentally, selecting a decay amount that restricts us
1940                         // from overflowing buckets without having to cap them manually.
1941
1942                         let pos: u16 = amount_to_pos(liquidity_offset_msat, capacity_msat);
1943                         if pos < POSITION_TICKS {
1944                                 for e in self.buckets.iter_mut() {
1945                                         *e = ((*e as u32) * 2047 / 2048) as u16;
1946                                 }
1947                                 let bucket = pos_to_bucket(pos);
1948                                 self.buckets[bucket] = self.buckets[bucket].saturating_add(BUCKET_FIXED_POINT_ONE);
1949                         }
1950                 }
1951         }
1952
1953         impl_writeable_tlv_based!(HistoricalBucketRangeTracker, { (0, buckets, required) });
1954         impl_writeable_tlv_based!(LegacyHistoricalBucketRangeTracker, { (0, buckets, required) });
1955
1956         /// A set of buckets representing the history of where we've seen the minimum- and maximum-
1957         /// liquidity bounds for a given channel.
1958         pub(super) struct HistoricalMinMaxBuckets<D: Deref<Target = HistoricalBucketRangeTracker>> {
1959                 /// Buckets tracking where and how often we've seen the minimum liquidity bound for a
1960                 /// channel.
1961                 pub(super) min_liquidity_offset_history: D,
1962                 /// Buckets tracking where and how often we've seen the maximum liquidity bound for a
1963                 /// channel.
1964                 pub(super) max_liquidity_offset_history: D,
1965         }
1966
1967         impl<D: Deref<Target = HistoricalBucketRangeTracker>> HistoricalMinMaxBuckets<D> {
1968                 #[inline]
1969                 pub(super) fn calculate_success_probability_times_billion(
1970                         &self, params: &ProbabilisticScoringFeeParameters, amount_msat: u64,
1971                         capacity_msat: u64
1972                 ) -> Option<u64> {
1973                         // If historical penalties are enabled, we try to calculate a probability of success
1974                         // given our historical distribution of min- and max-liquidity bounds in a channel.
1975                         // To do so, we walk the set of historical liquidity bucket (min, max) combinations
1976                         // (where min_idx < max_idx, as having a minimum above our maximum is an invalid
1977                         // state). For each pair, we calculate the probability as if the bucket's corresponding
1978                         // min- and max- liquidity bounds were our current liquidity bounds and then multiply
1979                         // that probability by the weight of the selected buckets.
1980                         let payment_pos = amount_to_pos(amount_msat, capacity_msat);
1981                         if payment_pos >= POSITION_TICKS { return None; }
1982
1983                         let mut total_valid_points_tracked = 0;
1984                         for (min_idx, min_bucket) in self.min_liquidity_offset_history.buckets.iter().enumerate() {
1985                                 for max_bucket in self.max_liquidity_offset_history.buckets.iter().take(32 - min_idx) {
1986                                         total_valid_points_tracked += (*min_bucket as u64) * (*max_bucket as u64);
1987                                 }
1988                         }
1989
1990                         // If the total valid points is smaller than 1.0 (i.e. 32 in our fixed-point scheme),
1991                         // treat it as if we were fully decayed.
1992                         const FULLY_DECAYED: u16 = BUCKET_FIXED_POINT_ONE * BUCKET_FIXED_POINT_ONE;
1993                         if total_valid_points_tracked < FULLY_DECAYED.into() {
1994                                 return None;
1995                         }
1996
1997                         let mut cumulative_success_prob_times_billion = 0;
1998                         // Special-case the 0th min bucket - it generally means we failed a payment, so only
1999                         // consider the highest (i.e. largest-offset-from-max-capacity) max bucket for all
2000                         // points against the 0th min bucket. This avoids the case where we fail to route
2001                         // increasingly lower values over a channel, but treat each failure as a separate
2002                         // datapoint, many of which may have relatively high maximum-available-liquidity
2003                         // values, which will result in us thinking we have some nontrivial probability of
2004                         // routing up to that amount.
2005                         if self.min_liquidity_offset_history.buckets[0] != 0 {
2006                                 let mut highest_max_bucket_with_points = 0; // The highest max-bucket with any data
2007                                 let mut total_max_points = 0; // Total points in max-buckets to consider
2008                                 for (max_idx, max_bucket) in self.max_liquidity_offset_history.buckets.iter().enumerate() {
2009                                         if *max_bucket >= BUCKET_FIXED_POINT_ONE {
2010                                                 highest_max_bucket_with_points = cmp::max(highest_max_bucket_with_points, max_idx);
2011                                         }
2012                                         total_max_points += *max_bucket as u64;
2013                                 }
2014                                 let max_bucket_end_pos = BUCKET_START_POS[32 - highest_max_bucket_with_points] - 1;
2015                                 if payment_pos < max_bucket_end_pos {
2016                                         let (numerator, denominator) = success_probability(payment_pos as u64, 0,
2017                                                 max_bucket_end_pos as u64, POSITION_TICKS as u64 - 1, params, true);
2018                                         let bucket_prob_times_billion =
2019                                                 (self.min_liquidity_offset_history.buckets[0] as u64) * total_max_points
2020                                                         * 1024 * 1024 * 1024 / total_valid_points_tracked;
2021                                         cumulative_success_prob_times_billion += bucket_prob_times_billion *
2022                                                 numerator / denominator;
2023                                 }
2024                         }
2025
2026                         for (min_idx, min_bucket) in self.min_liquidity_offset_history.buckets.iter().enumerate().skip(1) {
2027                                 let min_bucket_start_pos = BUCKET_START_POS[min_idx];
2028                                 for (max_idx, max_bucket) in self.max_liquidity_offset_history.buckets.iter().enumerate().take(32 - min_idx) {
2029                                         let max_bucket_end_pos = BUCKET_START_POS[32 - max_idx] - 1;
2030                                         // Note that this multiply can only barely not overflow - two 16 bit ints plus
2031                                         // 30 bits is 62 bits.
2032                                         let bucket_prob_times_billion = (*min_bucket as u64) * (*max_bucket as u64)
2033                                                 * 1024 * 1024 * 1024 / total_valid_points_tracked;
2034                                         if payment_pos >= max_bucket_end_pos {
2035                                                 // Success probability 0, the payment amount may be above the max liquidity
2036                                                 break;
2037                                         } else if payment_pos < min_bucket_start_pos {
2038                                                 cumulative_success_prob_times_billion += bucket_prob_times_billion;
2039                                         } else {
2040                                                 let (numerator, denominator) = success_probability(payment_pos as u64,
2041                                                         min_bucket_start_pos as u64, max_bucket_end_pos as u64,
2042                                                         POSITION_TICKS as u64 - 1, params, true);
2043                                                 cumulative_success_prob_times_billion += bucket_prob_times_billion *
2044                                                         numerator / denominator;
2045                                         }
2046                                 }
2047                         }
2048
2049                         Some(cumulative_success_prob_times_billion)
2050                 }
2051         }
2052 }
2053 use bucketed_history::{LegacyHistoricalBucketRangeTracker, HistoricalBucketRangeTracker, HistoricalMinMaxBuckets};
2054
2055 impl<G: Deref<Target = NetworkGraph<L>>, L: Deref> Writeable for ProbabilisticScorer<G, L> where L::Target: Logger {
2056         #[inline]
2057         fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
2058                 write_tlv_fields!(w, {
2059                         (0, self.channel_liquidities, required),
2060                 });
2061                 Ok(())
2062         }
2063 }
2064
2065 impl<G: Deref<Target = NetworkGraph<L>>, L: Deref>
2066 ReadableArgs<(ProbabilisticScoringDecayParameters, G, L)> for ProbabilisticScorer<G, L> where L::Target: Logger {
2067         #[inline]
2068         fn read<R: Read>(
2069                 r: &mut R, args: (ProbabilisticScoringDecayParameters, G, L)
2070         ) -> Result<Self, DecodeError> {
2071                 let (decay_params, network_graph, logger) = args;
2072                 let mut channel_liquidities = HashMap::new();
2073                 read_tlv_fields!(r, {
2074                         (0, channel_liquidities, required),
2075                 });
2076                 Ok(Self {
2077                         decay_params,
2078                         network_graph,
2079                         logger,
2080                         channel_liquidities,
2081                 })
2082         }
2083 }
2084
2085 impl Writeable for ChannelLiquidity {
2086         #[inline]
2087         fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
2088                 write_tlv_fields!(w, {
2089                         (0, self.min_liquidity_offset_msat, required),
2090                         // 1 was the min_liquidity_offset_history in octile form
2091                         (2, self.max_liquidity_offset_msat, required),
2092                         // 3 was the max_liquidity_offset_history in octile form
2093                         (4, self.last_updated, required),
2094                         (5, Some(self.min_liquidity_offset_history), option),
2095                         (7, Some(self.max_liquidity_offset_history), option),
2096                         (9, self.offset_history_last_updated, required),
2097                 });
2098                 Ok(())
2099         }
2100 }
2101
2102 impl Readable for ChannelLiquidity {
2103         #[inline]
2104         fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
2105                 let mut min_liquidity_offset_msat = 0;
2106                 let mut max_liquidity_offset_msat = 0;
2107                 let mut legacy_min_liq_offset_history: Option<LegacyHistoricalBucketRangeTracker> = None;
2108                 let mut legacy_max_liq_offset_history: Option<LegacyHistoricalBucketRangeTracker> = None;
2109                 let mut min_liquidity_offset_history: Option<HistoricalBucketRangeTracker> = None;
2110                 let mut max_liquidity_offset_history: Option<HistoricalBucketRangeTracker> = None;
2111                 let mut last_updated = Duration::from_secs(0);
2112                 let mut offset_history_last_updated = None;
2113                 read_tlv_fields!(r, {
2114                         (0, min_liquidity_offset_msat, required),
2115                         (1, legacy_min_liq_offset_history, option),
2116                         (2, max_liquidity_offset_msat, required),
2117                         (3, legacy_max_liq_offset_history, option),
2118                         (4, last_updated, required),
2119                         (5, min_liquidity_offset_history, option),
2120                         (7, max_liquidity_offset_history, option),
2121                         (9, offset_history_last_updated, option),
2122                 });
2123
2124                 if min_liquidity_offset_history.is_none() {
2125                         if let Some(legacy_buckets) = legacy_min_liq_offset_history {
2126                                 min_liquidity_offset_history = Some(legacy_buckets.into_current());
2127                         } else {
2128                                 min_liquidity_offset_history = Some(HistoricalBucketRangeTracker::new());
2129                         }
2130                 }
2131                 if max_liquidity_offset_history.is_none() {
2132                         if let Some(legacy_buckets) = legacy_max_liq_offset_history {
2133                                 max_liquidity_offset_history = Some(legacy_buckets.into_current());
2134                         } else {
2135                                 max_liquidity_offset_history = Some(HistoricalBucketRangeTracker::new());
2136                         }
2137                 }
2138                 Ok(Self {
2139                         min_liquidity_offset_msat,
2140                         max_liquidity_offset_msat,
2141                         min_liquidity_offset_history: min_liquidity_offset_history.unwrap(),
2142                         max_liquidity_offset_history: max_liquidity_offset_history.unwrap(),
2143                         last_updated,
2144                         offset_history_last_updated: offset_history_last_updated.unwrap_or(last_updated),
2145                 })
2146         }
2147 }
2148
2149 #[cfg(test)]
2150 mod tests {
2151         use super::{ChannelLiquidity, HistoricalBucketRangeTracker, ProbabilisticScoringFeeParameters, ProbabilisticScoringDecayParameters, ProbabilisticScorer};
2152         use crate::blinded_path::{BlindedHop, BlindedPath};
2153         use crate::util::config::UserConfig;
2154         use crate::util::time::tests::SinceEpoch;
2155
2156         use crate::ln::channelmanager;
2157         use crate::ln::msgs::{ChannelAnnouncement, ChannelUpdate, UnsignedChannelAnnouncement, UnsignedChannelUpdate};
2158         use crate::routing::gossip::{EffectiveCapacity, NetworkGraph, NodeId};
2159         use crate::routing::router::{BlindedTail, Path, RouteHop, CandidateRouteHop};
2160         use crate::routing::scoring::{ChannelUsage, ScoreLookUp, ScoreUpdate};
2161         use crate::util::ser::{ReadableArgs, Writeable};
2162         use crate::util::test_utils::{self, TestLogger};
2163
2164         use bitcoin::blockdata::constants::ChainHash;
2165         use bitcoin::hashes::Hash;
2166         use bitcoin::hashes::sha256d::Hash as Sha256dHash;
2167         use bitcoin::network::constants::Network;
2168         use bitcoin::secp256k1::{PublicKey, Secp256k1, SecretKey};
2169         use core::time::Duration;
2170         use crate::io;
2171
2172         fn source_privkey() -> SecretKey {
2173                 SecretKey::from_slice(&[42; 32]).unwrap()
2174         }
2175
2176         fn target_privkey() -> SecretKey {
2177                 SecretKey::from_slice(&[43; 32]).unwrap()
2178         }
2179
2180         fn source_pubkey() -> PublicKey {
2181                 let secp_ctx = Secp256k1::new();
2182                 PublicKey::from_secret_key(&secp_ctx, &source_privkey())
2183         }
2184
2185         fn target_pubkey() -> PublicKey {
2186                 let secp_ctx = Secp256k1::new();
2187                 PublicKey::from_secret_key(&secp_ctx, &target_privkey())
2188         }
2189
2190         fn source_node_id() -> NodeId {
2191                 NodeId::from_pubkey(&source_pubkey())
2192         }
2193
2194         fn target_node_id() -> NodeId {
2195                 NodeId::from_pubkey(&target_pubkey())
2196         }
2197
2198         // `ProbabilisticScorer` tests
2199
2200         fn sender_privkey() -> SecretKey {
2201                 SecretKey::from_slice(&[41; 32]).unwrap()
2202         }
2203
2204         fn recipient_privkey() -> SecretKey {
2205                 SecretKey::from_slice(&[45; 32]).unwrap()
2206         }
2207
2208         fn sender_pubkey() -> PublicKey {
2209                 let secp_ctx = Secp256k1::new();
2210                 PublicKey::from_secret_key(&secp_ctx, &sender_privkey())
2211         }
2212
2213         fn recipient_pubkey() -> PublicKey {
2214                 let secp_ctx = Secp256k1::new();
2215                 PublicKey::from_secret_key(&secp_ctx, &recipient_privkey())
2216         }
2217
2218         fn recipient_node_id() -> NodeId {
2219                 NodeId::from_pubkey(&recipient_pubkey())
2220         }
2221
2222         fn network_graph(logger: &TestLogger) -> NetworkGraph<&TestLogger> {
2223                 let mut network_graph = NetworkGraph::new(Network::Testnet, logger);
2224                 add_channel(&mut network_graph, 42, source_privkey(), target_privkey());
2225                 add_channel(&mut network_graph, 43, target_privkey(), recipient_privkey());
2226
2227                 network_graph
2228         }
2229
2230         fn add_channel(
2231                 network_graph: &mut NetworkGraph<&TestLogger>, short_channel_id: u64, node_1_key: SecretKey,
2232                 node_2_key: SecretKey
2233         ) {
2234                 let genesis_hash = ChainHash::using_genesis_block(Network::Testnet);
2235                 let node_1_secret = &SecretKey::from_slice(&[39; 32]).unwrap();
2236                 let node_2_secret = &SecretKey::from_slice(&[40; 32]).unwrap();
2237                 let secp_ctx = Secp256k1::new();
2238                 let unsigned_announcement = UnsignedChannelAnnouncement {
2239                         features: channelmanager::provided_channel_features(&UserConfig::default()),
2240                         chain_hash: genesis_hash,
2241                         short_channel_id,
2242                         node_id_1: NodeId::from_pubkey(&PublicKey::from_secret_key(&secp_ctx, &node_1_key)),
2243                         node_id_2: NodeId::from_pubkey(&PublicKey::from_secret_key(&secp_ctx, &node_2_key)),
2244                         bitcoin_key_1: NodeId::from_pubkey(&PublicKey::from_secret_key(&secp_ctx, &node_1_secret)),
2245                         bitcoin_key_2: NodeId::from_pubkey(&PublicKey::from_secret_key(&secp_ctx, &node_2_secret)),
2246                         excess_data: Vec::new(),
2247                 };
2248                 let msghash = hash_to_message!(&Sha256dHash::hash(&unsigned_announcement.encode()[..])[..]);
2249                 let signed_announcement = ChannelAnnouncement {
2250                         node_signature_1: secp_ctx.sign_ecdsa(&msghash, &node_1_key),
2251                         node_signature_2: secp_ctx.sign_ecdsa(&msghash, &node_2_key),
2252                         bitcoin_signature_1: secp_ctx.sign_ecdsa(&msghash, &node_1_secret),
2253                         bitcoin_signature_2: secp_ctx.sign_ecdsa(&msghash, &node_2_secret),
2254                         contents: unsigned_announcement,
2255                 };
2256                 let chain_source: Option<&crate::util::test_utils::TestChainSource> = None;
2257                 network_graph.update_channel_from_announcement(
2258                         &signed_announcement, &chain_source).unwrap();
2259                 update_channel(network_graph, short_channel_id, node_1_key, 0, 1_000, 100);
2260                 update_channel(network_graph, short_channel_id, node_2_key, 1, 0, 100);
2261         }
2262
2263         fn update_channel(
2264                 network_graph: &mut NetworkGraph<&TestLogger>, short_channel_id: u64, node_key: SecretKey,
2265                 flags: u8, htlc_maximum_msat: u64, timestamp: u32,
2266         ) {
2267                 let genesis_hash = ChainHash::using_genesis_block(Network::Testnet);
2268                 let secp_ctx = Secp256k1::new();
2269                 let unsigned_update = UnsignedChannelUpdate {
2270                         chain_hash: genesis_hash,
2271                         short_channel_id,
2272                         timestamp,
2273                         flags,
2274                         cltv_expiry_delta: 18,
2275                         htlc_minimum_msat: 0,
2276                         htlc_maximum_msat,
2277                         fee_base_msat: 1,
2278                         fee_proportional_millionths: 0,
2279                         excess_data: Vec::new(),
2280                 };
2281                 let msghash = hash_to_message!(&Sha256dHash::hash(&unsigned_update.encode()[..])[..]);
2282                 let signed_update = ChannelUpdate {
2283                         signature: secp_ctx.sign_ecdsa(&msghash, &node_key),
2284                         contents: unsigned_update,
2285                 };
2286                 network_graph.update_channel(&signed_update).unwrap();
2287         }
2288
2289         fn path_hop(pubkey: PublicKey, short_channel_id: u64, fee_msat: u64) -> RouteHop {
2290                 let config = UserConfig::default();
2291                 RouteHop {
2292                         pubkey,
2293                         node_features: channelmanager::provided_node_features(&config),
2294                         short_channel_id,
2295                         channel_features: channelmanager::provided_channel_features(&config),
2296                         fee_msat,
2297                         cltv_expiry_delta: 18,
2298                         maybe_announced_channel: true,
2299                 }
2300         }
2301
2302         fn payment_path_for_amount(amount_msat: u64) -> Path {
2303                 Path {
2304                         hops: vec![
2305                                 path_hop(source_pubkey(), 41, 1),
2306                                 path_hop(target_pubkey(), 42, 2),
2307                                 path_hop(recipient_pubkey(), 43, amount_msat),
2308                         ], blinded_tail: None,
2309                 }
2310         }
2311
2312         #[test]
2313         fn liquidity_bounds_directed_from_lowest_node_id() {
2314                 let logger = TestLogger::new();
2315                 let last_updated = Duration::ZERO;
2316                 let offset_history_last_updated = Duration::ZERO;
2317                 let network_graph = network_graph(&logger);
2318                 let decay_params = ProbabilisticScoringDecayParameters::default();
2319                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger)
2320                         .with_channel(42,
2321                                 ChannelLiquidity {
2322                                         min_liquidity_offset_msat: 700, max_liquidity_offset_msat: 100,
2323                                         last_updated, offset_history_last_updated,
2324                                         min_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2325                                         max_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2326                                 })
2327                         .with_channel(43,
2328                                 ChannelLiquidity {
2329                                         min_liquidity_offset_msat: 700, max_liquidity_offset_msat: 100,
2330                                         last_updated, offset_history_last_updated,
2331                                         min_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2332                                         max_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2333                                 });
2334                 let source = source_node_id();
2335                 let target = target_node_id();
2336                 let recipient = recipient_node_id();
2337                 assert!(source > target);
2338                 assert!(target < recipient);
2339
2340                 // Update minimum liquidity.
2341
2342                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2343                         .as_directed(&source, &target, 1_000);
2344                 assert_eq!(liquidity.min_liquidity_msat(), 100);
2345                 assert_eq!(liquidity.max_liquidity_msat(), 300);
2346
2347                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2348                         .as_directed(&target, &source, 1_000);
2349                 assert_eq!(liquidity.min_liquidity_msat(), 700);
2350                 assert_eq!(liquidity.max_liquidity_msat(), 900);
2351
2352                 scorer.channel_liquidities.get_mut(&42).unwrap()
2353                         .as_directed_mut(&source, &target, 1_000)
2354                         .set_min_liquidity_msat(200, Duration::ZERO);
2355
2356                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2357                         .as_directed(&source, &target, 1_000);
2358                 assert_eq!(liquidity.min_liquidity_msat(), 200);
2359                 assert_eq!(liquidity.max_liquidity_msat(), 300);
2360
2361                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2362                         .as_directed(&target, &source, 1_000);
2363                 assert_eq!(liquidity.min_liquidity_msat(), 700);
2364                 assert_eq!(liquidity.max_liquidity_msat(), 800);
2365
2366                 // Update maximum liquidity.
2367
2368                 let liquidity = scorer.channel_liquidities.get(&43).unwrap()
2369                         .as_directed(&target, &recipient, 1_000);
2370                 assert_eq!(liquidity.min_liquidity_msat(), 700);
2371                 assert_eq!(liquidity.max_liquidity_msat(), 900);
2372
2373                 let liquidity = scorer.channel_liquidities.get(&43).unwrap()
2374                         .as_directed(&recipient, &target, 1_000);
2375                 assert_eq!(liquidity.min_liquidity_msat(), 100);
2376                 assert_eq!(liquidity.max_liquidity_msat(), 300);
2377
2378                 scorer.channel_liquidities.get_mut(&43).unwrap()
2379                         .as_directed_mut(&target, &recipient, 1_000)
2380                         .set_max_liquidity_msat(200, Duration::ZERO);
2381
2382                 let liquidity = scorer.channel_liquidities.get(&43).unwrap()
2383                         .as_directed(&target, &recipient, 1_000);
2384                 assert_eq!(liquidity.min_liquidity_msat(), 0);
2385                 assert_eq!(liquidity.max_liquidity_msat(), 200);
2386
2387                 let liquidity = scorer.channel_liquidities.get(&43).unwrap()
2388                         .as_directed(&recipient, &target, 1_000);
2389                 assert_eq!(liquidity.min_liquidity_msat(), 800);
2390                 assert_eq!(liquidity.max_liquidity_msat(), 1000);
2391         }
2392
2393         #[test]
2394         fn resets_liquidity_upper_bound_when_crossed_by_lower_bound() {
2395                 let logger = TestLogger::new();
2396                 let last_updated = Duration::ZERO;
2397                 let offset_history_last_updated = Duration::ZERO;
2398                 let network_graph = network_graph(&logger);
2399                 let decay_params = ProbabilisticScoringDecayParameters::default();
2400                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger)
2401                         .with_channel(42,
2402                                 ChannelLiquidity {
2403                                         min_liquidity_offset_msat: 200, max_liquidity_offset_msat: 400,
2404                                         last_updated, offset_history_last_updated,
2405                                         min_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2406                                         max_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2407                                 });
2408                 let source = source_node_id();
2409                 let target = target_node_id();
2410                 assert!(source > target);
2411
2412                 // Check initial bounds.
2413                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2414                         .as_directed(&source, &target, 1_000);
2415                 assert_eq!(liquidity.min_liquidity_msat(), 400);
2416                 assert_eq!(liquidity.max_liquidity_msat(), 800);
2417
2418                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2419                         .as_directed(&target, &source, 1_000);
2420                 assert_eq!(liquidity.min_liquidity_msat(), 200);
2421                 assert_eq!(liquidity.max_liquidity_msat(), 600);
2422
2423                 // Reset from source to target.
2424                 scorer.channel_liquidities.get_mut(&42).unwrap()
2425                         .as_directed_mut(&source, &target, 1_000)
2426                         .set_min_liquidity_msat(900, Duration::ZERO);
2427
2428                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2429                         .as_directed(&source, &target, 1_000);
2430                 assert_eq!(liquidity.min_liquidity_msat(), 900);
2431                 assert_eq!(liquidity.max_liquidity_msat(), 1_000);
2432
2433                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2434                         .as_directed(&target, &source, 1_000);
2435                 assert_eq!(liquidity.min_liquidity_msat(), 0);
2436                 assert_eq!(liquidity.max_liquidity_msat(), 100);
2437
2438                 // Reset from target to source.
2439                 scorer.channel_liquidities.get_mut(&42).unwrap()
2440                         .as_directed_mut(&target, &source, 1_000)
2441                         .set_min_liquidity_msat(400, Duration::ZERO);
2442
2443                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2444                         .as_directed(&source, &target, 1_000);
2445                 assert_eq!(liquidity.min_liquidity_msat(), 0);
2446                 assert_eq!(liquidity.max_liquidity_msat(), 600);
2447
2448                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2449                         .as_directed(&target, &source, 1_000);
2450                 assert_eq!(liquidity.min_liquidity_msat(), 400);
2451                 assert_eq!(liquidity.max_liquidity_msat(), 1_000);
2452         }
2453
2454         #[test]
2455         fn resets_liquidity_lower_bound_when_crossed_by_upper_bound() {
2456                 let logger = TestLogger::new();
2457                 let last_updated = Duration::ZERO;
2458                 let offset_history_last_updated = Duration::ZERO;
2459                 let network_graph = network_graph(&logger);
2460                 let decay_params = ProbabilisticScoringDecayParameters::default();
2461                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger)
2462                         .with_channel(42,
2463                                 ChannelLiquidity {
2464                                         min_liquidity_offset_msat: 200, max_liquidity_offset_msat: 400,
2465                                         last_updated, offset_history_last_updated,
2466                                         min_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2467                                         max_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2468                                 });
2469                 let source = source_node_id();
2470                 let target = target_node_id();
2471                 assert!(source > target);
2472
2473                 // Check initial bounds.
2474                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2475                         .as_directed(&source, &target, 1_000);
2476                 assert_eq!(liquidity.min_liquidity_msat(), 400);
2477                 assert_eq!(liquidity.max_liquidity_msat(), 800);
2478
2479                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2480                         .as_directed(&target, &source, 1_000);
2481                 assert_eq!(liquidity.min_liquidity_msat(), 200);
2482                 assert_eq!(liquidity.max_liquidity_msat(), 600);
2483
2484                 // Reset from source to target.
2485                 scorer.channel_liquidities.get_mut(&42).unwrap()
2486                         .as_directed_mut(&source, &target, 1_000)
2487                         .set_max_liquidity_msat(300, Duration::ZERO);
2488
2489                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2490                         .as_directed(&source, &target, 1_000);
2491                 assert_eq!(liquidity.min_liquidity_msat(), 0);
2492                 assert_eq!(liquidity.max_liquidity_msat(), 300);
2493
2494                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2495                         .as_directed(&target, &source, 1_000);
2496                 assert_eq!(liquidity.min_liquidity_msat(), 700);
2497                 assert_eq!(liquidity.max_liquidity_msat(), 1_000);
2498
2499                 // Reset from target to source.
2500                 scorer.channel_liquidities.get_mut(&42).unwrap()
2501                         .as_directed_mut(&target, &source, 1_000)
2502                         .set_max_liquidity_msat(600, Duration::ZERO);
2503
2504                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2505                         .as_directed(&source, &target, 1_000);
2506                 assert_eq!(liquidity.min_liquidity_msat(), 400);
2507                 assert_eq!(liquidity.max_liquidity_msat(), 1_000);
2508
2509                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2510                         .as_directed(&target, &source, 1_000);
2511                 assert_eq!(liquidity.min_liquidity_msat(), 0);
2512                 assert_eq!(liquidity.max_liquidity_msat(), 600);
2513         }
2514
2515         #[test]
2516         fn increased_penalty_nearing_liquidity_upper_bound() {
2517                 let logger = TestLogger::new();
2518                 let network_graph = network_graph(&logger);
2519                 let params = ProbabilisticScoringFeeParameters {
2520                         liquidity_penalty_multiplier_msat: 1_000,
2521                         ..ProbabilisticScoringFeeParameters::zero_penalty()
2522                 };
2523                 let decay_params = ProbabilisticScoringDecayParameters::default();
2524                 let scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
2525                 let source = source_node_id();
2526
2527                 let usage = ChannelUsage {
2528                         amount_msat: 1_024,
2529                         inflight_htlc_msat: 0,
2530                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024_000, htlc_maximum_msat: 1_000 },
2531                 };
2532                 let network_graph = network_graph.read_only();
2533                 let channel = network_graph.channel(42).unwrap();
2534                 let (info, _) = channel.as_directed_from(&source).unwrap();
2535                 let candidate = CandidateRouteHop::PublicHop {
2536                         info,
2537                         short_channel_id: 42,
2538                 };
2539                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2540                 let usage = ChannelUsage { amount_msat: 10_240, ..usage };
2541                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2542                 let usage = ChannelUsage { amount_msat: 102_400, ..usage };
2543                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 47);
2544                 let usage = ChannelUsage { amount_msat: 1_023_999, ..usage };
2545                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 2_000);
2546
2547                 let usage = ChannelUsage {
2548                         amount_msat: 128,
2549                         inflight_htlc_msat: 0,
2550                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024, htlc_maximum_msat: 1_000 },
2551                 };
2552                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 58);
2553                 let usage = ChannelUsage { amount_msat: 256, ..usage };
2554                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 125);
2555                 let usage = ChannelUsage { amount_msat: 374, ..usage };
2556                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 198);
2557                 let usage = ChannelUsage { amount_msat: 512, ..usage };
2558                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 300);
2559                 let usage = ChannelUsage { amount_msat: 640, ..usage };
2560                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 425);
2561                 let usage = ChannelUsage { amount_msat: 768, ..usage };
2562                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 602);
2563                 let usage = ChannelUsage { amount_msat: 896, ..usage };
2564                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 902);
2565         }
2566
2567         #[test]
2568         fn constant_penalty_outside_liquidity_bounds() {
2569                 let logger = TestLogger::new();
2570                 let last_updated = Duration::ZERO;
2571                 let offset_history_last_updated = Duration::ZERO;
2572                 let network_graph = network_graph(&logger);
2573                 let params = ProbabilisticScoringFeeParameters {
2574                         liquidity_penalty_multiplier_msat: 1_000,
2575                         considered_impossible_penalty_msat: u64::max_value(),
2576                         ..ProbabilisticScoringFeeParameters::zero_penalty()
2577                 };
2578                 let decay_params = ProbabilisticScoringDecayParameters {
2579                         ..ProbabilisticScoringDecayParameters::zero_penalty()
2580                 };
2581                 let scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger)
2582                         .with_channel(42,
2583                                 ChannelLiquidity {
2584                                         min_liquidity_offset_msat: 40, max_liquidity_offset_msat: 40,
2585                                         last_updated, offset_history_last_updated,
2586                                         min_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2587                                         max_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2588                                 });
2589                 let source = source_node_id();
2590
2591                 let usage = ChannelUsage {
2592                         amount_msat: 39,
2593                         inflight_htlc_msat: 0,
2594                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 100, htlc_maximum_msat: 1_000 },
2595                 };
2596                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
2597                 let (info, _) = channel.as_directed_from(&source).unwrap();
2598                 let candidate = CandidateRouteHop::PublicHop {
2599                         info,
2600                         short_channel_id: 42,
2601                 };
2602                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2603                 let usage = ChannelUsage { amount_msat: 50, ..usage };
2604                 assert_ne!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2605                 assert_ne!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
2606                 let usage = ChannelUsage { amount_msat: 61, ..usage };
2607                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
2608         }
2609
2610         #[test]
2611         fn does_not_further_penalize_own_channel() {
2612                 let logger = TestLogger::new();
2613                 let network_graph = network_graph(&logger);
2614                 let params = ProbabilisticScoringFeeParameters {
2615                         liquidity_penalty_multiplier_msat: 1_000,
2616                         ..ProbabilisticScoringFeeParameters::zero_penalty()
2617                 };
2618                 let mut scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
2619                 let source = source_node_id();
2620                 let usage = ChannelUsage {
2621                         amount_msat: 500,
2622                         inflight_htlc_msat: 0,
2623                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_000, htlc_maximum_msat: 1_000 },
2624                 };
2625                 let failed_path = payment_path_for_amount(500);
2626                 let successful_path = payment_path_for_amount(200);
2627                 let channel = &network_graph.read_only().channel(42).unwrap().to_owned();
2628                 let (info, _) = channel.as_directed_from(&source).unwrap();
2629                 let candidate = CandidateRouteHop::PublicHop {
2630                         info,
2631                         short_channel_id: 41,
2632                 };
2633
2634                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 301);
2635
2636                 scorer.payment_path_failed(&failed_path, 41, Duration::ZERO);
2637                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 301);
2638
2639                 scorer.payment_path_successful(&successful_path, Duration::ZERO);
2640                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 301);
2641         }
2642
2643         #[test]
2644         fn sets_liquidity_lower_bound_on_downstream_failure() {
2645                 let logger = TestLogger::new();
2646                 let network_graph = network_graph(&logger);
2647                 let params = ProbabilisticScoringFeeParameters {
2648                         liquidity_penalty_multiplier_msat: 1_000,
2649                         ..ProbabilisticScoringFeeParameters::zero_penalty()
2650                 };
2651                 let mut scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
2652                 let source = source_node_id();
2653                 let path = payment_path_for_amount(500);
2654
2655                 let usage = ChannelUsage {
2656                         amount_msat: 250,
2657                         inflight_htlc_msat: 0,
2658                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_000, htlc_maximum_msat: 1_000 },
2659                 };
2660                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
2661                 let (info, _) = channel.as_directed_from(&source).unwrap();
2662                 let candidate = CandidateRouteHop::PublicHop {
2663                         info,
2664                         short_channel_id: 42,
2665                 };
2666                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 128);
2667                 let usage = ChannelUsage { amount_msat: 500, ..usage };
2668                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 301);
2669                 let usage = ChannelUsage { amount_msat: 750, ..usage };
2670                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 602);
2671
2672                 scorer.payment_path_failed(&path, 43, Duration::ZERO);
2673
2674                 let usage = ChannelUsage { amount_msat: 250, ..usage };
2675                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2676                 let usage = ChannelUsage { amount_msat: 500, ..usage };
2677                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2678                 let usage = ChannelUsage { amount_msat: 750, ..usage };
2679                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 300);
2680         }
2681
2682         #[test]
2683         fn sets_liquidity_upper_bound_on_failure() {
2684                 let logger = TestLogger::new();
2685                 let network_graph = network_graph(&logger);
2686                 let params = ProbabilisticScoringFeeParameters {
2687                         liquidity_penalty_multiplier_msat: 1_000,
2688                         considered_impossible_penalty_msat: u64::max_value(),
2689                         ..ProbabilisticScoringFeeParameters::zero_penalty()
2690                 };
2691                 let mut scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
2692                 let source = source_node_id();
2693                 let path = payment_path_for_amount(500);
2694
2695                 let usage = ChannelUsage {
2696                         amount_msat: 250,
2697                         inflight_htlc_msat: 0,
2698                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_000, htlc_maximum_msat: 1_000 },
2699                 };
2700                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
2701                 let (info, _) = channel.as_directed_from(&source).unwrap();
2702                 let candidate = CandidateRouteHop::PublicHop {
2703                         info,
2704                         short_channel_id: 42,
2705                 };
2706                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 128);
2707                 let usage = ChannelUsage { amount_msat: 500, ..usage };
2708                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 301);
2709                 let usage = ChannelUsage { amount_msat: 750, ..usage };
2710                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 602);
2711
2712                 scorer.payment_path_failed(&path, 42, Duration::ZERO);
2713
2714                 let usage = ChannelUsage { amount_msat: 250, ..usage };
2715                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 300);
2716                 let usage = ChannelUsage { amount_msat: 500, ..usage };
2717                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
2718                 let usage = ChannelUsage { amount_msat: 750, ..usage };
2719                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
2720         }
2721
2722         #[test]
2723         fn ignores_channels_after_removed_failed_channel() {
2724                 // Previously, if we'd tried to send over a channel which was removed from the network
2725                 // graph before we call `payment_path_failed` (which is the default if the we get a "no
2726                 // such channel" error in the `InvoicePayer`), we would call `failed_downstream` on all
2727                 // channels in the route, even ones which they payment never reached. This tests to ensure
2728                 // we do not score such channels.
2729                 let secp_ctx = Secp256k1::new();
2730                 let logger = TestLogger::new();
2731                 let mut network_graph = NetworkGraph::new(Network::Testnet, &logger);
2732                 let secret_a = SecretKey::from_slice(&[42; 32]).unwrap();
2733                 let secret_b = SecretKey::from_slice(&[43; 32]).unwrap();
2734                 let secret_c = SecretKey::from_slice(&[44; 32]).unwrap();
2735                 let secret_d = SecretKey::from_slice(&[45; 32]).unwrap();
2736                 add_channel(&mut network_graph, 42, secret_a, secret_b);
2737                 // Don't add the channel from B -> C.
2738                 add_channel(&mut network_graph, 44, secret_c, secret_d);
2739
2740                 let pub_a = PublicKey::from_secret_key(&secp_ctx, &secret_a);
2741                 let pub_b = PublicKey::from_secret_key(&secp_ctx, &secret_b);
2742                 let pub_c = PublicKey::from_secret_key(&secp_ctx, &secret_c);
2743                 let pub_d = PublicKey::from_secret_key(&secp_ctx, &secret_d);
2744
2745                 let path = vec![
2746                         path_hop(pub_b, 42, 1),
2747                         path_hop(pub_c, 43, 2),
2748                         path_hop(pub_d, 44, 100),
2749                 ];
2750
2751                 let node_a = NodeId::from_pubkey(&pub_a);
2752                 let node_b = NodeId::from_pubkey(&pub_b);
2753                 let node_c = NodeId::from_pubkey(&pub_c);
2754
2755                 let params = ProbabilisticScoringFeeParameters {
2756                         liquidity_penalty_multiplier_msat: 1_000,
2757                         ..ProbabilisticScoringFeeParameters::zero_penalty()
2758                 };
2759                 let mut scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
2760
2761                 let usage = ChannelUsage {
2762                         amount_msat: 250,
2763                         inflight_htlc_msat: 0,
2764                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_000, htlc_maximum_msat: 1_000 },
2765                 };
2766                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
2767                 let (info, _) = channel.as_directed_from(&node_a).unwrap();
2768                 let candidate = CandidateRouteHop::PublicHop {
2769                         info,
2770                         short_channel_id: 42,
2771                 };
2772                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 128);
2773                 // Note that a default liquidity bound is used for B -> C as no channel exists
2774                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
2775                 let (info, _) = channel.as_directed_from(&node_b).unwrap();
2776                 let candidate = CandidateRouteHop::PublicHop {
2777                         info,
2778                         short_channel_id: 43,
2779                 };
2780                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 128);
2781                 let channel = network_graph.read_only().channel(44).unwrap().to_owned();
2782                 let (info, _) = channel.as_directed_from(&node_c).unwrap();
2783                 let candidate = CandidateRouteHop::PublicHop {
2784                         info,
2785                         short_channel_id: 44,
2786                 };
2787                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 128);
2788
2789                 scorer.payment_path_failed(&Path { hops: path, blinded_tail: None }, 43, Duration::ZERO);
2790
2791                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
2792                 let (info, _) = channel.as_directed_from(&node_a).unwrap();
2793                 let candidate = CandidateRouteHop::PublicHop {
2794                         info,
2795                         short_channel_id: 42,
2796                 };
2797                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 80);
2798                 // Note that a default liquidity bound is used for B -> C as no channel exists
2799                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
2800                 let (info, _) = channel.as_directed_from(&node_b).unwrap();
2801                 let candidate = CandidateRouteHop::PublicHop {
2802                         info,
2803                         short_channel_id: 43,
2804                 };
2805                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 128);
2806                 let channel = network_graph.read_only().channel(44).unwrap().to_owned();
2807                 let (info, _) = channel.as_directed_from(&node_c).unwrap();
2808                 let candidate = CandidateRouteHop::PublicHop {
2809                         info,
2810                         short_channel_id: 44,
2811                 };
2812                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 128);
2813         }
2814
2815         #[test]
2816         fn reduces_liquidity_upper_bound_along_path_on_success() {
2817                 let logger = TestLogger::new();
2818                 let network_graph = network_graph(&logger);
2819                 let params = ProbabilisticScoringFeeParameters {
2820                         liquidity_penalty_multiplier_msat: 1_000,
2821                         ..ProbabilisticScoringFeeParameters::zero_penalty()
2822                 };
2823                 let mut scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
2824                 let source = source_node_id();
2825                 let usage = ChannelUsage {
2826                         amount_msat: 250,
2827                         inflight_htlc_msat: 0,
2828                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_000, htlc_maximum_msat: 1_000 },
2829                 };
2830                 let network_graph = network_graph.read_only().channels().clone();
2831                 let channel_42 = network_graph.get(&42).unwrap();
2832                 let channel_43 = network_graph.get(&43).unwrap();
2833                 let (info, _) = channel_42.as_directed_from(&source).unwrap();
2834                 let candidate_41 = CandidateRouteHop::PublicHop {
2835                         info,
2836                         short_channel_id: 41,
2837                 };
2838                 let (info, target) = channel_42.as_directed_from(&source).unwrap();
2839                 let candidate_42 = CandidateRouteHop::PublicHop {
2840                         info,
2841                         short_channel_id: 42,
2842                 };
2843                 let (info, _) = channel_43.as_directed_from(&target).unwrap();
2844                 let candidate_43 = CandidateRouteHop::PublicHop {
2845                         info,
2846                         short_channel_id: 43,
2847                 };
2848                 assert_eq!(scorer.channel_penalty_msat(&candidate_41, usage, &params), 128);
2849                 assert_eq!(scorer.channel_penalty_msat(&candidate_42, usage, &params), 128);
2850                 assert_eq!(scorer.channel_penalty_msat(&candidate_43, usage, &params), 128);
2851
2852                 scorer.payment_path_successful(&payment_path_for_amount(500), Duration::ZERO);
2853
2854                 assert_eq!(scorer.channel_penalty_msat(&candidate_41, usage, &params), 128);
2855                 assert_eq!(scorer.channel_penalty_msat(&candidate_42, usage, &params), 300);
2856                 assert_eq!(scorer.channel_penalty_msat(&candidate_43, usage, &params), 300);
2857         }
2858
2859         #[test]
2860         fn decays_liquidity_bounds_over_time() {
2861                 let logger = TestLogger::new();
2862                 let network_graph = network_graph(&logger);
2863                 let params = ProbabilisticScoringFeeParameters {
2864                         liquidity_penalty_multiplier_msat: 1_000,
2865                         considered_impossible_penalty_msat: u64::max_value(),
2866                         ..ProbabilisticScoringFeeParameters::zero_penalty()
2867                 };
2868                 let decay_params = ProbabilisticScoringDecayParameters {
2869                         liquidity_offset_half_life: Duration::from_secs(10),
2870                         ..ProbabilisticScoringDecayParameters::zero_penalty()
2871                 };
2872                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
2873                 let source = source_node_id();
2874
2875                 let usage = ChannelUsage {
2876                         amount_msat: 0,
2877                         inflight_htlc_msat: 0,
2878                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024, htlc_maximum_msat: 1_024 },
2879                 };
2880                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
2881                 let (info, _) = channel.as_directed_from(&source).unwrap();
2882                 let candidate = CandidateRouteHop::PublicHop {
2883                         info,
2884                         short_channel_id: 42,
2885                 };
2886                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2887                 let usage = ChannelUsage { amount_msat: 1_023, ..usage };
2888                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 2_000);
2889
2890                 scorer.payment_path_failed(&payment_path_for_amount(768), 42, Duration::ZERO);
2891                 scorer.payment_path_failed(&payment_path_for_amount(128), 43, Duration::ZERO);
2892
2893                 // Initial penalties
2894                 let usage = ChannelUsage { amount_msat: 128, ..usage };
2895                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2896                 let usage = ChannelUsage { amount_msat: 256, ..usage };
2897                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 93);
2898                 let usage = ChannelUsage { amount_msat: 768, ..usage };
2899                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 1_479);
2900                 let usage = ChannelUsage { amount_msat: 896, ..usage };
2901                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
2902
2903                 // Half decay (i.e., three-quarter life)
2904                 SinceEpoch::advance(Duration::from_secs(5));
2905                 scorer.time_passed(Duration::from_secs(5));
2906                 let usage = ChannelUsage { amount_msat: 128, ..usage };
2907                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 22);
2908                 let usage = ChannelUsage { amount_msat: 256, ..usage };
2909                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 106);
2910                 let usage = ChannelUsage { amount_msat: 768, ..usage };
2911                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 921);
2912                 let usage = ChannelUsage { amount_msat: 896, ..usage };
2913                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
2914
2915                 // One decay (i.e., half life)
2916                 SinceEpoch::advance(Duration::from_secs(5));
2917                 scorer.time_passed(Duration::from_secs(10));
2918                 let usage = ChannelUsage { amount_msat: 64, ..usage };
2919                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2920                 let usage = ChannelUsage { amount_msat: 128, ..usage };
2921                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 34);
2922                 let usage = ChannelUsage { amount_msat: 896, ..usage };
2923                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 1_970);
2924                 let usage = ChannelUsage { amount_msat: 960, ..usage };
2925                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
2926
2927                 // Fully decay liquidity lower bound.
2928                 SinceEpoch::advance(Duration::from_secs(10 * 7));
2929                 scorer.time_passed(Duration::from_secs(10 * 8));
2930                 let usage = ChannelUsage { amount_msat: 0, ..usage };
2931                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2932                 let usage = ChannelUsage { amount_msat: 1, ..usage };
2933                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2934                 let usage = ChannelUsage { amount_msat: 1_023, ..usage };
2935                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 2_000);
2936                 let usage = ChannelUsage { amount_msat: 1_024, ..usage };
2937                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
2938
2939                 // Fully decay liquidity upper bound.
2940                 SinceEpoch::advance(Duration::from_secs(10));
2941                 scorer.time_passed(Duration::from_secs(10 * 9));
2942                 let usage = ChannelUsage { amount_msat: 0, ..usage };
2943                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2944                 let usage = ChannelUsage { amount_msat: 1_024, ..usage };
2945                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
2946
2947                 SinceEpoch::advance(Duration::from_secs(10));
2948                 scorer.time_passed(Duration::from_secs(10 * 10));
2949                 let usage = ChannelUsage { amount_msat: 0, ..usage };
2950                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2951                 let usage = ChannelUsage { amount_msat: 1_024, ..usage };
2952                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
2953         }
2954
2955         #[test]
2956         fn restricts_liquidity_bounds_after_decay() {
2957                 let logger = TestLogger::new();
2958                 let network_graph = network_graph(&logger);
2959                 let params = ProbabilisticScoringFeeParameters {
2960                         liquidity_penalty_multiplier_msat: 1_000,
2961                         ..ProbabilisticScoringFeeParameters::zero_penalty()
2962                 };
2963                 let decay_params = ProbabilisticScoringDecayParameters {
2964                         liquidity_offset_half_life: Duration::from_secs(10),
2965                         ..ProbabilisticScoringDecayParameters::default()
2966                 };
2967                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
2968                 let source = source_node_id();
2969                 let usage = ChannelUsage {
2970                         amount_msat: 512,
2971                         inflight_htlc_msat: 0,
2972                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024, htlc_maximum_msat: 1_000 },
2973                 };
2974                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
2975                 let (info, _) = channel.as_directed_from(&source).unwrap();
2976                 let candidate = CandidateRouteHop::PublicHop {
2977                         info,
2978                         short_channel_id: 42,
2979                 };
2980
2981                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 300);
2982
2983                 // More knowledge gives higher confidence (256, 768), meaning a lower penalty.
2984                 scorer.payment_path_failed(&payment_path_for_amount(768), 42, Duration::ZERO);
2985                 scorer.payment_path_failed(&payment_path_for_amount(256), 43, Duration::ZERO);
2986                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 281);
2987
2988                 // Decaying knowledge gives less confidence (128, 896), meaning a higher penalty.
2989                 SinceEpoch::advance(Duration::from_secs(10));
2990                 scorer.time_passed(Duration::from_secs(10));
2991                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 291);
2992
2993                 // Reducing the upper bound gives more confidence (128, 832) that the payment amount (512)
2994                 // is closer to the upper bound, meaning a higher penalty.
2995                 scorer.payment_path_successful(&payment_path_for_amount(64), Duration::from_secs(10));
2996                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 331);
2997
2998                 // Increasing the lower bound gives more confidence (256, 832) that the payment amount (512)
2999                 // is closer to the lower bound, meaning a lower penalty.
3000                 scorer.payment_path_failed(&payment_path_for_amount(256), 43, Duration::from_secs(10));
3001                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 245);
3002
3003                 // Further decaying affects the lower bound more than the upper bound (128, 928).
3004                 SinceEpoch::advance(Duration::from_secs(10));
3005                 scorer.time_passed(Duration::from_secs(20));
3006                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 280);
3007         }
3008
3009         #[test]
3010         fn restores_persisted_liquidity_bounds() {
3011                 let logger = TestLogger::new();
3012                 let network_graph = network_graph(&logger);
3013                 let params = ProbabilisticScoringFeeParameters {
3014                         liquidity_penalty_multiplier_msat: 1_000,
3015                         considered_impossible_penalty_msat: u64::max_value(),
3016                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3017                 };
3018                 let decay_params = ProbabilisticScoringDecayParameters {
3019                         liquidity_offset_half_life: Duration::from_secs(10),
3020                         ..ProbabilisticScoringDecayParameters::default()
3021                 };
3022                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
3023                 let source = source_node_id();
3024                 let usage = ChannelUsage {
3025                         amount_msat: 500,
3026                         inflight_htlc_msat: 0,
3027                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_000, htlc_maximum_msat: 1_000 },
3028                 };
3029
3030                 scorer.payment_path_failed(&payment_path_for_amount(500), 42, Duration::ZERO);
3031                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
3032                 let (info, _) = channel.as_directed_from(&source).unwrap();
3033                 let candidate = CandidateRouteHop::PublicHop {
3034                         info,
3035                         short_channel_id: 42,
3036                 };
3037                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
3038
3039                 SinceEpoch::advance(Duration::from_secs(10));
3040                 scorer.time_passed(Duration::from_secs(10));
3041                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 473);
3042
3043                 scorer.payment_path_failed(&payment_path_for_amount(250), 43, Duration::from_secs(10));
3044                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 300);
3045
3046                 let mut serialized_scorer = Vec::new();
3047                 scorer.write(&mut serialized_scorer).unwrap();
3048
3049                 let mut serialized_scorer = io::Cursor::new(&serialized_scorer);
3050                 let deserialized_scorer =
3051                         <ProbabilisticScorer<_, _>>::read(&mut serialized_scorer, (decay_params, &network_graph, &logger)).unwrap();
3052                 assert_eq!(deserialized_scorer.channel_penalty_msat(&candidate, usage, &params), 300);
3053         }
3054
3055         fn do_decays_persisted_liquidity_bounds(decay_before_reload: bool) {
3056                 let logger = TestLogger::new();
3057                 let network_graph = network_graph(&logger);
3058                 let params = ProbabilisticScoringFeeParameters {
3059                         liquidity_penalty_multiplier_msat: 1_000,
3060                         considered_impossible_penalty_msat: u64::max_value(),
3061                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3062                 };
3063                 let decay_params = ProbabilisticScoringDecayParameters {
3064                         liquidity_offset_half_life: Duration::from_secs(10),
3065                         ..ProbabilisticScoringDecayParameters::zero_penalty()
3066                 };
3067                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
3068                 let source = source_node_id();
3069                 let usage = ChannelUsage {
3070                         amount_msat: 500,
3071                         inflight_htlc_msat: 0,
3072                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_000, htlc_maximum_msat: 1_000 },
3073                 };
3074
3075                 scorer.payment_path_failed(&payment_path_for_amount(500), 42, Duration::ZERO);
3076                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
3077                 let (info, _) = channel.as_directed_from(&source).unwrap();
3078                 let candidate = CandidateRouteHop::PublicHop {
3079                         info,
3080                         short_channel_id: 42,
3081                 };
3082                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
3083
3084                 if decay_before_reload {
3085                         SinceEpoch::advance(Duration::from_secs(10));
3086                         scorer.time_passed(Duration::from_secs(10));
3087                 }
3088
3089                 let mut serialized_scorer = Vec::new();
3090                 scorer.write(&mut serialized_scorer).unwrap();
3091
3092                 let mut serialized_scorer = io::Cursor::new(&serialized_scorer);
3093                 let mut deserialized_scorer =
3094                         <ProbabilisticScorer<_, _>>::read(&mut serialized_scorer, (decay_params, &network_graph, &logger)).unwrap();
3095                 if !decay_before_reload {
3096                         SinceEpoch::advance(Duration::from_secs(10));
3097                         scorer.time_passed(Duration::from_secs(10));
3098                         deserialized_scorer.time_passed(Duration::from_secs(10));
3099                 }
3100                 assert_eq!(deserialized_scorer.channel_penalty_msat(&candidate, usage, &params), 473);
3101
3102                 scorer.payment_path_failed(&payment_path_for_amount(250), 43, Duration::from_secs(10));
3103                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 300);
3104
3105                 SinceEpoch::advance(Duration::from_secs(10));
3106                 deserialized_scorer.time_passed(Duration::from_secs(20));
3107                 assert_eq!(deserialized_scorer.channel_penalty_msat(&candidate, usage, &params), 370);
3108         }
3109
3110         #[test]
3111         fn decays_persisted_liquidity_bounds() {
3112                 do_decays_persisted_liquidity_bounds(false);
3113                 do_decays_persisted_liquidity_bounds(true);
3114         }
3115
3116         #[test]
3117         fn scores_realistic_payments() {
3118                 // Shows the scores of "realistic" sends of 100k sats over channels of 1-10m sats (with a
3119                 // 50k sat reserve).
3120                 let logger = TestLogger::new();
3121                 let network_graph = network_graph(&logger);
3122                 let params = ProbabilisticScoringFeeParameters::default();
3123                 let scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
3124                 let source = source_node_id();
3125
3126                 let usage = ChannelUsage {
3127                         amount_msat: 100_000_000,
3128                         inflight_htlc_msat: 0,
3129                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 950_000_000, htlc_maximum_msat: 1_000 },
3130                 };
3131                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
3132                 let (info, _) = channel.as_directed_from(&source).unwrap();
3133                 let candidate = CandidateRouteHop::PublicHop {
3134                         info,
3135                         short_channel_id: 42,
3136                 };
3137                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 11497);
3138                 let usage = ChannelUsage {
3139                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_950_000_000, htlc_maximum_msat: 1_000 }, ..usage
3140                 };
3141                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 7408);
3142                 let usage = ChannelUsage {
3143                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 2_950_000_000, htlc_maximum_msat: 1_000 }, ..usage
3144                 };
3145                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 6151);
3146                 let usage = ChannelUsage {
3147                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 3_950_000_000, htlc_maximum_msat: 1_000 }, ..usage
3148                 };
3149                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 5427);
3150                 let usage = ChannelUsage {
3151                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 4_950_000_000, htlc_maximum_msat: 1_000 }, ..usage
3152                 };
3153                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 4955);
3154                 let usage = ChannelUsage {
3155                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 5_950_000_000, htlc_maximum_msat: 1_000 }, ..usage
3156                 };
3157                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 4736);
3158                 let usage = ChannelUsage {
3159                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 6_950_000_000, htlc_maximum_msat: 1_000 }, ..usage
3160                 };
3161                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 4484);
3162                 let usage = ChannelUsage {
3163                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 7_450_000_000, htlc_maximum_msat: 1_000 }, ..usage
3164                 };
3165                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 4484);
3166                 let usage = ChannelUsage {
3167                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 7_950_000_000, htlc_maximum_msat: 1_000 }, ..usage
3168                 };
3169                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 4263);
3170                 let usage = ChannelUsage {
3171                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 8_950_000_000, htlc_maximum_msat: 1_000 }, ..usage
3172                 };
3173                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 4263);
3174                 let usage = ChannelUsage {
3175                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 9_950_000_000, htlc_maximum_msat: 1_000 }, ..usage
3176                 };
3177                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 4044);
3178         }
3179
3180         #[test]
3181         fn adds_base_penalty_to_liquidity_penalty() {
3182                 let logger = TestLogger::new();
3183                 let network_graph = network_graph(&logger);
3184                 let source = source_node_id();
3185                 let usage = ChannelUsage {
3186                         amount_msat: 128,
3187                         inflight_htlc_msat: 0,
3188                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024, htlc_maximum_msat: 1_000 },
3189                 };
3190
3191                 let params = ProbabilisticScoringFeeParameters {
3192                         liquidity_penalty_multiplier_msat: 1_000,
3193                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3194                 };
3195                 let scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
3196                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
3197                 let (info, _) = channel.as_directed_from(&source).unwrap();
3198                 let candidate = CandidateRouteHop::PublicHop {
3199                         info,
3200                         short_channel_id: 42,
3201                 };
3202                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 58);
3203
3204                 let params = ProbabilisticScoringFeeParameters {
3205                         base_penalty_msat: 500, liquidity_penalty_multiplier_msat: 1_000,
3206                         anti_probing_penalty_msat: 0, ..ProbabilisticScoringFeeParameters::zero_penalty()
3207                 };
3208                 let scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
3209                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 558);
3210
3211                 let params = ProbabilisticScoringFeeParameters {
3212                         base_penalty_msat: 500, liquidity_penalty_multiplier_msat: 1_000,
3213                         base_penalty_amount_multiplier_msat: (1 << 30),
3214                         anti_probing_penalty_msat: 0, ..ProbabilisticScoringFeeParameters::zero_penalty()
3215                 };
3216
3217                 let scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
3218                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 558 + 128);
3219         }
3220
3221         #[test]
3222         fn adds_amount_penalty_to_liquidity_penalty() {
3223                 let logger = TestLogger::new();
3224                 let network_graph = network_graph(&logger);
3225                 let source = source_node_id();
3226                 let usage = ChannelUsage {
3227                         amount_msat: 512_000,
3228                         inflight_htlc_msat: 0,
3229                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024_000, htlc_maximum_msat: 1_000 },
3230                 };
3231
3232                 let params = ProbabilisticScoringFeeParameters {
3233                         liquidity_penalty_multiplier_msat: 1_000,
3234                         liquidity_penalty_amount_multiplier_msat: 0,
3235                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3236                 };
3237                 let scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
3238                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
3239                 let (info, _) = channel.as_directed_from(&source).unwrap();
3240                 let candidate = CandidateRouteHop::PublicHop {
3241                         info,
3242                         short_channel_id: 42,
3243                 };
3244                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 300);
3245
3246                 let params = ProbabilisticScoringFeeParameters {
3247                         liquidity_penalty_multiplier_msat: 1_000,
3248                         liquidity_penalty_amount_multiplier_msat: 256,
3249                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3250                 };
3251                 let scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
3252                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 337);
3253         }
3254
3255         #[test]
3256         fn calculates_log10_without_overflowing_u64_max_value() {
3257                 let logger = TestLogger::new();
3258                 let network_graph = network_graph(&logger);
3259                 let source = source_node_id();
3260                 let usage = ChannelUsage {
3261                         amount_msat: u64::max_value(),
3262                         inflight_htlc_msat: 0,
3263                         effective_capacity: EffectiveCapacity::Infinite,
3264                 };
3265                 let params = ProbabilisticScoringFeeParameters {
3266                         liquidity_penalty_multiplier_msat: 40_000,
3267                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3268                 };
3269                 let decay_params = ProbabilisticScoringDecayParameters::zero_penalty();
3270                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
3271                 let (info, _) = channel.as_directed_from(&source).unwrap();
3272                 let candidate = CandidateRouteHop::PublicHop {
3273                         info,
3274                         short_channel_id: 42,
3275                 };
3276                 let scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
3277                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 80_000);
3278         }
3279
3280         #[test]
3281         fn accounts_for_inflight_htlc_usage() {
3282                 let logger = TestLogger::new();
3283                 let network_graph = network_graph(&logger);
3284                 let params = ProbabilisticScoringFeeParameters {
3285                         considered_impossible_penalty_msat: u64::max_value(),
3286                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3287                 };
3288                 let scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
3289                 let source = source_node_id();
3290
3291                 let usage = ChannelUsage {
3292                         amount_msat: 750,
3293                         inflight_htlc_msat: 0,
3294                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_000, htlc_maximum_msat: 1_000 },
3295                 };
3296                 let network_graph = network_graph.read_only();
3297                 let channel = network_graph.channel(42).unwrap();
3298                 let (info, _) = channel.as_directed_from(&source).unwrap();
3299                 let candidate = CandidateRouteHop::PublicHop {
3300                         info,
3301                         short_channel_id: 42,
3302                 };
3303                 assert_ne!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
3304
3305                 let usage = ChannelUsage { inflight_htlc_msat: 251, ..usage };
3306                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
3307         }
3308
3309         #[test]
3310         fn removes_uncertainity_when_exact_liquidity_known() {
3311                 let logger = TestLogger::new();
3312                 let network_graph = network_graph(&logger);
3313                 let params = ProbabilisticScoringFeeParameters::default();
3314                 let scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
3315                 let source = source_node_id();
3316
3317                 let base_penalty_msat = params.base_penalty_msat;
3318                 let usage = ChannelUsage {
3319                         amount_msat: 750,
3320                         inflight_htlc_msat: 0,
3321                         effective_capacity: EffectiveCapacity::ExactLiquidity { liquidity_msat: 1_000 },
3322                 };
3323                 let network_graph = network_graph.read_only();
3324                 let channel = network_graph.channel(42).unwrap();
3325                 let (info, _) = channel.as_directed_from(&source).unwrap();
3326                 let candidate = CandidateRouteHop::PublicHop {
3327                         info,
3328                         short_channel_id: 42,
3329                 };
3330                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), base_penalty_msat);
3331
3332                 let usage = ChannelUsage { amount_msat: 1_000, ..usage };
3333                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), base_penalty_msat);
3334
3335                 let usage = ChannelUsage { amount_msat: 1_001, ..usage };
3336                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
3337         }
3338
3339         #[test]
3340         fn remembers_historical_failures() {
3341                 let logger = TestLogger::new();
3342                 let network_graph = network_graph(&logger);
3343                 let params = ProbabilisticScoringFeeParameters {
3344                         historical_liquidity_penalty_multiplier_msat: 1024,
3345                         historical_liquidity_penalty_amount_multiplier_msat: 1024,
3346                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3347                 };
3348                 let decay_params = ProbabilisticScoringDecayParameters {
3349                         liquidity_offset_half_life: Duration::from_secs(60 * 60),
3350                         historical_no_updates_half_life: Duration::from_secs(10),
3351                 };
3352                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
3353                 let source = source_node_id();
3354                 let target = target_node_id();
3355
3356                 let usage = ChannelUsage {
3357                         amount_msat: 100,
3358                         inflight_htlc_msat: 0,
3359                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024, htlc_maximum_msat: 1_024 },
3360                 };
3361                 let usage_1 = ChannelUsage {
3362                         amount_msat: 1,
3363                         inflight_htlc_msat: 0,
3364                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024, htlc_maximum_msat: 1_024 },
3365                 };
3366
3367                 {
3368                         let network_graph = network_graph.read_only();
3369                         let channel = network_graph.channel(42).unwrap();
3370                         let (info, _) = channel.as_directed_from(&source).unwrap();
3371                         let candidate = CandidateRouteHop::PublicHop {
3372                                 info,
3373                                 short_channel_id: 42,
3374                         };
3375
3376                         // With no historical data the normal liquidity penalty calculation is used.
3377                         assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 168);
3378                 }
3379                 assert_eq!(scorer.historical_estimated_channel_liquidity_probabilities(42, &target),
3380                 None);
3381                 assert_eq!(scorer.historical_estimated_payment_success_probability(42, &target, 42, &params),
3382                 None);
3383
3384                 scorer.payment_path_failed(&payment_path_for_amount(1), 42, Duration::ZERO);
3385                 {
3386                         let network_graph = network_graph.read_only();
3387                         let channel = network_graph.channel(42).unwrap();
3388                         let (info, _) = channel.as_directed_from(&source).unwrap();
3389                         let candidate = CandidateRouteHop::PublicHop {
3390                                 info,
3391                                 short_channel_id: 42,
3392                         };
3393
3394                         assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 2048);
3395                         assert_eq!(scorer.channel_penalty_msat(&candidate, usage_1, &params), 249);
3396                 }
3397                 // The "it failed" increment is 32, where the probability should lie several buckets into
3398                 // the first octile.
3399                 assert_eq!(scorer.historical_estimated_channel_liquidity_probabilities(42, &target),
3400                         Some(([32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
3401                                 [0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])));
3402                 assert!(scorer.historical_estimated_payment_success_probability(42, &target, 1, &params)
3403                         .unwrap() > 0.35);
3404                 assert_eq!(scorer.historical_estimated_payment_success_probability(42, &target, 500, &params),
3405                         Some(0.0));
3406
3407                 // Even after we tell the scorer we definitely have enough available liquidity, it will
3408                 // still remember that there was some failure in the past, and assign a non-0 penalty.
3409                 scorer.payment_path_failed(&payment_path_for_amount(1000), 43, Duration::ZERO);
3410                 {
3411                         let network_graph = network_graph.read_only();
3412                         let channel = network_graph.channel(42).unwrap();
3413                         let (info, _) = channel.as_directed_from(&source).unwrap();
3414                         let candidate = CandidateRouteHop::PublicHop {
3415                                 info,
3416                                 short_channel_id: 42,
3417                         };
3418
3419                         assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 105);
3420                 }
3421                 // The first points should be decayed just slightly and the last bucket has a new point.
3422                 assert_eq!(scorer.historical_estimated_channel_liquidity_probabilities(42, &target),
3423                         Some(([31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0],
3424                                 [0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32])));
3425
3426                 // The exact success probability is a bit complicated and involves integer rounding, so we
3427                 // simply check bounds here.
3428                 let five_hundred_prob =
3429                         scorer.historical_estimated_payment_success_probability(42, &target, 500, &params).unwrap();
3430                 assert!(five_hundred_prob > 0.59);
3431                 assert!(five_hundred_prob < 0.60);
3432                 let one_prob =
3433                         scorer.historical_estimated_payment_success_probability(42, &target, 1, &params).unwrap();
3434                 assert!(one_prob < 0.85);
3435                 assert!(one_prob > 0.84);
3436
3437                 // Advance the time forward 16 half-lives (which the docs claim will ensure all data is
3438                 // gone), and check that we're back to where we started.
3439                 SinceEpoch::advance(Duration::from_secs(10 * 16));
3440                 scorer.time_passed(Duration::from_secs(10 * 16));
3441                 {
3442                         let network_graph = network_graph.read_only();
3443                         let channel = network_graph.channel(42).unwrap();
3444                         let (info, _) = channel.as_directed_from(&source).unwrap();
3445                         let candidate = CandidateRouteHop::PublicHop {
3446                                 info,
3447                                 short_channel_id: 42,
3448                         };
3449
3450                         assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 168);
3451                 }
3452                 // Once fully decayed we still have data, but its all-0s. In the future we may remove the
3453                 // data entirely instead.
3454                 assert_eq!(scorer.historical_estimated_channel_liquidity_probabilities(42, &target),
3455                         Some(([0; 32], [0; 32])));
3456                 assert_eq!(scorer.historical_estimated_payment_success_probability(42, &target, 1, &params), None);
3457
3458                 let mut usage = ChannelUsage {
3459                         amount_msat: 100,
3460                         inflight_htlc_msat: 1024,
3461                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024, htlc_maximum_msat: 1_024 },
3462                 };
3463                 scorer.payment_path_failed(&payment_path_for_amount(1), 42, Duration::from_secs(10 * 16));
3464                 {
3465                         let network_graph = network_graph.read_only();
3466                         let channel = network_graph.channel(42).unwrap();
3467                         let (info, _) = channel.as_directed_from(&source).unwrap();
3468                         let candidate = CandidateRouteHop::PublicHop {
3469                                 info,
3470                                 short_channel_id: 42,
3471                         };
3472
3473                         assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 2050);
3474
3475                         let usage = ChannelUsage {
3476                                 amount_msat: 1,
3477                                 inflight_htlc_msat: 0,
3478                                 effective_capacity: EffectiveCapacity::AdvertisedMaxHTLC { amount_msat: 0 },
3479                         };
3480                         assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 2048);
3481                 }
3482
3483                 // Advance to decay all liquidity offsets to zero.
3484                 SinceEpoch::advance(Duration::from_secs(60 * 60 * 10));
3485                 scorer.time_passed(Duration::from_secs(10 * (16 + 60 * 60)));
3486
3487                 // Once even the bounds have decayed information about the channel should be removed
3488                 // entirely.
3489                 assert_eq!(scorer.historical_estimated_channel_liquidity_probabilities(42, &target),
3490                         None);
3491
3492                 // Use a path in the opposite direction, which have zero for htlc_maximum_msat. This will
3493                 // ensure that the effective capacity is zero to test division-by-zero edge cases.
3494                 let path = vec![
3495                         path_hop(target_pubkey(), 43, 2),
3496                         path_hop(source_pubkey(), 42, 1),
3497                         path_hop(sender_pubkey(), 41, 0),
3498                 ];
3499                 scorer.payment_path_failed(&Path { hops: path, blinded_tail: None }, 42, Duration::from_secs(10 * (16 + 60 * 60)));
3500         }
3501
3502         #[test]
3503         fn adds_anti_probing_penalty() {
3504                 let logger = TestLogger::new();
3505                 let network_graph = network_graph(&logger);
3506                 let source = source_node_id();
3507                 let params = ProbabilisticScoringFeeParameters {
3508                         anti_probing_penalty_msat: 500,
3509                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3510                 };
3511                 let scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
3512
3513                 // Check we receive no penalty for a low htlc_maximum_msat.
3514                 let usage = ChannelUsage {
3515                         amount_msat: 512_000,
3516                         inflight_htlc_msat: 0,
3517                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024_000, htlc_maximum_msat: 1_000 },
3518                 };
3519                 let network_graph = network_graph.read_only();
3520                 let channel = network_graph.channel(42).unwrap();
3521                 let (info, _) = channel.as_directed_from(&source).unwrap();
3522                 let candidate = CandidateRouteHop::PublicHop {
3523                         info,
3524                         short_channel_id: 42,
3525                 };
3526                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
3527
3528                 // Check we receive anti-probing penalty for htlc_maximum_msat == channel_capacity.
3529                 let usage = ChannelUsage {
3530                         amount_msat: 512_000,
3531                         inflight_htlc_msat: 0,
3532                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024_000, htlc_maximum_msat: 1_024_000 },
3533                 };
3534                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 500);
3535
3536                 // Check we receive anti-probing penalty for htlc_maximum_msat == channel_capacity/2.
3537                 let usage = ChannelUsage {
3538                         amount_msat: 512_000,
3539                         inflight_htlc_msat: 0,
3540                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024_000, htlc_maximum_msat: 512_000 },
3541                 };
3542                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 500);
3543
3544                 // Check we receive no anti-probing penalty for htlc_maximum_msat == channel_capacity/2 - 1.
3545                 let usage = ChannelUsage {
3546                         amount_msat: 512_000,
3547                         inflight_htlc_msat: 0,
3548                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024_000, htlc_maximum_msat: 511_999 },
3549                 };
3550                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
3551         }
3552
3553         #[test]
3554         fn scores_with_blinded_path() {
3555                 // Make sure we'll account for a blinded path's final_value_msat in scoring
3556                 let logger = TestLogger::new();
3557                 let network_graph = network_graph(&logger);
3558                 let params = ProbabilisticScoringFeeParameters {
3559                         liquidity_penalty_multiplier_msat: 1_000,
3560                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3561                 };
3562                 let decay_params = ProbabilisticScoringDecayParameters::default();
3563                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
3564                 let source = source_node_id();
3565                 let usage = ChannelUsage {
3566                         amount_msat: 512,
3567                         inflight_htlc_msat: 0,
3568                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024, htlc_maximum_msat: 1_000 },
3569                 };
3570                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
3571                 let (info, target) = channel.as_directed_from(&source).unwrap();
3572                 let candidate = CandidateRouteHop::PublicHop {
3573                         info,
3574                         short_channel_id: 42,
3575                 };
3576                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 300);
3577
3578                 let mut path = payment_path_for_amount(768);
3579                 let recipient_hop = path.hops.pop().unwrap();
3580                 let blinded_path = BlindedPath {
3581                         introduction_node_id: path.hops.last().as_ref().unwrap().pubkey,
3582                         blinding_point: test_utils::pubkey(42),
3583                         blinded_hops: vec![
3584                                 BlindedHop { blinded_node_id: test_utils::pubkey(44), encrypted_payload: Vec::new() }
3585                         ],
3586                 };
3587                 path.blinded_tail = Some(BlindedTail {
3588                         hops: blinded_path.blinded_hops,
3589                         blinding_point: blinded_path.blinding_point,
3590                         excess_final_cltv_expiry_delta: recipient_hop.cltv_expiry_delta,
3591                         final_value_msat: recipient_hop.fee_msat,
3592                 });
3593
3594                 // Check the liquidity before and after scoring payment failures to ensure the blinded path's
3595                 // final value is taken into account.
3596                 assert!(scorer.channel_liquidities.get(&42).is_none());
3597
3598                 scorer.payment_path_failed(&path, 42, Duration::ZERO);
3599                 path.blinded_tail.as_mut().unwrap().final_value_msat = 256;
3600                 scorer.payment_path_failed(&path, 43, Duration::ZERO);
3601
3602                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
3603                         .as_directed(&source, &target, 1_000);
3604                 assert_eq!(liquidity.min_liquidity_msat(), 256);
3605                 assert_eq!(liquidity.max_liquidity_msat(), 768);
3606         }
3607
3608         #[test]
3609         fn realistic_historical_failures() {
3610                 // The motivation for the unequal sized buckets came largely from attempting to pay 10k
3611                 // sats over a one bitcoin channel. This tests that case explicitly, ensuring that we score
3612                 // properly.
3613                 let logger = TestLogger::new();
3614                 let mut network_graph = network_graph(&logger);
3615                 let params = ProbabilisticScoringFeeParameters {
3616                         historical_liquidity_penalty_multiplier_msat: 1024,
3617                         historical_liquidity_penalty_amount_multiplier_msat: 1024,
3618                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3619                 };
3620                 let decay_params = ProbabilisticScoringDecayParameters {
3621                         liquidity_offset_half_life: Duration::from_secs(60 * 60),
3622                         historical_no_updates_half_life: Duration::from_secs(10),
3623                         ..ProbabilisticScoringDecayParameters::default()
3624                 };
3625
3626                 let capacity_msat = 100_000_000_000;
3627                 update_channel(&mut network_graph, 42, source_privkey(), 0, capacity_msat, 200);
3628                 update_channel(&mut network_graph, 42, target_privkey(), 1, capacity_msat, 200);
3629
3630                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
3631                 let source = source_node_id();
3632
3633                 let mut amount_msat = 10_000_000;
3634                 let usage = ChannelUsage {
3635                         amount_msat,
3636                         inflight_htlc_msat: 0,
3637                         effective_capacity: EffectiveCapacity::Total { capacity_msat, htlc_maximum_msat: capacity_msat },
3638                 };
3639                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
3640                 let (info, target) = channel.as_directed_from(&source).unwrap();
3641                 let candidate = CandidateRouteHop::PublicHop {
3642                         info,
3643                         short_channel_id: 42,
3644                 };
3645                 // With no historical data the normal liquidity penalty calculation is used, which results
3646                 // in a success probability of ~75%.
3647                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 1269);
3648                 assert_eq!(scorer.historical_estimated_channel_liquidity_probabilities(42, &target),
3649                         None);
3650                 assert_eq!(scorer.historical_estimated_payment_success_probability(42, &target, 42, &params),
3651                         None);
3652
3653                 // Fail to pay once, and then check the buckets and penalty.
3654                 scorer.payment_path_failed(&payment_path_for_amount(amount_msat), 42, Duration::ZERO);
3655                 // The penalty should be the maximum penalty, as the payment we're scoring is now in the
3656                 // same bucket which is the only maximum datapoint.
3657                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params),
3658                         2048 + 2048 * amount_msat / super::AMOUNT_PENALTY_DIVISOR);
3659                 // The "it failed" increment is 32, which we should apply to the first upper-bound (between
3660                 // 6k sats and 12k sats).
3661                 assert_eq!(scorer.historical_estimated_channel_liquidity_probabilities(42, &target),
3662                         Some(([32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
3663                                 [0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])));
3664                 // The success probability estimate itself should be zero.
3665                 assert_eq!(scorer.historical_estimated_payment_success_probability(42, &target, amount_msat, &params),
3666                         Some(0.0));
3667
3668                 // Now test again with the amount in the bottom bucket.
3669                 amount_msat /= 2;
3670                 // The new amount is entirely within the only minimum bucket with score, so the probability
3671                 // we assign is 1/2.
3672                 assert_eq!(scorer.historical_estimated_payment_success_probability(42, &target, amount_msat, &params),
3673                         Some(0.5));
3674
3675                 // ...but once we see a failure, we consider the payment to be substantially less likely,
3676                 // even though not a probability of zero as we still look at the second max bucket which
3677                 // now shows 31.
3678                 scorer.payment_path_failed(&payment_path_for_amount(amount_msat), 42, Duration::ZERO);
3679                 assert_eq!(scorer.historical_estimated_channel_liquidity_probabilities(42, &target),
3680                         Some(([63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
3681                                 [32, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])));
3682                 assert_eq!(scorer.historical_estimated_payment_success_probability(42, &target, amount_msat, &params),
3683                         Some(0.0));
3684         }
3685 }
3686
3687 #[cfg(ldk_bench)]
3688 pub mod benches {
3689         use super::*;
3690         use criterion::Criterion;
3691         use crate::routing::router::{bench_utils, RouteHop};
3692         use crate::util::test_utils::TestLogger;
3693         use crate::ln::features::{ChannelFeatures, NodeFeatures};
3694
3695         pub fn decay_100k_channel_bounds(bench: &mut Criterion) {
3696                 let logger = TestLogger::new();
3697                 let network_graph = bench_utils::read_network_graph(&logger).unwrap();
3698                 let mut scorer = ProbabilisticScorer::new(Default::default(), &network_graph, &logger);
3699                 // Score a number of random channels
3700                 let mut seed: u64 = 0xdeadbeef;
3701                 for _ in 0..100_000 {
3702                         seed = seed.overflowing_mul(6364136223846793005).0.overflowing_add(1).0;
3703                         let (victim, victim_dst, amt) = {
3704                                 let rong = network_graph.read_only();
3705                                 let channels = rong.channels();
3706                                 let chan = channels.unordered_iter()
3707                                         .skip((seed as usize) % channels.len())
3708                                         .next().unwrap();
3709                                 seed = seed.overflowing_mul(6364136223846793005).0.overflowing_add(1).0;
3710                                 let amt = seed % chan.1.capacity_sats.map(|c| c * 1000)
3711                                         .or(chan.1.one_to_two.as_ref().map(|info| info.htlc_maximum_msat))
3712                                         .or(chan.1.two_to_one.as_ref().map(|info| info.htlc_maximum_msat))
3713                                         .unwrap_or(1_000_000_000).saturating_add(1);
3714                                 (*chan.0, chan.1.node_two, amt)
3715                         };
3716                         let path = Path {
3717                                 hops: vec![RouteHop {
3718                                         pubkey: victim_dst.as_pubkey().unwrap(),
3719                                         node_features: NodeFeatures::empty(),
3720                                         short_channel_id: victim,
3721                                         channel_features: ChannelFeatures::empty(),
3722                                         fee_msat: amt,
3723                                         cltv_expiry_delta: 42,
3724                                         maybe_announced_channel: true,
3725                                 }],
3726                                 blinded_tail: None
3727                         };
3728                         seed = seed.overflowing_mul(6364136223846793005).0.overflowing_add(1).0;
3729                         if seed % 1 == 0 {
3730                                 scorer.probe_failed(&path, victim, Duration::ZERO);
3731                         } else {
3732                                 scorer.probe_successful(&path, Duration::ZERO);
3733                         }
3734                 }
3735                 let mut cur_time = Duration::ZERO;
3736                         cur_time += Duration::from_millis(1);
3737                         scorer.decay_liquidity_certainty(cur_time);
3738                 bench.bench_function("decay_100k_channel_bounds", |b| b.iter(|| {
3739                         cur_time += Duration::from_millis(1);
3740                         scorer.decay_liquidity_certainty(cur_time);
3741                 }));
3742         }
3743 }