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