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