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