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