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