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