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