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