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