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