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