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