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