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