Avoid excess multiplies by multiplying in `success_probability`
[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::routing::log_approx;
63 use crate::util::ser::{Readable, ReadableArgs, Writeable, Writer};
64 use crate::util::logger::Logger;
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 decay_liquidity_certainty(&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 decay_liquidity_certainty(&mut self, duration_since_epoch: Duration) {
171                 self.deref_mut().decay_liquidity_certainty(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 decay_liquidity_certainty(&mut self, duration_since_epoch: Duration) {
376                 self.0.decay_liquidity_certainty(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 decay_liquidity_certainty(&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 /// [`ScoreLookUp`] implementation using channel success probability distributions.
444 ///
445 /// Channels are tracked with upper and lower liquidity bounds - when an HTLC fails at a channel,
446 /// we learn that the upper-bound on the available liquidity is lower than the amount of the HTLC.
447 /// When a payment is forwarded through a channel (but fails later in the route), we learn the
448 /// lower-bound on the channel's available liquidity must be at least the value of the HTLC.
449 ///
450 /// These bounds are then used to determine a success probability using the formula from
451 /// *Optimally Reliable & Cheap Payment Flows on the Lightning Network* by Rene Pickhardt
452 /// and Stefan Richter [[1]] (i.e. `(upper_bound - payment_amount) / (upper_bound - lower_bound)`).
453 ///
454 /// This probability is combined with the [`liquidity_penalty_multiplier_msat`] and
455 /// [`liquidity_penalty_amount_multiplier_msat`] parameters to calculate a concrete penalty in
456 /// milli-satoshis. The penalties, when added across all hops, have the property of being linear in
457 /// terms of the entire path's success probability. This allows the router to directly compare
458 /// penalties for different paths. See the documentation of those parameters for the exact formulas.
459 ///
460 /// The liquidity bounds are decayed by halving them every [`liquidity_offset_half_life`].
461 ///
462 /// Further, we track the history of our upper and lower liquidity bounds for each channel,
463 /// allowing us to assign a second penalty (using [`historical_liquidity_penalty_multiplier_msat`]
464 /// and [`historical_liquidity_penalty_amount_multiplier_msat`]) based on the same probability
465 /// formula, but using the history of a channel rather than our latest estimates for the liquidity
466 /// bounds.
467 ///
468 /// [1]: https://arxiv.org/abs/2107.05322
469 /// [`liquidity_penalty_multiplier_msat`]: ProbabilisticScoringFeeParameters::liquidity_penalty_multiplier_msat
470 /// [`liquidity_penalty_amount_multiplier_msat`]: ProbabilisticScoringFeeParameters::liquidity_penalty_amount_multiplier_msat
471 /// [`liquidity_offset_half_life`]: ProbabilisticScoringDecayParameters::liquidity_offset_half_life
472 /// [`historical_liquidity_penalty_multiplier_msat`]: ProbabilisticScoringFeeParameters::historical_liquidity_penalty_multiplier_msat
473 /// [`historical_liquidity_penalty_amount_multiplier_msat`]: ProbabilisticScoringFeeParameters::historical_liquidity_penalty_amount_multiplier_msat
474 pub struct ProbabilisticScorer<G: Deref<Target = NetworkGraph<L>>, L: Deref>
475 where L::Target: Logger {
476         decay_params: ProbabilisticScoringDecayParameters,
477         network_graph: G,
478         logger: L,
479         channel_liquidities: HashMap<u64, ChannelLiquidity>,
480 }
481
482 /// Parameters for configuring [`ProbabilisticScorer`].
483 ///
484 /// Used to configure base, liquidity, and amount penalties, the sum of which comprises the channel
485 /// penalty (i.e., the amount in msats willing to be paid to avoid routing through the channel).
486 ///
487 /// The penalty applied to any channel by the [`ProbabilisticScorer`] is the sum of each of the
488 /// parameters here.
489 #[derive(Clone)]
490 pub struct ProbabilisticScoringFeeParameters {
491         /// A fixed penalty in msats to apply to each channel.
492         ///
493         /// Default value: 500 msat
494         pub base_penalty_msat: u64,
495
496         /// A multiplier used with the total amount flowing over a channel to calculate a fixed penalty
497         /// applied to each channel, in excess of the [`base_penalty_msat`].
498         ///
499         /// The purpose of the amount penalty is to avoid having fees dominate the channel cost (i.e.,
500         /// fees plus penalty) for large payments. The penalty is computed as the product of this
501         /// multiplier and `2^30`ths of the total amount flowing over a channel (i.e. the payment
502         /// amount plus the amount of any other HTLCs flowing we sent over the same channel).
503         ///
504         /// ie `base_penalty_amount_multiplier_msat * amount_msat / 2^30`
505         ///
506         /// Default value: 8,192 msat
507         ///
508         /// [`base_penalty_msat`]: Self::base_penalty_msat
509         pub base_penalty_amount_multiplier_msat: u64,
510
511         /// A multiplier used in conjunction with the negative `log10` of the channel's success
512         /// probability for a payment, as determined by our latest estimates of the channel's
513         /// liquidity, to determine the liquidity penalty.
514         ///
515         /// The penalty is based in part on the knowledge learned from prior successful and unsuccessful
516         /// payments. This knowledge is decayed over time based on [`liquidity_offset_half_life`]. The
517         /// penalty is effectively limited to `2 * liquidity_penalty_multiplier_msat` (corresponding to
518         /// lower bounding the success probability to `0.01`) when the amount falls within the
519         /// uncertainty bounds of the channel liquidity balance. Amounts above the upper bound will
520         /// result in a `u64::max_value` penalty, however.
521         ///
522         /// `-log10(success_probability) * liquidity_penalty_multiplier_msat`
523         ///
524         /// Default value: 30,000 msat
525         ///
526         /// [`liquidity_offset_half_life`]: ProbabilisticScoringDecayParameters::liquidity_offset_half_life
527         pub liquidity_penalty_multiplier_msat: u64,
528
529         /// A multiplier used in conjunction with the total amount flowing over a channel and the
530         /// negative `log10` of the channel's success probability for the payment, as determined by our
531         /// latest estimates of the channel's liquidity, to determine the amount penalty.
532         ///
533         /// The purpose of the amount penalty is to avoid having fees dominate the channel cost (i.e.,
534         /// fees plus penalty) for large payments. The penalty is computed as the product of this
535         /// multiplier and `2^20`ths of the amount flowing over this channel, weighted by the negative
536         /// `log10` of the success probability.
537         ///
538         /// `-log10(success_probability) * liquidity_penalty_amount_multiplier_msat * amount_msat / 2^20`
539         ///
540         /// In practice, this means for 0.1 success probability (`-log10(0.1) == 1`) each `2^20`th of
541         /// the amount will result in a penalty of the multiplier. And, as the success probability
542         /// decreases, the negative `log10` weighting will increase dramatically. For higher success
543         /// probabilities, the multiplier will have a decreasing effect as the negative `log10` will
544         /// fall below `1`.
545         ///
546         /// Default value: 192 msat
547         pub liquidity_penalty_amount_multiplier_msat: u64,
548
549         /// A multiplier used in conjunction with the negative `log10` of the channel's success
550         /// probability for the payment, as determined based on the history of our estimates of the
551         /// channel's available liquidity, to determine a penalty.
552         ///
553         /// This penalty is similar to [`liquidity_penalty_multiplier_msat`], however, instead of using
554         /// only our latest estimate for the current liquidity available in the channel, it estimates
555         /// success probability based on the estimated liquidity available in the channel through
556         /// history. Specifically, every time we update our liquidity bounds on a given channel, we
557         /// track which of several buckets those bounds fall into, exponentially decaying the
558         /// probability of each bucket as new samples are added.
559         ///
560         /// Default value: 10,000 msat
561         ///
562         /// [`liquidity_penalty_multiplier_msat`]: Self::liquidity_penalty_multiplier_msat
563         pub historical_liquidity_penalty_multiplier_msat: u64,
564
565         /// A multiplier used in conjunction with the total amount flowing over a channel and the
566         /// negative `log10` of the channel's success probability for the payment, as determined based
567         /// on the history of our estimates of the channel's available liquidity, to determine a
568         /// penalty.
569         ///
570         /// The purpose of the amount penalty is to avoid having fees dominate the channel cost for
571         /// large payments. The penalty is computed as the product of this multiplier and `2^20`ths
572         /// of the amount flowing over this channel, weighted by the negative `log10` of the success
573         /// probability.
574         ///
575         /// This penalty is similar to [`liquidity_penalty_amount_multiplier_msat`], however, instead
576         /// of using only our latest estimate for the current liquidity available in the channel, it
577         /// estimates success probability based on the estimated liquidity available in the channel
578         /// through history. Specifically, every time we update our liquidity bounds on a given
579         /// channel, we track which of several buckets those bounds fall into, exponentially decaying
580         /// the probability of each bucket as new samples are added.
581         ///
582         /// Default value: 64 msat
583         ///
584         /// [`liquidity_penalty_amount_multiplier_msat`]: Self::liquidity_penalty_amount_multiplier_msat
585         pub historical_liquidity_penalty_amount_multiplier_msat: u64,
586
587         /// Manual penalties used for the given nodes. Allows to set a particular penalty for a given
588         /// node. Note that a manual penalty of `u64::max_value()` means the node would not ever be
589         /// considered during path finding.
590         ///
591         /// This is not exported to bindings users
592         pub manual_node_penalties: HashMap<NodeId, u64>,
593
594         /// This penalty is applied when `htlc_maximum_msat` is equal to or larger than half of the
595         /// channel's capacity, (ie. htlc_maximum_msat >= 0.5 * channel_capacity) which makes us
596         /// prefer nodes with a smaller `htlc_maximum_msat`. We treat such nodes preferentially
597         /// as this makes balance discovery attacks harder to execute, thereby creating an incentive
598         /// to restrict `htlc_maximum_msat` and improve privacy.
599         ///
600         /// Default value: 250 msat
601         pub anti_probing_penalty_msat: u64,
602
603         /// This penalty is applied when the total amount flowing over a channel exceeds our current
604         /// estimate of the channel's available liquidity. The total amount is the amount of the
605         /// current HTLC plus any HTLCs which we've sent over the same channel.
606         ///
607         /// Note that in this case all other penalties, including the
608         /// [`liquidity_penalty_multiplier_msat`] and [`liquidity_penalty_amount_multiplier_msat`]-based
609         /// penalties, as well as the [`base_penalty_msat`] and the [`anti_probing_penalty_msat`], if
610         /// applicable, are still included in the overall penalty.
611         ///
612         /// If you wish to avoid creating paths with such channels entirely, setting this to a value of
613         /// `u64::max_value()` will guarantee that.
614         ///
615         /// Default value: 1_0000_0000_000 msat (1 Bitcoin)
616         ///
617         /// [`liquidity_penalty_multiplier_msat`]: Self::liquidity_penalty_multiplier_msat
618         /// [`liquidity_penalty_amount_multiplier_msat`]: Self::liquidity_penalty_amount_multiplier_msat
619         /// [`base_penalty_msat`]: Self::base_penalty_msat
620         /// [`anti_probing_penalty_msat`]: Self::anti_probing_penalty_msat
621         pub considered_impossible_penalty_msat: u64,
622
623         /// In order to calculate most of the scores above, we must first convert a lower and upper
624         /// bound on the available liquidity in a channel into the probability that we think a payment
625         /// will succeed. That probability is derived from a Probability Density Function for where we
626         /// think the liquidity in a channel likely lies, given such bounds.
627         ///
628         /// If this flag is set, that PDF is simply a constant - we assume that the actual available
629         /// liquidity in a channel is just as likely to be at any point between our lower and upper
630         /// bounds.
631         ///
632         /// If this flag is *not* set, that PDF is `(x - 0.5*capacity) ^ 2`. That is, we use an
633         /// exponential curve which expects the liquidity of a channel to lie "at the edges". This
634         /// matches experimental results - most routing nodes do not aggressively rebalance their
635         /// channels and flows in the network are often unbalanced, leaving liquidity usually
636         /// unavailable.
637         ///
638         /// Thus, for the "best" routes, leave this flag `false`. However, the flag does imply a number
639         /// of floating-point multiplications in the hottest routing code, which may lead to routing
640         /// performance degradation on some machines.
641         ///
642         /// Default value: false
643         pub linear_success_probability: bool,
644 }
645
646 impl Default for ProbabilisticScoringFeeParameters {
647         fn default() -> Self {
648                 Self {
649                         base_penalty_msat: 500,
650                         base_penalty_amount_multiplier_msat: 8192,
651                         liquidity_penalty_multiplier_msat: 30_000,
652                         liquidity_penalty_amount_multiplier_msat: 192,
653                         manual_node_penalties: HashMap::new(),
654                         anti_probing_penalty_msat: 250,
655                         considered_impossible_penalty_msat: 1_0000_0000_000,
656                         historical_liquidity_penalty_multiplier_msat: 10_000,
657                         historical_liquidity_penalty_amount_multiplier_msat: 64,
658                         linear_success_probability: false,
659                 }
660         }
661 }
662
663 impl ProbabilisticScoringFeeParameters {
664         /// Marks the node with the given `node_id` as banned,
665         /// i.e it will be avoided during path finding.
666         pub fn add_banned(&mut self, node_id: &NodeId) {
667                 self.manual_node_penalties.insert(*node_id, u64::max_value());
668         }
669
670         /// Marks all nodes in the given list as banned, i.e.,
671         /// they will be avoided during path finding.
672         pub fn add_banned_from_list(&mut self, node_ids: Vec<NodeId>) {
673                 for id in node_ids {
674                         self.manual_node_penalties.insert(id, u64::max_value());
675                 }
676         }
677
678         /// Removes the node with the given `node_id` from the list of nodes to avoid.
679         pub fn remove_banned(&mut self, node_id: &NodeId) {
680                 self.manual_node_penalties.remove(node_id);
681         }
682
683         /// Sets a manual penalty for the given node.
684         pub fn set_manual_penalty(&mut self, node_id: &NodeId, penalty: u64) {
685                 self.manual_node_penalties.insert(*node_id, penalty);
686         }
687
688         /// Removes the node with the given `node_id` from the list of manual penalties.
689         pub fn remove_manual_penalty(&mut self, node_id: &NodeId) {
690                 self.manual_node_penalties.remove(node_id);
691         }
692
693         /// Clears the list of manual penalties that are applied during path finding.
694         pub fn clear_manual_penalties(&mut self) {
695                 self.manual_node_penalties = HashMap::new();
696         }
697 }
698
699 #[cfg(test)]
700 impl ProbabilisticScoringFeeParameters {
701         fn zero_penalty() -> Self {
702                 Self {
703                         base_penalty_msat: 0,
704                         base_penalty_amount_multiplier_msat: 0,
705                         liquidity_penalty_multiplier_msat: 0,
706                         liquidity_penalty_amount_multiplier_msat: 0,
707                         historical_liquidity_penalty_multiplier_msat: 0,
708                         historical_liquidity_penalty_amount_multiplier_msat: 0,
709                         manual_node_penalties: HashMap::new(),
710                         anti_probing_penalty_msat: 0,
711                         considered_impossible_penalty_msat: 0,
712                         linear_success_probability: true,
713                 }
714         }
715 }
716
717 /// Parameters for configuring [`ProbabilisticScorer`].
718 ///
719 /// Used to configure decay parameters that are static throughout the lifetime of the scorer.
720 /// these decay parameters affect the score of the channel penalty and are not changed on a
721 /// per-route penalty cost call.
722 #[derive(Copy, Clone)]
723 pub struct ProbabilisticScoringDecayParameters {
724         /// If we aren't learning any new datapoints for a channel, the historical liquidity bounds
725         /// tracking can simply live on with increasingly stale data. Instead, when a channel has not
726         /// seen a liquidity estimate update for this amount of time, the historical datapoints are
727         /// decayed by half.
728         /// For an example of historical_no_updates_half_life being used see [`historical_estimated_channel_liquidity_probabilities`]
729         ///
730         /// Note that after 16 or more half lives all historical data will be completely gone.
731         ///
732         /// Default value: 14 days
733         ///
734         /// [`historical_estimated_channel_liquidity_probabilities`]: ProbabilisticScorer::historical_estimated_channel_liquidity_probabilities
735         pub historical_no_updates_half_life: Duration,
736
737         /// Whenever this amount of time elapses since the last update to a channel's liquidity bounds,
738         /// the distance from the bounds to "zero" is cut in half. In other words, the lower-bound on
739         /// the available liquidity is halved and the upper-bound moves half-way to the channel's total
740         /// capacity.
741         ///
742         /// Because halving the liquidity bounds grows the uncertainty on the channel's liquidity,
743         /// the penalty for an amount within the new bounds may change. See the [`ProbabilisticScorer`]
744         /// struct documentation for more info on the way the liquidity bounds are used.
745         ///
746         /// For example, if the channel's capacity is 1 million sats, and the current upper and lower
747         /// liquidity bounds are 200,000 sats and 600,000 sats, after this amount of time the upper
748         /// and lower liquidity bounds will be decayed to 100,000 and 800,000 sats.
749         ///
750         /// Default value: 6 hours
751         ///
752         /// # Note
753         ///
754         /// When built with the `no-std` feature, time will never elapse. Therefore, the channel
755         /// liquidity knowledge will never decay except when the bounds cross.
756         pub liquidity_offset_half_life: Duration,
757 }
758
759 impl Default for ProbabilisticScoringDecayParameters {
760         fn default() -> Self {
761                 Self {
762                         liquidity_offset_half_life: Duration::from_secs(6 * 60 * 60),
763                         historical_no_updates_half_life: Duration::from_secs(60 * 60 * 24 * 14),
764                 }
765         }
766 }
767
768 #[cfg(test)]
769 impl ProbabilisticScoringDecayParameters {
770         fn zero_penalty() -> Self {
771                 Self {
772                         liquidity_offset_half_life: Duration::from_secs(6 * 60 * 60),
773                         historical_no_updates_half_life: Duration::from_secs(60 * 60 * 24 * 14),
774                 }
775         }
776 }
777
778 /// Accounting for channel liquidity balance uncertainty.
779 ///
780 /// Direction is defined in terms of [`NodeId`] partial ordering, where the source node is the
781 /// first node in the ordering of the channel's counterparties. Thus, swapping the two liquidity
782 /// offset fields gives the opposite direction.
783 #[repr(C)] // Force the fields in memory to be in the order we specify
784 struct ChannelLiquidity {
785         /// Lower channel liquidity bound in terms of an offset from zero.
786         min_liquidity_offset_msat: u64,
787
788         /// Upper channel liquidity bound in terms of an offset from the effective capacity.
789         max_liquidity_offset_msat: u64,
790
791         liquidity_history: HistoricalLiquidityTracker,
792
793         /// Time when the liquidity bounds were last modified as an offset since the unix epoch.
794         last_updated: Duration,
795
796         /// Time when the historical liquidity bounds were last modified as an offset against the unix
797         /// epoch.
798         offset_history_last_updated: Duration,
799 }
800
801 // Check that the liquidity HashMap's entries sit on round cache lines.
802 //
803 // Specifically, the first cache line will have the key, the liquidity offsets, and the total
804 // points tracked in the historical tracker.
805 //
806 // The next two cache lines will have the historical points, which we only access last during
807 // scoring, followed by the last_updated `Duration`s (which we do not need during scoring).
808 const _LIQUIDITY_MAP_SIZING_CHECK: usize = 192 - ::core::mem::size_of::<(u64, ChannelLiquidity)>();
809 const _LIQUIDITY_MAP_SIZING_CHECK_2: usize = ::core::mem::size_of::<(u64, ChannelLiquidity)>() - 192;
810
811 /// A snapshot of [`ChannelLiquidity`] in one direction assuming a certain channel capacity and
812 /// decayed with a given half life.
813 struct DirectedChannelLiquidity<L: Deref<Target = u64>, HT: Deref<Target = HistoricalLiquidityTracker>, T: Deref<Target = Duration>> {
814         min_liquidity_offset_msat: L,
815         max_liquidity_offset_msat: L,
816         liquidity_history: DirectedHistoricalLiquidityTracker<HT>,
817         capacity_msat: u64,
818         last_updated: T,
819         offset_history_last_updated: T,
820 }
821
822 impl<G: Deref<Target = NetworkGraph<L>>, L: Deref> ProbabilisticScorer<G, L> where L::Target: Logger {
823         /// Creates a new scorer using the given scoring parameters for sending payments from a node
824         /// through a network graph.
825         pub fn new(decay_params: ProbabilisticScoringDecayParameters, network_graph: G, logger: L) -> Self {
826                 Self {
827                         decay_params,
828                         network_graph,
829                         logger,
830                         channel_liquidities: HashMap::new(),
831                 }
832         }
833
834         #[cfg(test)]
835         fn with_channel(mut self, short_channel_id: u64, liquidity: ChannelLiquidity) -> Self {
836                 assert!(self.channel_liquidities.insert(short_channel_id, liquidity).is_none());
837                 self
838         }
839
840         /// Dump the contents of this scorer into the configured logger.
841         ///
842         /// Note that this writes roughly one line per channel for which we have a liquidity estimate,
843         /// which may be a substantial amount of log output.
844         pub fn debug_log_liquidity_stats(&self) {
845                 let graph = self.network_graph.read_only();
846                 for (scid, liq) in self.channel_liquidities.iter() {
847                         if let Some(chan_debug) = graph.channels().get(scid) {
848                                 let log_direction = |source, target| {
849                                         if let Some((directed_info, _)) = chan_debug.as_directed_to(target) {
850                                                 let amt = directed_info.effective_capacity().as_msat();
851                                                 let dir_liq = liq.as_directed(source, target, amt);
852
853                                                 let min_buckets = &dir_liq.liquidity_history.min_liquidity_offset_history_buckets();
854                                                 let max_buckets = &dir_liq.liquidity_history.max_liquidity_offset_history_buckets();
855
856                                                 log_debug!(self.logger, core::concat!(
857                                                         "Liquidity from {} to {} via {} is in the range ({}, {}).\n",
858                                                         "\tHistorical min liquidity bucket relative probabilities:\n",
859                                                         "\t\t{} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}\n",
860                                                         "\tHistorical max liquidity bucket relative probabilities:\n",
861                                                         "\t\t{} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}"),
862                                                         source, target, scid, dir_liq.min_liquidity_msat(), dir_liq.max_liquidity_msat(),
863                                                         min_buckets[ 0], min_buckets[ 1], min_buckets[ 2], min_buckets[ 3],
864                                                         min_buckets[ 4], min_buckets[ 5], min_buckets[ 6], min_buckets[ 7],
865                                                         min_buckets[ 8], min_buckets[ 9], min_buckets[10], min_buckets[11],
866                                                         min_buckets[12], min_buckets[13], min_buckets[14], min_buckets[15],
867                                                         min_buckets[16], min_buckets[17], min_buckets[18], min_buckets[19],
868                                                         min_buckets[20], min_buckets[21], min_buckets[22], min_buckets[23],
869                                                         min_buckets[24], min_buckets[25], min_buckets[26], min_buckets[27],
870                                                         min_buckets[28], min_buckets[29], min_buckets[30], min_buckets[31],
871                                                         // Note that the liquidity buckets are an offset from the edge, so we
872                                                         // inverse the max order to get the probabilities from zero.
873                                                         max_buckets[31], max_buckets[30], max_buckets[29], max_buckets[28],
874                                                         max_buckets[27], max_buckets[26], max_buckets[25], max_buckets[24],
875                                                         max_buckets[23], max_buckets[22], max_buckets[21], max_buckets[20],
876                                                         max_buckets[19], max_buckets[18], max_buckets[17], max_buckets[16],
877                                                         max_buckets[15], max_buckets[14], max_buckets[13], max_buckets[12],
878                                                         max_buckets[11], max_buckets[10], max_buckets[ 9], max_buckets[ 8],
879                                                         max_buckets[ 7], max_buckets[ 6], max_buckets[ 5], max_buckets[ 4],
880                                                         max_buckets[ 3], max_buckets[ 2], max_buckets[ 1], max_buckets[ 0]);
881                                         } else {
882                                                 log_debug!(self.logger, "No amount known for SCID {} from {:?} to {:?}", scid, source, target);
883                                         }
884                                 };
885
886                                 log_direction(&chan_debug.node_one, &chan_debug.node_two);
887                                 log_direction(&chan_debug.node_two, &chan_debug.node_one);
888                         } else {
889                                 log_debug!(self.logger, "No network graph entry for SCID {}", scid);
890                         }
891                 }
892         }
893
894         /// Query the estimated minimum and maximum liquidity available for sending a payment over the
895         /// channel with `scid` towards the given `target` node.
896         pub fn estimated_channel_liquidity_range(&self, scid: u64, target: &NodeId) -> Option<(u64, u64)> {
897                 let graph = self.network_graph.read_only();
898
899                 if let Some(chan) = graph.channels().get(&scid) {
900                         if let Some(liq) = self.channel_liquidities.get(&scid) {
901                                 if let Some((directed_info, source)) = chan.as_directed_to(target) {
902                                         let amt = directed_info.effective_capacity().as_msat();
903                                         let dir_liq = liq.as_directed(source, target, amt);
904                                         return Some((dir_liq.min_liquidity_msat(), dir_liq.max_liquidity_msat()));
905                                 }
906                         }
907                 }
908                 None
909         }
910
911         /// Query the historical estimated minimum and maximum liquidity available for sending a
912         /// payment over the channel with `scid` towards the given `target` node.
913         ///
914         /// Returns two sets of 32 buckets. The first set describes the lower-bound liquidity history,
915         /// the second set describes the upper-bound liquidity history. Each bucket describes the
916         /// relative frequency at which we've seen a liquidity bound in the bucket's range relative to
917         /// the channel's total capacity, on an arbitrary scale. Because the values are slowly decayed,
918         /// more recent data points are weighted more heavily than older datapoints.
919         ///
920         /// Note that the range of each bucket varies by its location to provide more granular results
921         /// at the edges of a channel's capacity, where it is more likely to sit.
922         ///
923         /// When scoring, the estimated probability that an upper-/lower-bound lies in a given bucket
924         /// is calculated by dividing that bucket's value with the total value of all buckets.
925         ///
926         /// For example, using a lower bucket count for illustrative purposes, a value of
927         /// `[0, 0, 0, ..., 0, 32]` indicates that we believe the probability of a bound being very
928         /// close to the channel's capacity to be 100%, and have never (recently) seen it in any other
929         /// bucket. A value of `[31, 0, 0, ..., 0, 0, 32]` indicates we've seen the bound being both
930         /// in the top and bottom bucket, and roughly with similar (recent) frequency.
931         ///
932         /// Because the datapoints are decayed slowly over time, values will eventually return to
933         /// `Some(([0; 32], [0; 32]))` or `None` if no data remains for a channel.
934         ///
935         /// In order to fetch a single success probability from the buckets provided here, as used in
936         /// the scoring model, see [`Self::historical_estimated_payment_success_probability`].
937         pub fn historical_estimated_channel_liquidity_probabilities(&self, scid: u64, target: &NodeId)
938         -> Option<([u16; 32], [u16; 32])> {
939                 let graph = self.network_graph.read_only();
940
941                 if let Some(chan) = graph.channels().get(&scid) {
942                         if let Some(liq) = self.channel_liquidities.get(&scid) {
943                                 if let Some((directed_info, source)) = chan.as_directed_to(target) {
944                                         let amt = directed_info.effective_capacity().as_msat();
945                                         let dir_liq = liq.as_directed(source, target, amt);
946
947                                         let min_buckets = *dir_liq.liquidity_history.min_liquidity_offset_history_buckets();
948                                         let mut max_buckets = *dir_liq.liquidity_history.max_liquidity_offset_history_buckets();
949
950                                         // Note that the liquidity buckets are an offset from the edge, so we inverse
951                                         // the max order to get the probabilities from zero.
952                                         max_buckets.reverse();
953                                         return Some((min_buckets, max_buckets));
954                                 }
955                         }
956                 }
957                 None
958         }
959
960         /// Query the probability of payment success sending the given `amount_msat` over the channel
961         /// with `scid` towards the given `target` node, based on the historical estimated liquidity
962         /// bounds.
963         ///
964         /// These are the same bounds as returned by
965         /// [`Self::historical_estimated_channel_liquidity_probabilities`] (but not those returned by
966         /// [`Self::estimated_channel_liquidity_range`]).
967         pub fn historical_estimated_payment_success_probability(
968                 &self, scid: u64, target: &NodeId, amount_msat: u64, params: &ProbabilisticScoringFeeParameters)
969         -> Option<f64> {
970                 let graph = self.network_graph.read_only();
971
972                 if let Some(chan) = graph.channels().get(&scid) {
973                         if let Some(liq) = self.channel_liquidities.get(&scid) {
974                                 if let Some((directed_info, source)) = chan.as_directed_to(target) {
975                                         let capacity_msat = directed_info.effective_capacity().as_msat();
976                                         let dir_liq = liq.as_directed(source, target, capacity_msat);
977
978                                         return dir_liq.liquidity_history.calculate_success_probability_times_billion(
979                                                 &params, amount_msat, capacity_msat
980                                         ).map(|p| p as f64 / (1024 * 1024 * 1024) as f64);
981                                 }
982                         }
983                 }
984                 None
985         }
986 }
987
988 impl ChannelLiquidity {
989         fn new(last_updated: Duration) -> Self {
990                 Self {
991                         min_liquidity_offset_msat: 0,
992                         max_liquidity_offset_msat: 0,
993                         liquidity_history: HistoricalLiquidityTracker::new(),
994                         last_updated,
995                         offset_history_last_updated: last_updated,
996                 }
997         }
998
999         /// Returns a view of the channel liquidity directed from `source` to `target` assuming
1000         /// `capacity_msat`.
1001         fn as_directed(
1002                 &self, source: &NodeId, target: &NodeId, capacity_msat: u64,
1003         ) -> DirectedChannelLiquidity<&u64, &HistoricalLiquidityTracker, &Duration> {
1004                 let source_less_than_target = source < target;
1005                 let (min_liquidity_offset_msat, max_liquidity_offset_msat) =
1006                         if source_less_than_target {
1007                                 (&self.min_liquidity_offset_msat, &self.max_liquidity_offset_msat)
1008                         } else {
1009                                 (&self.max_liquidity_offset_msat, &self.min_liquidity_offset_msat)
1010                         };
1011
1012                 DirectedChannelLiquidity {
1013                         min_liquidity_offset_msat,
1014                         max_liquidity_offset_msat,
1015                         liquidity_history: self.liquidity_history.as_directed(source_less_than_target),
1016                         capacity_msat,
1017                         last_updated: &self.last_updated,
1018                         offset_history_last_updated: &self.offset_history_last_updated,
1019                 }
1020         }
1021
1022         /// Returns a mutable view of the channel liquidity directed from `source` to `target` assuming
1023         /// `capacity_msat`.
1024         fn as_directed_mut(
1025                 &mut self, source: &NodeId, target: &NodeId, capacity_msat: u64,
1026         ) -> DirectedChannelLiquidity<&mut u64, &mut HistoricalLiquidityTracker, &mut Duration> {
1027                 let source_less_than_target = source < target;
1028                 let (min_liquidity_offset_msat, max_liquidity_offset_msat) =
1029                         if source_less_than_target {
1030                                 (&mut self.min_liquidity_offset_msat, &mut self.max_liquidity_offset_msat)
1031                         } else {
1032                                 (&mut self.max_liquidity_offset_msat, &mut self.min_liquidity_offset_msat)
1033                         };
1034
1035                 DirectedChannelLiquidity {
1036                         min_liquidity_offset_msat,
1037                         max_liquidity_offset_msat,
1038                         liquidity_history: self.liquidity_history.as_directed_mut(source_less_than_target),
1039                         capacity_msat,
1040                         last_updated: &mut self.last_updated,
1041                         offset_history_last_updated: &mut self.offset_history_last_updated,
1042                 }
1043         }
1044
1045         fn decayed_offset(&self, offset: u64, duration_since_epoch: Duration,
1046                 decay_params: ProbabilisticScoringDecayParameters
1047         ) -> u64 {
1048                 let half_life = decay_params.liquidity_offset_half_life.as_secs_f64();
1049                 if half_life != 0.0 {
1050                         let elapsed_time = duration_since_epoch.saturating_sub(self.last_updated).as_secs_f64();
1051                         ((offset as f64) * powf64(0.5, elapsed_time / half_life)) as u64
1052                 } else {
1053                         0
1054                 }
1055         }
1056 }
1057
1058 /// Bounds `-log10` to avoid excessive liquidity penalties for payments with low success
1059 /// probabilities.
1060 const NEGATIVE_LOG10_UPPER_BOUND: u64 = 2;
1061
1062 /// The rough cutoff at which our precision falls off and we should stop bothering to try to log a
1063 /// ratio, as X in 1/X.
1064 const PRECISION_LOWER_BOUND_DENOMINATOR: u64 = log_approx::LOWER_BITS_BOUND;
1065
1066 /// The divisor used when computing the amount penalty.
1067 const AMOUNT_PENALTY_DIVISOR: u64 = 1 << 20;
1068 const BASE_AMOUNT_PENALTY_DIVISOR: u64 = 1 << 30;
1069
1070 /// Raises three `f64`s to the 3rd power, without `powi` because it requires `std` (dunno why).
1071 #[inline(always)]
1072 fn three_f64_pow_3(a: f64, b: f64, c: f64) -> (f64, f64, f64) {
1073         (a * a * a, b * b * b, c * c * c)
1074 }
1075
1076 #[inline(always)]
1077 fn linear_success_probability(
1078         amount_msat: u64, min_liquidity_msat: u64, max_liquidity_msat: u64,
1079         min_zero_implies_no_successes: bool,
1080 ) -> (u64, u64) {
1081         let (numerator, mut denominator) =
1082                 (max_liquidity_msat - amount_msat,
1083                  (max_liquidity_msat - min_liquidity_msat).saturating_add(1));
1084
1085         if min_zero_implies_no_successes && min_liquidity_msat == 0 &&
1086                 denominator < u64::max_value() / 21
1087         {
1088                 // If we have no knowledge of the channel, scale probability down by ~75%
1089                 // Note that we prefer to increase the denominator rather than decrease the numerator as
1090                 // the denominator is more likely to be larger and thus provide greater precision. This is
1091                 // mostly an overoptimization but makes a large difference in tests.
1092                 denominator = denominator * 21 / 16
1093         }
1094
1095         (numerator, denominator)
1096 }
1097
1098 #[inline(always)]
1099 fn nonlinear_success_probability(
1100         amount_msat: u64, min_liquidity_msat: u64, max_liquidity_msat: u64, capacity_msat: u64,
1101 ) -> (f64, f64) {
1102         let capacity = capacity_msat as f64;
1103         let min = (min_liquidity_msat as f64) / capacity;
1104         let max = (max_liquidity_msat as f64) / capacity;
1105         let amount = (amount_msat as f64) / capacity;
1106
1107         // Assume the channel has a probability density function of (x - 0.5)^2 for values from
1108         // 0 to 1 (where 1 is the channel's full capacity). The success probability given some
1109         // liquidity bounds is thus the integral under the curve from the amount to maximum
1110         // estimated liquidity, divided by the same integral from the minimum to the maximum
1111         // estimated liquidity bounds.
1112         //
1113         // Because the integral from x to y is simply (y - 0.5)^3 - (x - 0.5)^3, we can
1114         // calculate the cumulative density function between the min/max bounds trivially. Note
1115         // that we don't bother to normalize the CDF to total to 1, as it will come out in the
1116         // division of num / den.
1117         let (max_pow, amt_pow, min_pow) = three_f64_pow_3(max - 0.5, amount - 0.5, min - 0.5);
1118         (max_pow - amt_pow, max_pow - min_pow)
1119 }
1120
1121
1122 /// Given liquidity bounds, calculates the success probability (in the form of a numerator and
1123 /// denominator) of an HTLC. This is a key assumption in our scoring models.
1124 ///
1125 /// min_zero_implies_no_successes signals that a `min_liquidity_msat` of 0 means we've not
1126 /// (recently) seen an HTLC successfully complete over this channel.
1127 #[inline(always)]
1128 fn success_probability(
1129         amount_msat: u64, min_liquidity_msat: u64, max_liquidity_msat: u64, capacity_msat: u64,
1130         params: &ProbabilisticScoringFeeParameters, min_zero_implies_no_successes: bool,
1131 ) -> (u64, u64) {
1132         debug_assert!(min_liquidity_msat <= amount_msat);
1133         debug_assert!(amount_msat < max_liquidity_msat);
1134         debug_assert!(max_liquidity_msat <= capacity_msat);
1135
1136         if params.linear_success_probability {
1137                 return linear_success_probability(
1138                         amount_msat, min_liquidity_msat, max_liquidity_msat, min_zero_implies_no_successes
1139                 );
1140         }
1141
1142         let (num, den) = nonlinear_success_probability(
1143                 amount_msat, min_liquidity_msat, max_liquidity_msat, capacity_msat
1144         );
1145
1146         // Because our numerator and denominator max out at 0.5^3 we need to multiply them by
1147         // quite a large factor to get something useful (ideally in the 2^30 range).
1148         const BILLIONISH: f64 = 1024.0 * 1024.0 * 1024.0;
1149         let numerator = (num * BILLIONISH) as u64 + 1;
1150         let mut denominator = (den * BILLIONISH) as u64 + 1;
1151         debug_assert!(numerator <= 1 << 30, "Got large numerator ({}) from float {}.", numerator, num);
1152         debug_assert!(denominator <= 1 << 30, "Got large denominator ({}) from float {}.", denominator, den);
1153
1154         if min_zero_implies_no_successes && min_liquidity_msat == 0 &&
1155                 denominator < u64::max_value() / 21
1156         {
1157                 // If we have no knowledge of the channel, scale probability down by ~75%
1158                 // Note that we prefer to increase the denominator rather than decrease the numerator as
1159                 // the denominator is more likely to be larger and thus provide greater precision. This is
1160                 // mostly an overoptimization but makes a large difference in tests.
1161                 denominator = denominator * 21 / 16
1162         }
1163
1164         (numerator, denominator)
1165 }
1166
1167 /// Given liquidity bounds, calculates the success probability (times some value) of an HTLC. This
1168 /// is a key assumption in our scoring models.
1169 ///
1170 /// min_zero_implies_no_successes signals that a `min_liquidity_msat` of 0 means we've not
1171 /// (recently) seen an HTLC successfully complete over this channel.
1172 #[inline(always)]
1173 fn success_probability_times_value(
1174         amount_msat: u64, min_liquidity_msat: u64, max_liquidity_msat: u64, capacity_msat: u64,
1175         params: &ProbabilisticScoringFeeParameters, min_zero_implies_no_successes: bool,
1176         value: u32,
1177 ) -> u64 {
1178         debug_assert!(min_liquidity_msat <= amount_msat);
1179         debug_assert!(amount_msat < max_liquidity_msat);
1180         debug_assert!(max_liquidity_msat <= capacity_msat);
1181
1182         if params.linear_success_probability {
1183                 let (numerator, denominator) = linear_success_probability(
1184                         amount_msat, min_liquidity_msat, max_liquidity_msat, min_zero_implies_no_successes
1185                 );
1186                 return (value as u64) * numerator / denominator;
1187         }
1188
1189         let (num, mut den) = nonlinear_success_probability(
1190                 amount_msat, min_liquidity_msat, max_liquidity_msat, capacity_msat
1191         );
1192
1193         if min_zero_implies_no_successes && min_liquidity_msat == 0 {
1194                 // If we have no knowledge of the channel, scale probability down by ~75%
1195                 // Note that we prefer to increase the denominator rather than decrease the numerator as
1196                 // the denominator is more likely to be larger and thus provide greater precision. This is
1197                 // mostly an overoptimization but makes a large difference in tests.
1198                 den = den * 21.0 / 16.0
1199         }
1200
1201         let res = (value as f64) * num / den;
1202
1203         res as u64
1204 }
1205
1206 impl<L: Deref<Target = u64>, HT: Deref<Target = HistoricalLiquidityTracker>, T: Deref<Target = Duration>>
1207 DirectedChannelLiquidity< L, HT, T> {
1208         /// Returns a liquidity penalty for routing the given HTLC `amount_msat` through the channel in
1209         /// this direction.
1210         fn penalty_msat(&self, amount_msat: u64, score_params: &ProbabilisticScoringFeeParameters) -> u64 {
1211                 let available_capacity = self.capacity_msat;
1212                 let max_liquidity_msat = self.max_liquidity_msat();
1213                 let min_liquidity_msat = core::cmp::min(self.min_liquidity_msat(), max_liquidity_msat);
1214
1215                 let mut res = if amount_msat <= min_liquidity_msat {
1216                         0
1217                 } else if amount_msat >= max_liquidity_msat {
1218                         // Equivalent to hitting the else clause below with the amount equal to the effective
1219                         // capacity and without any certainty on the liquidity upper bound, plus the
1220                         // impossibility penalty.
1221                         let negative_log10_times_2048 = NEGATIVE_LOG10_UPPER_BOUND * 2048;
1222                         Self::combined_penalty_msat(amount_msat, negative_log10_times_2048,
1223                                         score_params.liquidity_penalty_multiplier_msat,
1224                                         score_params.liquidity_penalty_amount_multiplier_msat)
1225                                 .saturating_add(score_params.considered_impossible_penalty_msat)
1226                 } else {
1227                         let (numerator, denominator) = success_probability(amount_msat,
1228                                 min_liquidity_msat, max_liquidity_msat, available_capacity, score_params, false);
1229                         if denominator - numerator < denominator / PRECISION_LOWER_BOUND_DENOMINATOR {
1230                                 // If the failure probability is < 1.5625% (as 1 - numerator/denominator < 1/64),
1231                                 // don't bother trying to use the log approximation as it gets too noisy to be
1232                                 // particularly helpful, instead just round down to 0.
1233                                 0
1234                         } else {
1235                                 let negative_log10_times_2048 =
1236                                         log_approx::negative_log10_times_2048(numerator, denominator);
1237                                 Self::combined_penalty_msat(amount_msat, negative_log10_times_2048,
1238                                         score_params.liquidity_penalty_multiplier_msat,
1239                                         score_params.liquidity_penalty_amount_multiplier_msat)
1240                         }
1241                 };
1242
1243                 if amount_msat >= available_capacity {
1244                         // We're trying to send more than the capacity, use a max penalty.
1245                         res = res.saturating_add(Self::combined_penalty_msat(amount_msat,
1246                                 NEGATIVE_LOG10_UPPER_BOUND * 2048,
1247                                 score_params.historical_liquidity_penalty_multiplier_msat,
1248                                 score_params.historical_liquidity_penalty_amount_multiplier_msat));
1249                         return res;
1250                 }
1251
1252                 if score_params.historical_liquidity_penalty_multiplier_msat != 0 ||
1253                    score_params.historical_liquidity_penalty_amount_multiplier_msat != 0 {
1254                         if let Some(cumulative_success_prob_times_billion) = self.liquidity_history
1255                                 .calculate_success_probability_times_billion(
1256                                         score_params, amount_msat, self.capacity_msat)
1257                         {
1258                                 let historical_negative_log10_times_2048 =
1259                                         log_approx::negative_log10_times_2048(cumulative_success_prob_times_billion + 1, 1024 * 1024 * 1024);
1260                                 res = res.saturating_add(Self::combined_penalty_msat(amount_msat,
1261                                         historical_negative_log10_times_2048, score_params.historical_liquidity_penalty_multiplier_msat,
1262                                         score_params.historical_liquidity_penalty_amount_multiplier_msat));
1263                         } else {
1264                                 // If we don't have any valid points (or, once decayed, we have less than a full
1265                                 // point), redo the non-historical calculation with no liquidity bounds tracked and
1266                                 // the historical penalty multipliers.
1267                                 let (numerator, denominator) = success_probability(amount_msat, 0,
1268                                         available_capacity, available_capacity, score_params, true);
1269                                 let negative_log10_times_2048 =
1270                                         log_approx::negative_log10_times_2048(numerator, denominator);
1271                                 res = res.saturating_add(Self::combined_penalty_msat(amount_msat, negative_log10_times_2048,
1272                                         score_params.historical_liquidity_penalty_multiplier_msat,
1273                                         score_params.historical_liquidity_penalty_amount_multiplier_msat));
1274                         }
1275                 }
1276
1277                 res
1278         }
1279
1280         /// Computes the liquidity penalty from the penalty multipliers.
1281         #[inline(always)]
1282         fn combined_penalty_msat(amount_msat: u64, mut negative_log10_times_2048: u64,
1283                 liquidity_penalty_multiplier_msat: u64, liquidity_penalty_amount_multiplier_msat: u64,
1284         ) -> u64 {
1285                 negative_log10_times_2048 =
1286                         negative_log10_times_2048.min(NEGATIVE_LOG10_UPPER_BOUND * 2048);
1287
1288                 // Upper bound the liquidity penalty to ensure some channel is selected.
1289                 let liquidity_penalty_msat = negative_log10_times_2048
1290                         .saturating_mul(liquidity_penalty_multiplier_msat) / 2048;
1291                 let amount_penalty_msat = negative_log10_times_2048
1292                         .saturating_mul(liquidity_penalty_amount_multiplier_msat)
1293                         .saturating_mul(amount_msat) / 2048 / AMOUNT_PENALTY_DIVISOR;
1294
1295                 liquidity_penalty_msat.saturating_add(amount_penalty_msat)
1296         }
1297
1298         /// Returns the lower bound of the channel liquidity balance in this direction.
1299         #[inline(always)]
1300         fn min_liquidity_msat(&self) -> u64 {
1301                 *self.min_liquidity_offset_msat
1302         }
1303
1304         /// Returns the upper bound of the channel liquidity balance in this direction.
1305         #[inline(always)]
1306         fn max_liquidity_msat(&self) -> u64 {
1307                 self.capacity_msat
1308                         .saturating_sub(*self.max_liquidity_offset_msat)
1309         }
1310 }
1311
1312 impl<L: DerefMut<Target = u64>, HT: DerefMut<Target = HistoricalLiquidityTracker>, T: DerefMut<Target = Duration>>
1313 DirectedChannelLiquidity<L, HT, T> {
1314         /// Adjusts the channel liquidity balance bounds when failing to route `amount_msat`.
1315         fn failed_at_channel<Log: Deref>(
1316                 &mut self, amount_msat: u64, duration_since_epoch: Duration, chan_descr: fmt::Arguments, logger: &Log
1317         ) where Log::Target: Logger {
1318                 let existing_max_msat = self.max_liquidity_msat();
1319                 if amount_msat < existing_max_msat {
1320                         log_debug!(logger, "Setting max liquidity of {} from {} to {}", chan_descr, existing_max_msat, amount_msat);
1321                         self.set_max_liquidity_msat(amount_msat, duration_since_epoch);
1322                 } else {
1323                         log_trace!(logger, "Max liquidity of {} is {} (already less than or equal to {})",
1324                                 chan_descr, existing_max_msat, amount_msat);
1325                 }
1326                 self.update_history_buckets(0, duration_since_epoch);
1327         }
1328
1329         /// Adjusts the channel liquidity balance bounds when failing to route `amount_msat` downstream.
1330         fn failed_downstream<Log: Deref>(
1331                 &mut self, amount_msat: u64, duration_since_epoch: Duration, chan_descr: fmt::Arguments, logger: &Log
1332         ) where Log::Target: Logger {
1333                 let existing_min_msat = self.min_liquidity_msat();
1334                 if amount_msat > existing_min_msat {
1335                         log_debug!(logger, "Setting min liquidity of {} from {} to {}", existing_min_msat, chan_descr, amount_msat);
1336                         self.set_min_liquidity_msat(amount_msat, duration_since_epoch);
1337                 } else {
1338                         log_trace!(logger, "Min liquidity of {} is {} (already greater than or equal to {})",
1339                                 chan_descr, existing_min_msat, amount_msat);
1340                 }
1341                 self.update_history_buckets(0, duration_since_epoch);
1342         }
1343
1344         /// Adjusts the channel liquidity balance bounds when successfully routing `amount_msat`.
1345         fn successful<Log: Deref>(&mut self,
1346                 amount_msat: u64, duration_since_epoch: Duration, chan_descr: fmt::Arguments, logger: &Log
1347         ) where Log::Target: Logger {
1348                 let max_liquidity_msat = self.max_liquidity_msat().checked_sub(amount_msat).unwrap_or(0);
1349                 log_debug!(logger, "Subtracting {} from max liquidity of {} (setting it to {})", amount_msat, chan_descr, max_liquidity_msat);
1350                 self.set_max_liquidity_msat(max_liquidity_msat, duration_since_epoch);
1351                 self.update_history_buckets(amount_msat, duration_since_epoch);
1352         }
1353
1354         /// Updates the history buckets for this channel. Because the history buckets track what we now
1355         /// know about the channel's state *prior to our payment* (i.e. what we assume is "steady
1356         /// state"), we allow the caller to set an offset applied to our liquidity bounds which
1357         /// represents the amount of the successful payment we just made.
1358         fn update_history_buckets(&mut self, bucket_offset_msat: u64, duration_since_epoch: Duration) {
1359                 self.liquidity_history.track_datapoint(
1360                         *self.min_liquidity_offset_msat + bucket_offset_msat,
1361                         self.max_liquidity_offset_msat.saturating_sub(bucket_offset_msat),
1362                         self.capacity_msat,
1363                 );
1364                 *self.offset_history_last_updated = duration_since_epoch;
1365         }
1366
1367         /// Adjusts the lower bound of the channel liquidity balance in this direction.
1368         fn set_min_liquidity_msat(&mut self, amount_msat: u64, duration_since_epoch: Duration) {
1369                 *self.min_liquidity_offset_msat = amount_msat;
1370                 if amount_msat > self.max_liquidity_msat() {
1371                         *self.max_liquidity_offset_msat = 0;
1372                 }
1373                 *self.last_updated = duration_since_epoch;
1374         }
1375
1376         /// Adjusts the upper bound of the channel liquidity balance in this direction.
1377         fn set_max_liquidity_msat(&mut self, amount_msat: u64, duration_since_epoch: Duration) {
1378                 *self.max_liquidity_offset_msat = self.capacity_msat.checked_sub(amount_msat).unwrap_or(0);
1379                 if amount_msat < *self.min_liquidity_offset_msat {
1380                         *self.min_liquidity_offset_msat = 0;
1381                 }
1382                 *self.last_updated = duration_since_epoch;
1383         }
1384 }
1385
1386 impl<G: Deref<Target = NetworkGraph<L>>, L: Deref> ScoreLookUp for ProbabilisticScorer<G, L> where L::Target: Logger {
1387         type ScoreParams = ProbabilisticScoringFeeParameters;
1388         fn channel_penalty_msat(
1389                 &self, candidate: &CandidateRouteHop, usage: ChannelUsage, score_params: &ProbabilisticScoringFeeParameters
1390         ) -> u64 {
1391                 let (scid, target) = match candidate {
1392                         CandidateRouteHop::PublicHop { info, short_channel_id } => {
1393                                 (short_channel_id, info.target())
1394                         },
1395                         _ => return 0,
1396                 };
1397                 let source = candidate.source();
1398                 if let Some(penalty) = score_params.manual_node_penalties.get(&target) {
1399                         return *penalty;
1400                 }
1401
1402                 let base_penalty_msat = score_params.base_penalty_msat.saturating_add(
1403                         score_params.base_penalty_amount_multiplier_msat
1404                                 .saturating_mul(usage.amount_msat) / BASE_AMOUNT_PENALTY_DIVISOR);
1405
1406                 let mut anti_probing_penalty_msat = 0;
1407                 match usage.effective_capacity {
1408                         EffectiveCapacity::ExactLiquidity { liquidity_msat: amount_msat } |
1409                                 EffectiveCapacity::HintMaxHTLC { amount_msat } =>
1410                         {
1411                                 if usage.amount_msat > amount_msat {
1412                                         return u64::max_value();
1413                                 } else {
1414                                         return base_penalty_msat;
1415                                 }
1416                         },
1417                         EffectiveCapacity::Total { capacity_msat, htlc_maximum_msat } => {
1418                                 if htlc_maximum_msat >= capacity_msat/2 {
1419                                         anti_probing_penalty_msat = score_params.anti_probing_penalty_msat;
1420                                 }
1421                         },
1422                         _ => {},
1423                 }
1424
1425                 let amount_msat = usage.amount_msat.saturating_add(usage.inflight_htlc_msat);
1426                 let capacity_msat = usage.effective_capacity.as_msat();
1427                 self.channel_liquidities
1428                         .get(&scid)
1429                         .unwrap_or(&ChannelLiquidity::new(Duration::ZERO))
1430                         .as_directed(&source, &target, capacity_msat)
1431                         .penalty_msat(amount_msat, score_params)
1432                         .saturating_add(anti_probing_penalty_msat)
1433                         .saturating_add(base_penalty_msat)
1434         }
1435 }
1436
1437 impl<G: Deref<Target = NetworkGraph<L>>, L: Deref> ScoreUpdate for ProbabilisticScorer<G, L> where L::Target: Logger {
1438         fn payment_path_failed(&mut self, path: &Path, short_channel_id: u64, duration_since_epoch: Duration) {
1439                 let amount_msat = path.final_value_msat();
1440                 log_trace!(self.logger, "Scoring path through to SCID {} as having failed at {} msat", short_channel_id, amount_msat);
1441                 let network_graph = self.network_graph.read_only();
1442                 for (hop_idx, hop) in path.hops.iter().enumerate() {
1443                         let target = NodeId::from_pubkey(&hop.pubkey);
1444                         let channel_directed_from_source = network_graph.channels()
1445                                 .get(&hop.short_channel_id)
1446                                 .and_then(|channel| channel.as_directed_to(&target));
1447
1448                         let at_failed_channel = hop.short_channel_id == short_channel_id;
1449                         if at_failed_channel && hop_idx == 0 {
1450                                 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);
1451                         }
1452
1453                         // Only score announced channels.
1454                         if let Some((channel, source)) = channel_directed_from_source {
1455                                 let capacity_msat = channel.effective_capacity().as_msat();
1456                                 if at_failed_channel {
1457                                         self.channel_liquidities
1458                                                 .entry(hop.short_channel_id)
1459                                                 .or_insert_with(|| ChannelLiquidity::new(duration_since_epoch))
1460                                                 .as_directed_mut(source, &target, capacity_msat)
1461                                                 .failed_at_channel(amount_msat, duration_since_epoch,
1462                                                         format_args!("SCID {}, towards {:?}", hop.short_channel_id, target), &self.logger);
1463                                 } else {
1464                                         self.channel_liquidities
1465                                                 .entry(hop.short_channel_id)
1466                                                 .or_insert_with(|| ChannelLiquidity::new(duration_since_epoch))
1467                                                 .as_directed_mut(source, &target, capacity_msat)
1468                                                 .failed_downstream(amount_msat, duration_since_epoch,
1469                                                         format_args!("SCID {}, towards {:?}", hop.short_channel_id, target), &self.logger);
1470                                 }
1471                         } else {
1472                                 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).",
1473                                         hop.short_channel_id);
1474                         }
1475                         if at_failed_channel { break; }
1476                 }
1477         }
1478
1479         fn payment_path_successful(&mut self, path: &Path, duration_since_epoch: Duration) {
1480                 let amount_msat = path.final_value_msat();
1481                 log_trace!(self.logger, "Scoring path through SCID {} as having succeeded at {} msat.",
1482                         path.hops.split_last().map(|(hop, _)| hop.short_channel_id).unwrap_or(0), amount_msat);
1483                 let network_graph = self.network_graph.read_only();
1484                 for hop in &path.hops {
1485                         let target = NodeId::from_pubkey(&hop.pubkey);
1486                         let channel_directed_from_source = network_graph.channels()
1487                                 .get(&hop.short_channel_id)
1488                                 .and_then(|channel| channel.as_directed_to(&target));
1489
1490                         // Only score announced channels.
1491                         if let Some((channel, source)) = channel_directed_from_source {
1492                                 let capacity_msat = channel.effective_capacity().as_msat();
1493                                 self.channel_liquidities
1494                                         .entry(hop.short_channel_id)
1495                                         .or_insert_with(|| ChannelLiquidity::new(duration_since_epoch))
1496                                         .as_directed_mut(source, &target, capacity_msat)
1497                                         .successful(amount_msat, duration_since_epoch,
1498                                                 format_args!("SCID {}, towards {:?}", hop.short_channel_id, target), &self.logger);
1499                         } else {
1500                                 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).",
1501                                         hop.short_channel_id);
1502                         }
1503                 }
1504         }
1505
1506         fn probe_failed(&mut self, path: &Path, short_channel_id: u64, duration_since_epoch: Duration) {
1507                 self.payment_path_failed(path, short_channel_id, duration_since_epoch)
1508         }
1509
1510         fn probe_successful(&mut self, path: &Path, duration_since_epoch: Duration) {
1511                 self.payment_path_failed(path, u64::max_value(), duration_since_epoch)
1512         }
1513
1514         fn decay_liquidity_certainty(&mut self, duration_since_epoch: Duration) {
1515                 let decay_params = self.decay_params;
1516                 self.channel_liquidities.retain(|_scid, liquidity| {
1517                         liquidity.min_liquidity_offset_msat =
1518                                 liquidity.decayed_offset(liquidity.min_liquidity_offset_msat, duration_since_epoch, decay_params);
1519                         liquidity.max_liquidity_offset_msat =
1520                                 liquidity.decayed_offset(liquidity.max_liquidity_offset_msat, duration_since_epoch, decay_params);
1521                         liquidity.last_updated = duration_since_epoch;
1522
1523                         let elapsed_time =
1524                                 duration_since_epoch.saturating_sub(liquidity.offset_history_last_updated);
1525                         if elapsed_time > decay_params.historical_no_updates_half_life {
1526                                 let half_life = decay_params.historical_no_updates_half_life.as_secs_f64();
1527                                 if half_life != 0.0 {
1528                                         liquidity.liquidity_history.decay_buckets(elapsed_time.as_secs_f64() / half_life);
1529                                         liquidity.offset_history_last_updated = duration_since_epoch;
1530                                 }
1531                         }
1532                         liquidity.min_liquidity_offset_msat != 0 || liquidity.max_liquidity_offset_msat != 0 ||
1533                                 liquidity.liquidity_history.has_datapoints()
1534                 });
1535         }
1536 }
1537
1538 #[cfg(c_bindings)]
1539 impl<G: Deref<Target = NetworkGraph<L>>, L: Deref> Score for ProbabilisticScorer<G, L>
1540 where L::Target: Logger {}
1541
1542 #[cfg(feature = "std")]
1543 #[inline]
1544 fn powf64(n: f64, exp: f64) -> f64 {
1545         n.powf(exp)
1546 }
1547 #[cfg(not(feature = "std"))]
1548 fn powf64(n: f64, exp: f64) -> f64 {
1549         libm::powf(n as f32, exp as f32) as f64
1550 }
1551
1552 mod bucketed_history {
1553         use super::*;
1554
1555         // Because liquidity is often skewed heavily in one direction, we store historical state
1556         // distribution in buckets of different size. For backwards compatibility, buckets of size 1/8th
1557         // must fit evenly into the buckets here.
1558         //
1559         // The smallest bucket is 2^-14th of the channel, for each of our 32 buckets here we define the
1560         // width of the bucket in 2^14'ths of the channel. This increases exponentially until we reach
1561         // a full 16th of the channel's capacity, which is reapeated a few times for backwards
1562         // compatibility. The four middle buckets represent full octiles of the channel's capacity.
1563         //
1564         // For a 1 BTC channel, this let's us differentiate between failures in the bottom 6k sats, or
1565         // between the 12,000th sat and 24,000th sat, while only needing to store and operate on 32
1566         // buckets in total.
1567
1568         // By default u16s may not be cache-aligned, but we'd rather not have to read a third cache
1569         // line just to access it
1570         #[repr(align(128))]
1571         struct BucketStartPos([u16; 33]);
1572         impl BucketStartPos {
1573                 const fn new() -> Self {
1574                         Self([
1575                                 0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 3072, 4096, 6144, 8192, 10240, 12288,
1576                                 13312, 14336, 15360, 15872, 16128, 16256, 16320, 16352, 16368, 16376, 16380, 16382, 16383, 16384,
1577                         ])
1578                 }
1579         }
1580         impl core::ops::Index<usize> for BucketStartPos {
1581                 type Output = u16;
1582                 #[inline(always)]
1583                 fn index(&self, index: usize) -> &u16 { &self.0[index] }
1584         }
1585         const BUCKET_START_POS: BucketStartPos = BucketStartPos::new();
1586
1587         const LEGACY_TO_BUCKET_RANGE: [(u8, u8); 8] = [
1588                 (0, 12), (12, 14), (14, 15), (15, 16), (16, 17), (17, 18), (18, 20), (20, 32)
1589         ];
1590
1591         const POSITION_TICKS: u16 = 1 << 14;
1592
1593         fn pos_to_bucket(pos: u16) -> usize {
1594                 for bucket in 0..32 {
1595                         if pos < BUCKET_START_POS[bucket + 1] {
1596                                 return bucket;
1597                         }
1598                 }
1599                 debug_assert!(false);
1600                 return 32;
1601         }
1602
1603         #[cfg(test)]
1604         #[test]
1605         fn check_bucket_maps() {
1606                 const BUCKET_WIDTH_IN_16384S: [u16; 32] = [
1607                         1, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 1024, 1024, 2048, 2048,
1608                         2048, 2048, 1024, 1024, 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1, 1];
1609
1610                 let mut min_size_iter = 0;
1611                 let mut legacy_bucket_iter = 0;
1612                 for (bucket, width) in BUCKET_WIDTH_IN_16384S.iter().enumerate() {
1613                         assert_eq!(BUCKET_START_POS[bucket], min_size_iter);
1614                         for i in 0..*width {
1615                                 assert_eq!(pos_to_bucket(min_size_iter + i) as usize, bucket);
1616                         }
1617                         min_size_iter += *width;
1618                         if min_size_iter % (POSITION_TICKS / 8) == 0 {
1619                                 assert_eq!(LEGACY_TO_BUCKET_RANGE[legacy_bucket_iter].1 as usize, bucket + 1);
1620                                 if legacy_bucket_iter + 1 < 8 {
1621                                         assert_eq!(LEGACY_TO_BUCKET_RANGE[legacy_bucket_iter + 1].0 as usize, bucket + 1);
1622                                 }
1623                                 legacy_bucket_iter += 1;
1624                         }
1625                 }
1626                 assert_eq!(BUCKET_START_POS[32], POSITION_TICKS);
1627                 assert_eq!(min_size_iter, POSITION_TICKS);
1628         }
1629
1630         #[inline]
1631         fn amount_to_pos(amount_msat: u64, capacity_msat: u64) -> u16 {
1632                 let pos = if amount_msat < u64::max_value() / (POSITION_TICKS as u64) {
1633                         (amount_msat * (POSITION_TICKS as u64) / capacity_msat.saturating_add(1))
1634                                 .try_into().unwrap_or(POSITION_TICKS)
1635                 } else {
1636                         // Only use 128-bit arithmetic when multiplication will overflow to avoid 128-bit
1637                         // division. This branch should only be hit in fuzz testing since the amount would
1638                         // need to be over 2.88 million BTC in practice.
1639                         ((amount_msat as u128) * (POSITION_TICKS as u128)
1640                                         / (capacity_msat as u128).saturating_add(1))
1641                                 .try_into().unwrap_or(POSITION_TICKS)
1642                 };
1643                 // If we are running in a client that doesn't validate gossip, its possible for a channel's
1644                 // capacity to change due to a `channel_update` message which, if received while a payment
1645                 // is in-flight, could cause this to fail. Thus, we only assert in test.
1646                 #[cfg(test)]
1647                 debug_assert!(pos < POSITION_TICKS);
1648                 pos
1649         }
1650
1651         /// Prior to LDK 0.0.117 we used eight buckets which were split evenly across the either
1652         /// octiles. This was changed to use 32 buckets for accuracy reasons in 0.0.117, however we
1653         /// support reading the legacy values here for backwards compatibility.
1654         pub(super) struct LegacyHistoricalBucketRangeTracker {
1655                 buckets: [u16; 8],
1656         }
1657
1658         impl LegacyHistoricalBucketRangeTracker {
1659                 pub(crate) fn into_current(&self) -> HistoricalBucketRangeTracker {
1660                         let mut buckets = [0; 32];
1661                         for (idx, legacy_bucket) in self.buckets.iter().enumerate() {
1662                                 let mut new_val = *legacy_bucket;
1663                                 let (start, end) = LEGACY_TO_BUCKET_RANGE[idx];
1664                                 new_val /= (end - start) as u16;
1665                                 for i in start..end {
1666                                         buckets[i as usize] = new_val;
1667                                 }
1668                         }
1669                         HistoricalBucketRangeTracker { buckets }
1670                 }
1671         }
1672
1673         /// Tracks the historical state of a distribution as a weighted average of how much time was spent
1674         /// in each of 32 buckets.
1675         #[derive(Clone, Copy)]
1676         pub(super) struct HistoricalBucketRangeTracker {
1677                 buckets: [u16; 32],
1678         }
1679
1680         /// Buckets are stored in fixed point numbers with a 5 bit fractional part. Thus, the value
1681         /// "one" is 32, or this constant.
1682         pub const BUCKET_FIXED_POINT_ONE: u16 = 32;
1683
1684         impl HistoricalBucketRangeTracker {
1685                 pub(super) fn new() -> Self { Self { buckets: [0; 32] } }
1686                 fn track_datapoint(&mut self, liquidity_offset_msat: u64, capacity_msat: u64) {
1687                         // We have 32 leaky buckets for min and max liquidity. Each bucket tracks the amount of time
1688                         // we spend in each bucket as a 16-bit fixed-point number with a 5 bit fractional part.
1689                         //
1690                         // Each time we update our liquidity estimate, we add 32 (1.0 in our fixed-point system) to
1691                         // the buckets for the current min and max liquidity offset positions.
1692                         //
1693                         // We then decay each bucket by multiplying by 2047/2048 (avoiding dividing by a
1694                         // non-power-of-two). This ensures we can't actually overflow the u16 - when we get to
1695                         // 63,457 adding 32 and decaying by 2047/2048 leaves us back at 63,457.
1696                         //
1697                         // In total, this allows us to track data for the last 8,000 or so payments across a given
1698                         // channel.
1699                         //
1700                         // These constants are a balance - we try to fit in 2 bytes per bucket to reduce overhead,
1701                         // and need to balance having more bits in the decimal part (to ensure decay isn't too
1702                         // non-linear) with having too few bits in the mantissa, causing us to not store very many
1703                         // datapoints.
1704                         //
1705                         // The constants were picked experimentally, selecting a decay amount that restricts us
1706                         // from overflowing buckets without having to cap them manually.
1707
1708                         let pos: u16 = amount_to_pos(liquidity_offset_msat, capacity_msat);
1709                         if pos < POSITION_TICKS {
1710                                 for e in self.buckets.iter_mut() {
1711                                         *e = ((*e as u32) * 2047 / 2048) as u16;
1712                                 }
1713                                 let bucket = pos_to_bucket(pos);
1714                                 self.buckets[bucket] = self.buckets[bucket].saturating_add(BUCKET_FIXED_POINT_ONE);
1715                         }
1716                 }
1717         }
1718
1719         impl_writeable_tlv_based!(HistoricalBucketRangeTracker, { (0, buckets, required) });
1720         impl_writeable_tlv_based!(LegacyHistoricalBucketRangeTracker, { (0, buckets, required) });
1721
1722         #[derive(Clone, Copy)]
1723         #[repr(C)] // Force the fields in memory to be in the order we specify.
1724         pub(super) struct HistoricalLiquidityTracker {
1725                 total_valid_points_tracked: u64,
1726                 min_liquidity_offset_history: HistoricalBucketRangeTracker,
1727                 max_liquidity_offset_history: HistoricalBucketRangeTracker,
1728         }
1729
1730         impl HistoricalLiquidityTracker {
1731                 pub(super) fn new() -> HistoricalLiquidityTracker {
1732                         HistoricalLiquidityTracker {
1733                                 min_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
1734                                 max_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
1735                                 total_valid_points_tracked: 0,
1736                         }
1737                 }
1738
1739                 pub(super) fn from_min_max(
1740                         min_liquidity_offset_history: HistoricalBucketRangeTracker,
1741                         max_liquidity_offset_history: HistoricalBucketRangeTracker,
1742                 ) -> HistoricalLiquidityTracker {
1743                         let mut res = HistoricalLiquidityTracker {
1744                                 min_liquidity_offset_history,
1745                                 max_liquidity_offset_history,
1746                                 total_valid_points_tracked: 0,
1747                         };
1748                         res.recalculate_valid_points();
1749                         res
1750                 }
1751
1752                 pub(super) fn has_datapoints(&self) -> bool {
1753                         self.min_liquidity_offset_history.buckets != [0; 32] ||
1754                                 self.max_liquidity_offset_history.buckets != [0; 32]
1755                 }
1756
1757                 pub(super) fn decay_buckets(&mut self, half_lives: f64) {
1758                         let divisor = powf64(2048.0, half_lives) as u64;
1759                         for bucket in self.min_liquidity_offset_history.buckets.iter_mut() {
1760                                 *bucket = ((*bucket as u64) * 1024 / divisor) as u16;
1761                         }
1762                         for bucket in self.max_liquidity_offset_history.buckets.iter_mut() {
1763                                 *bucket = ((*bucket as u64) * 1024 / divisor) as u16;
1764                         }
1765                         self.recalculate_valid_points();
1766                 }
1767
1768                 fn recalculate_valid_points(&mut self) {
1769                         self.total_valid_points_tracked = 0;
1770                         for (min_idx, min_bucket) in self.min_liquidity_offset_history.buckets.iter().enumerate() {
1771                                 for max_bucket in self.max_liquidity_offset_history.buckets.iter().take(32 - min_idx) {
1772                                         self.total_valid_points_tracked += (*min_bucket as u64) * (*max_bucket as u64);
1773                                 }
1774                         }
1775                 }
1776
1777                 pub(super) fn writeable_min_offset_history(&self) -> &HistoricalBucketRangeTracker {
1778                         &self.min_liquidity_offset_history
1779                 }
1780
1781                 pub(super) fn writeable_max_offset_history(&self) -> &HistoricalBucketRangeTracker {
1782                         &self.max_liquidity_offset_history
1783                 }
1784
1785                 pub(super) fn as_directed<'a>(&'a self, source_less_than_target: bool)
1786                 -> DirectedHistoricalLiquidityTracker<&'a HistoricalLiquidityTracker> {
1787                         DirectedHistoricalLiquidityTracker { source_less_than_target, tracker: self }
1788                 }
1789
1790                 pub(super) fn as_directed_mut<'a>(&'a mut self, source_less_than_target: bool)
1791                 -> DirectedHistoricalLiquidityTracker<&'a mut HistoricalLiquidityTracker> {
1792                         DirectedHistoricalLiquidityTracker { source_less_than_target, tracker: self }
1793                 }
1794         }
1795
1796         /// A set of buckets representing the history of where we've seen the minimum- and maximum-
1797         /// liquidity bounds for a given channel.
1798         pub(super) struct DirectedHistoricalLiquidityTracker<D: Deref<Target = HistoricalLiquidityTracker>> {
1799                 source_less_than_target: bool,
1800                 tracker: D,
1801         }
1802
1803         impl<D: DerefMut<Target = HistoricalLiquidityTracker>> DirectedHistoricalLiquidityTracker<D> {
1804                 pub(super) fn track_datapoint(
1805                         &mut self, min_offset_msat: u64, max_offset_msat: u64, capacity_msat: u64,
1806                 ) {
1807                         if self.source_less_than_target {
1808                                 self.tracker.min_liquidity_offset_history.track_datapoint(min_offset_msat, capacity_msat);
1809                                 self.tracker.max_liquidity_offset_history.track_datapoint(max_offset_msat, capacity_msat);
1810                         } else {
1811                                 self.tracker.max_liquidity_offset_history.track_datapoint(min_offset_msat, capacity_msat);
1812                                 self.tracker.min_liquidity_offset_history.track_datapoint(max_offset_msat, capacity_msat);
1813                         }
1814                         self.tracker.recalculate_valid_points();
1815                 }
1816         }
1817
1818         impl<D: Deref<Target = HistoricalLiquidityTracker>> DirectedHistoricalLiquidityTracker<D> {
1819                 pub(super) fn min_liquidity_offset_history_buckets(&self) -> &[u16; 32] {
1820                         if self.source_less_than_target {
1821                                 &self.tracker.min_liquidity_offset_history.buckets
1822                         } else {
1823                                 &self.tracker.max_liquidity_offset_history.buckets
1824                         }
1825                 }
1826
1827                 pub(super) fn max_liquidity_offset_history_buckets(&self) -> &[u16; 32] {
1828                         if self.source_less_than_target {
1829                                 &self.tracker.max_liquidity_offset_history.buckets
1830                         } else {
1831                                 &self.tracker.min_liquidity_offset_history.buckets
1832                         }
1833                 }
1834
1835                 #[inline]
1836                 pub(super) fn calculate_success_probability_times_billion(
1837                         &self, params: &ProbabilisticScoringFeeParameters, amount_msat: u64,
1838                         capacity_msat: u64
1839                 ) -> Option<u64> {
1840                         // If historical penalties are enabled, we try to calculate a probability of success
1841                         // given our historical distribution of min- and max-liquidity bounds in a channel.
1842                         // To do so, we walk the set of historical liquidity bucket (min, max) combinations
1843                         // (where min_idx < max_idx, as having a minimum above our maximum is an invalid
1844                         // state). For each pair, we calculate the probability as if the bucket's corresponding
1845                         // min- and max- liquidity bounds were our current liquidity bounds and then multiply
1846                         // that probability by the weight of the selected buckets.
1847                         let payment_pos = amount_to_pos(amount_msat, capacity_msat);
1848                         if payment_pos >= POSITION_TICKS { return None; }
1849
1850                         let min_liquidity_offset_history_buckets =
1851                                 self.min_liquidity_offset_history_buckets();
1852                         let max_liquidity_offset_history_buckets =
1853                                 self.max_liquidity_offset_history_buckets();
1854
1855                         let total_valid_points_tracked = self.tracker.total_valid_points_tracked;
1856                         #[cfg(debug_assertions)] {
1857                                 let mut actual_valid_points_tracked = 0;
1858                                 for (min_idx, min_bucket) in min_liquidity_offset_history_buckets.iter().enumerate() {
1859                                         for max_bucket in max_liquidity_offset_history_buckets.iter().take(32 - min_idx) {
1860                                                 actual_valid_points_tracked += (*min_bucket as u64) * (*max_bucket as u64);
1861                                         }
1862                                 }
1863                                 assert_eq!(total_valid_points_tracked, actual_valid_points_tracked);
1864                         }
1865
1866                         // If the total valid points is smaller than 1.0 (i.e. 32 in our fixed-point scheme),
1867                         // treat it as if we were fully decayed.
1868                         const FULLY_DECAYED: u16 = BUCKET_FIXED_POINT_ONE * BUCKET_FIXED_POINT_ONE;
1869                         if total_valid_points_tracked < FULLY_DECAYED.into() {
1870                                 return None;
1871                         }
1872
1873                         let mut cumulative_success_prob_times_billion = 0;
1874                         // Special-case the 0th min bucket - it generally means we failed a payment, so only
1875                         // consider the highest (i.e. largest-offset-from-max-capacity) max bucket for all
1876                         // points against the 0th min bucket. This avoids the case where we fail to route
1877                         // increasingly lower values over a channel, but treat each failure as a separate
1878                         // datapoint, many of which may have relatively high maximum-available-liquidity
1879                         // values, which will result in us thinking we have some nontrivial probability of
1880                         // routing up to that amount.
1881                         if min_liquidity_offset_history_buckets[0] != 0 {
1882                                 let mut highest_max_bucket_with_points = 0; // The highest max-bucket with any data
1883                                 let mut total_max_points = 0; // Total points in max-buckets to consider
1884                                 for (max_idx, max_bucket) in max_liquidity_offset_history_buckets.iter().enumerate() {
1885                                         if *max_bucket >= BUCKET_FIXED_POINT_ONE {
1886                                                 highest_max_bucket_with_points = cmp::max(highest_max_bucket_with_points, max_idx);
1887                                         }
1888                                         total_max_points += *max_bucket as u64;
1889                                 }
1890                                 let max_bucket_end_pos = BUCKET_START_POS[32 - highest_max_bucket_with_points] - 1;
1891                                 if payment_pos < max_bucket_end_pos {
1892                                         let bucket_prob_times_billion =
1893                                                 (min_liquidity_offset_history_buckets[0] as u64) * total_max_points
1894                                                         * 1024 * 1024 * 1024 / total_valid_points_tracked;
1895                                         debug_assert!(bucket_prob_times_billion < u32::max_value() as u64);
1896                                         cumulative_success_prob_times_billion += success_probability_times_value(
1897                                                 payment_pos as u64, 0, max_bucket_end_pos as u64,
1898                                                 POSITION_TICKS as u64 - 1, params, true, bucket_prob_times_billion as u32
1899                                         );
1900                                 }
1901                         }
1902
1903                         for (min_idx, min_bucket) in min_liquidity_offset_history_buckets.iter().enumerate().skip(1) {
1904                                 let min_bucket_start_pos = BUCKET_START_POS[min_idx];
1905                                 for (max_idx, max_bucket) in max_liquidity_offset_history_buckets.iter().enumerate().take(32 - min_idx) {
1906                                         let max_bucket_end_pos = BUCKET_START_POS[32 - max_idx] - 1;
1907                                         if payment_pos >= max_bucket_end_pos {
1908                                                 // Success probability 0, the payment amount may be above the max liquidity
1909                                                 break;
1910                                         }
1911                                         // Note that this multiply can only barely not overflow - two 16 bit ints plus
1912                                         // 30 bits is 62 bits.
1913                                         let bucket_prob_times_billion = (*min_bucket as u64) * (*max_bucket as u64)
1914                                                 * 1024 * 1024 * 1024 / total_valid_points_tracked;
1915                                         debug_assert!(bucket_prob_times_billion < u32::max_value() as u64);
1916                                         if payment_pos < min_bucket_start_pos {
1917                                                 cumulative_success_prob_times_billion += bucket_prob_times_billion;
1918                                         } else {
1919                                                 cumulative_success_prob_times_billion += success_probability_times_value(
1920                                                         payment_pos as u64, min_bucket_start_pos as u64,
1921                                                         max_bucket_end_pos as u64, POSITION_TICKS as u64 - 1, params, true,
1922                                                         bucket_prob_times_billion as u32);
1923                                         }
1924                                 }
1925                         }
1926
1927                         Some(cumulative_success_prob_times_billion)
1928                 }
1929         }
1930 }
1931 use bucketed_history::{LegacyHistoricalBucketRangeTracker, HistoricalBucketRangeTracker, DirectedHistoricalLiquidityTracker, HistoricalLiquidityTracker};
1932
1933 impl<G: Deref<Target = NetworkGraph<L>>, L: Deref> Writeable for ProbabilisticScorer<G, L> where L::Target: Logger {
1934         #[inline]
1935         fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1936                 write_tlv_fields!(w, {
1937                         (0, self.channel_liquidities, required),
1938                 });
1939                 Ok(())
1940         }
1941 }
1942
1943 impl<G: Deref<Target = NetworkGraph<L>>, L: Deref>
1944 ReadableArgs<(ProbabilisticScoringDecayParameters, G, L)> for ProbabilisticScorer<G, L> where L::Target: Logger {
1945         #[inline]
1946         fn read<R: Read>(
1947                 r: &mut R, args: (ProbabilisticScoringDecayParameters, G, L)
1948         ) -> Result<Self, DecodeError> {
1949                 let (decay_params, network_graph, logger) = args;
1950                 let mut channel_liquidities = HashMap::new();
1951                 read_tlv_fields!(r, {
1952                         (0, channel_liquidities, required),
1953                 });
1954                 Ok(Self {
1955                         decay_params,
1956                         network_graph,
1957                         logger,
1958                         channel_liquidities,
1959                 })
1960         }
1961 }
1962
1963 impl Writeable for ChannelLiquidity {
1964         #[inline]
1965         fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
1966                 write_tlv_fields!(w, {
1967                         (0, self.min_liquidity_offset_msat, required),
1968                         // 1 was the min_liquidity_offset_history in octile form
1969                         (2, self.max_liquidity_offset_msat, required),
1970                         // 3 was the max_liquidity_offset_history in octile form
1971                         (4, self.last_updated, required),
1972                         (5, self.liquidity_history.writeable_min_offset_history(), required),
1973                         (7, self.liquidity_history.writeable_max_offset_history(), required),
1974                         (9, self.offset_history_last_updated, required),
1975                 });
1976                 Ok(())
1977         }
1978 }
1979
1980 impl Readable for ChannelLiquidity {
1981         #[inline]
1982         fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
1983                 let mut min_liquidity_offset_msat = 0;
1984                 let mut max_liquidity_offset_msat = 0;
1985                 let mut legacy_min_liq_offset_history: Option<LegacyHistoricalBucketRangeTracker> = None;
1986                 let mut legacy_max_liq_offset_history: Option<LegacyHistoricalBucketRangeTracker> = None;
1987                 let mut min_liquidity_offset_history: Option<HistoricalBucketRangeTracker> = None;
1988                 let mut max_liquidity_offset_history: Option<HistoricalBucketRangeTracker> = None;
1989                 let mut last_updated = Duration::from_secs(0);
1990                 let mut offset_history_last_updated = None;
1991                 read_tlv_fields!(r, {
1992                         (0, min_liquidity_offset_msat, required),
1993                         (1, legacy_min_liq_offset_history, option),
1994                         (2, max_liquidity_offset_msat, required),
1995                         (3, legacy_max_liq_offset_history, option),
1996                         (4, last_updated, required),
1997                         (5, min_liquidity_offset_history, option),
1998                         (7, max_liquidity_offset_history, option),
1999                         (9, offset_history_last_updated, option),
2000                 });
2001
2002                 if min_liquidity_offset_history.is_none() {
2003                         if let Some(legacy_buckets) = legacy_min_liq_offset_history {
2004                                 min_liquidity_offset_history = Some(legacy_buckets.into_current());
2005                         } else {
2006                                 min_liquidity_offset_history = Some(HistoricalBucketRangeTracker::new());
2007                         }
2008                 }
2009                 if max_liquidity_offset_history.is_none() {
2010                         if let Some(legacy_buckets) = legacy_max_liq_offset_history {
2011                                 max_liquidity_offset_history = Some(legacy_buckets.into_current());
2012                         } else {
2013                                 max_liquidity_offset_history = Some(HistoricalBucketRangeTracker::new());
2014                         }
2015                 }
2016                 Ok(Self {
2017                         min_liquidity_offset_msat,
2018                         max_liquidity_offset_msat,
2019                         liquidity_history: HistoricalLiquidityTracker::from_min_max(
2020                                 min_liquidity_offset_history.unwrap(), max_liquidity_offset_history.unwrap()
2021                         ),
2022                         last_updated,
2023                         offset_history_last_updated: offset_history_last_updated.unwrap_or(last_updated),
2024                 })
2025         }
2026 }
2027
2028 #[cfg(test)]
2029 mod tests {
2030         use super::{ChannelLiquidity, HistoricalLiquidityTracker, ProbabilisticScoringFeeParameters, ProbabilisticScoringDecayParameters, ProbabilisticScorer};
2031         use crate::blinded_path::{BlindedHop, BlindedPath};
2032         use crate::util::config::UserConfig;
2033
2034         use crate::ln::channelmanager;
2035         use crate::ln::msgs::{ChannelAnnouncement, ChannelUpdate, UnsignedChannelAnnouncement, UnsignedChannelUpdate};
2036         use crate::routing::gossip::{EffectiveCapacity, NetworkGraph, NodeId};
2037         use crate::routing::router::{BlindedTail, Path, RouteHop, CandidateRouteHop};
2038         use crate::routing::scoring::{ChannelUsage, ScoreLookUp, ScoreUpdate};
2039         use crate::util::ser::{ReadableArgs, Writeable};
2040         use crate::util::test_utils::{self, TestLogger};
2041
2042         use bitcoin::blockdata::constants::ChainHash;
2043         use bitcoin::hashes::Hash;
2044         use bitcoin::hashes::sha256d::Hash as Sha256dHash;
2045         use bitcoin::network::constants::Network;
2046         use bitcoin::secp256k1::{PublicKey, Secp256k1, SecretKey};
2047         use core::time::Duration;
2048         use crate::io;
2049
2050         fn source_privkey() -> SecretKey {
2051                 SecretKey::from_slice(&[42; 32]).unwrap()
2052         }
2053
2054         fn target_privkey() -> SecretKey {
2055                 SecretKey::from_slice(&[43; 32]).unwrap()
2056         }
2057
2058         fn source_pubkey() -> PublicKey {
2059                 let secp_ctx = Secp256k1::new();
2060                 PublicKey::from_secret_key(&secp_ctx, &source_privkey())
2061         }
2062
2063         fn target_pubkey() -> PublicKey {
2064                 let secp_ctx = Secp256k1::new();
2065                 PublicKey::from_secret_key(&secp_ctx, &target_privkey())
2066         }
2067
2068         fn source_node_id() -> NodeId {
2069                 NodeId::from_pubkey(&source_pubkey())
2070         }
2071
2072         fn target_node_id() -> NodeId {
2073                 NodeId::from_pubkey(&target_pubkey())
2074         }
2075
2076         // `ProbabilisticScorer` tests
2077
2078         fn sender_privkey() -> SecretKey {
2079                 SecretKey::from_slice(&[41; 32]).unwrap()
2080         }
2081
2082         fn recipient_privkey() -> SecretKey {
2083                 SecretKey::from_slice(&[45; 32]).unwrap()
2084         }
2085
2086         fn sender_pubkey() -> PublicKey {
2087                 let secp_ctx = Secp256k1::new();
2088                 PublicKey::from_secret_key(&secp_ctx, &sender_privkey())
2089         }
2090
2091         fn recipient_pubkey() -> PublicKey {
2092                 let secp_ctx = Secp256k1::new();
2093                 PublicKey::from_secret_key(&secp_ctx, &recipient_privkey())
2094         }
2095
2096         fn recipient_node_id() -> NodeId {
2097                 NodeId::from_pubkey(&recipient_pubkey())
2098         }
2099
2100         fn network_graph(logger: &TestLogger) -> NetworkGraph<&TestLogger> {
2101                 let mut network_graph = NetworkGraph::new(Network::Testnet, logger);
2102                 add_channel(&mut network_graph, 42, source_privkey(), target_privkey());
2103                 add_channel(&mut network_graph, 43, target_privkey(), recipient_privkey());
2104
2105                 network_graph
2106         }
2107
2108         fn add_channel(
2109                 network_graph: &mut NetworkGraph<&TestLogger>, short_channel_id: u64, node_1_key: SecretKey,
2110                 node_2_key: SecretKey
2111         ) {
2112                 let genesis_hash = ChainHash::using_genesis_block(Network::Testnet);
2113                 let node_1_secret = &SecretKey::from_slice(&[39; 32]).unwrap();
2114                 let node_2_secret = &SecretKey::from_slice(&[40; 32]).unwrap();
2115                 let secp_ctx = Secp256k1::new();
2116                 let unsigned_announcement = UnsignedChannelAnnouncement {
2117                         features: channelmanager::provided_channel_features(&UserConfig::default()),
2118                         chain_hash: genesis_hash,
2119                         short_channel_id,
2120                         node_id_1: NodeId::from_pubkey(&PublicKey::from_secret_key(&secp_ctx, &node_1_key)),
2121                         node_id_2: NodeId::from_pubkey(&PublicKey::from_secret_key(&secp_ctx, &node_2_key)),
2122                         bitcoin_key_1: NodeId::from_pubkey(&PublicKey::from_secret_key(&secp_ctx, &node_1_secret)),
2123                         bitcoin_key_2: NodeId::from_pubkey(&PublicKey::from_secret_key(&secp_ctx, &node_2_secret)),
2124                         excess_data: Vec::new(),
2125                 };
2126                 let msghash = hash_to_message!(&Sha256dHash::hash(&unsigned_announcement.encode()[..])[..]);
2127                 let signed_announcement = ChannelAnnouncement {
2128                         node_signature_1: secp_ctx.sign_ecdsa(&msghash, &node_1_key),
2129                         node_signature_2: secp_ctx.sign_ecdsa(&msghash, &node_2_key),
2130                         bitcoin_signature_1: secp_ctx.sign_ecdsa(&msghash, &node_1_secret),
2131                         bitcoin_signature_2: secp_ctx.sign_ecdsa(&msghash, &node_2_secret),
2132                         contents: unsigned_announcement,
2133                 };
2134                 let chain_source: Option<&crate::util::test_utils::TestChainSource> = None;
2135                 network_graph.update_channel_from_announcement(
2136                         &signed_announcement, &chain_source).unwrap();
2137                 update_channel(network_graph, short_channel_id, node_1_key, 0, 1_000, 100);
2138                 update_channel(network_graph, short_channel_id, node_2_key, 1, 0, 100);
2139         }
2140
2141         fn update_channel(
2142                 network_graph: &mut NetworkGraph<&TestLogger>, short_channel_id: u64, node_key: SecretKey,
2143                 flags: u8, htlc_maximum_msat: u64, timestamp: u32,
2144         ) {
2145                 let genesis_hash = ChainHash::using_genesis_block(Network::Testnet);
2146                 let secp_ctx = Secp256k1::new();
2147                 let unsigned_update = UnsignedChannelUpdate {
2148                         chain_hash: genesis_hash,
2149                         short_channel_id,
2150                         timestamp,
2151                         flags,
2152                         cltv_expiry_delta: 18,
2153                         htlc_minimum_msat: 0,
2154                         htlc_maximum_msat,
2155                         fee_base_msat: 1,
2156                         fee_proportional_millionths: 0,
2157                         excess_data: Vec::new(),
2158                 };
2159                 let msghash = hash_to_message!(&Sha256dHash::hash(&unsigned_update.encode()[..])[..]);
2160                 let signed_update = ChannelUpdate {
2161                         signature: secp_ctx.sign_ecdsa(&msghash, &node_key),
2162                         contents: unsigned_update,
2163                 };
2164                 network_graph.update_channel(&signed_update).unwrap();
2165         }
2166
2167         fn path_hop(pubkey: PublicKey, short_channel_id: u64, fee_msat: u64) -> RouteHop {
2168                 let config = UserConfig::default();
2169                 RouteHop {
2170                         pubkey,
2171                         node_features: channelmanager::provided_node_features(&config),
2172                         short_channel_id,
2173                         channel_features: channelmanager::provided_channel_features(&config),
2174                         fee_msat,
2175                         cltv_expiry_delta: 18,
2176                         maybe_announced_channel: true,
2177                 }
2178         }
2179
2180         fn payment_path_for_amount(amount_msat: u64) -> Path {
2181                 Path {
2182                         hops: vec![
2183                                 path_hop(source_pubkey(), 41, 1),
2184                                 path_hop(target_pubkey(), 42, 2),
2185                                 path_hop(recipient_pubkey(), 43, amount_msat),
2186                         ], blinded_tail: None,
2187                 }
2188         }
2189
2190         #[test]
2191         fn liquidity_bounds_directed_from_lowest_node_id() {
2192                 let logger = TestLogger::new();
2193                 let last_updated = Duration::ZERO;
2194                 let offset_history_last_updated = Duration::ZERO;
2195                 let network_graph = network_graph(&logger);
2196                 let decay_params = ProbabilisticScoringDecayParameters::default();
2197                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger)
2198                         .with_channel(42,
2199                                 ChannelLiquidity {
2200                                         min_liquidity_offset_msat: 700, max_liquidity_offset_msat: 100,
2201                                         last_updated, offset_history_last_updated,
2202                                         liquidity_history: HistoricalLiquidityTracker::new(),
2203                                 })
2204                         .with_channel(43,
2205                                 ChannelLiquidity {
2206                                         min_liquidity_offset_msat: 700, max_liquidity_offset_msat: 100,
2207                                         last_updated, offset_history_last_updated,
2208                                         liquidity_history: HistoricalLiquidityTracker::new(),
2209                                 });
2210                 let source = source_node_id();
2211                 let target = target_node_id();
2212                 let recipient = recipient_node_id();
2213                 assert!(source > target);
2214                 assert!(target < recipient);
2215
2216                 // Update minimum liquidity.
2217
2218                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2219                         .as_directed(&source, &target, 1_000);
2220                 assert_eq!(liquidity.min_liquidity_msat(), 100);
2221                 assert_eq!(liquidity.max_liquidity_msat(), 300);
2222
2223                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2224                         .as_directed(&target, &source, 1_000);
2225                 assert_eq!(liquidity.min_liquidity_msat(), 700);
2226                 assert_eq!(liquidity.max_liquidity_msat(), 900);
2227
2228                 scorer.channel_liquidities.get_mut(&42).unwrap()
2229                         .as_directed_mut(&source, &target, 1_000)
2230                         .set_min_liquidity_msat(200, Duration::ZERO);
2231
2232                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2233                         .as_directed(&source, &target, 1_000);
2234                 assert_eq!(liquidity.min_liquidity_msat(), 200);
2235                 assert_eq!(liquidity.max_liquidity_msat(), 300);
2236
2237                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2238                         .as_directed(&target, &source, 1_000);
2239                 assert_eq!(liquidity.min_liquidity_msat(), 700);
2240                 assert_eq!(liquidity.max_liquidity_msat(), 800);
2241
2242                 // Update maximum liquidity.
2243
2244                 let liquidity = scorer.channel_liquidities.get(&43).unwrap()
2245                         .as_directed(&target, &recipient, 1_000);
2246                 assert_eq!(liquidity.min_liquidity_msat(), 700);
2247                 assert_eq!(liquidity.max_liquidity_msat(), 900);
2248
2249                 let liquidity = scorer.channel_liquidities.get(&43).unwrap()
2250                         .as_directed(&recipient, &target, 1_000);
2251                 assert_eq!(liquidity.min_liquidity_msat(), 100);
2252                 assert_eq!(liquidity.max_liquidity_msat(), 300);
2253
2254                 scorer.channel_liquidities.get_mut(&43).unwrap()
2255                         .as_directed_mut(&target, &recipient, 1_000)
2256                         .set_max_liquidity_msat(200, Duration::ZERO);
2257
2258                 let liquidity = scorer.channel_liquidities.get(&43).unwrap()
2259                         .as_directed(&target, &recipient, 1_000);
2260                 assert_eq!(liquidity.min_liquidity_msat(), 0);
2261                 assert_eq!(liquidity.max_liquidity_msat(), 200);
2262
2263                 let liquidity = scorer.channel_liquidities.get(&43).unwrap()
2264                         .as_directed(&recipient, &target, 1_000);
2265                 assert_eq!(liquidity.min_liquidity_msat(), 800);
2266                 assert_eq!(liquidity.max_liquidity_msat(), 1000);
2267         }
2268
2269         #[test]
2270         fn resets_liquidity_upper_bound_when_crossed_by_lower_bound() {
2271                 let logger = TestLogger::new();
2272                 let last_updated = Duration::ZERO;
2273                 let offset_history_last_updated = Duration::ZERO;
2274                 let network_graph = network_graph(&logger);
2275                 let decay_params = ProbabilisticScoringDecayParameters::default();
2276                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger)
2277                         .with_channel(42,
2278                                 ChannelLiquidity {
2279                                         min_liquidity_offset_msat: 200, max_liquidity_offset_msat: 400,
2280                                         last_updated, offset_history_last_updated,
2281                                         liquidity_history: HistoricalLiquidityTracker::new(),
2282                                 });
2283                 let source = source_node_id();
2284                 let target = target_node_id();
2285                 assert!(source > target);
2286
2287                 // Check initial bounds.
2288                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2289                         .as_directed(&source, &target, 1_000);
2290                 assert_eq!(liquidity.min_liquidity_msat(), 400);
2291                 assert_eq!(liquidity.max_liquidity_msat(), 800);
2292
2293                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2294                         .as_directed(&target, &source, 1_000);
2295                 assert_eq!(liquidity.min_liquidity_msat(), 200);
2296                 assert_eq!(liquidity.max_liquidity_msat(), 600);
2297
2298                 // Reset from source to target.
2299                 scorer.channel_liquidities.get_mut(&42).unwrap()
2300                         .as_directed_mut(&source, &target, 1_000)
2301                         .set_min_liquidity_msat(900, Duration::ZERO);
2302
2303                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2304                         .as_directed(&source, &target, 1_000);
2305                 assert_eq!(liquidity.min_liquidity_msat(), 900);
2306                 assert_eq!(liquidity.max_liquidity_msat(), 1_000);
2307
2308                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2309                         .as_directed(&target, &source, 1_000);
2310                 assert_eq!(liquidity.min_liquidity_msat(), 0);
2311                 assert_eq!(liquidity.max_liquidity_msat(), 100);
2312
2313                 // Reset from target to source.
2314                 scorer.channel_liquidities.get_mut(&42).unwrap()
2315                         .as_directed_mut(&target, &source, 1_000)
2316                         .set_min_liquidity_msat(400, Duration::ZERO);
2317
2318                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2319                         .as_directed(&source, &target, 1_000);
2320                 assert_eq!(liquidity.min_liquidity_msat(), 0);
2321                 assert_eq!(liquidity.max_liquidity_msat(), 600);
2322
2323                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2324                         .as_directed(&target, &source, 1_000);
2325                 assert_eq!(liquidity.min_liquidity_msat(), 400);
2326                 assert_eq!(liquidity.max_liquidity_msat(), 1_000);
2327         }
2328
2329         #[test]
2330         fn resets_liquidity_lower_bound_when_crossed_by_upper_bound() {
2331                 let logger = TestLogger::new();
2332                 let last_updated = Duration::ZERO;
2333                 let offset_history_last_updated = Duration::ZERO;
2334                 let network_graph = network_graph(&logger);
2335                 let decay_params = ProbabilisticScoringDecayParameters::default();
2336                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger)
2337                         .with_channel(42,
2338                                 ChannelLiquidity {
2339                                         min_liquidity_offset_msat: 200, max_liquidity_offset_msat: 400,
2340                                         last_updated, offset_history_last_updated,
2341                                         liquidity_history: HistoricalLiquidityTracker::new(),
2342                                 });
2343                 let source = source_node_id();
2344                 let target = target_node_id();
2345                 assert!(source > target);
2346
2347                 // Check initial bounds.
2348                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2349                         .as_directed(&source, &target, 1_000);
2350                 assert_eq!(liquidity.min_liquidity_msat(), 400);
2351                 assert_eq!(liquidity.max_liquidity_msat(), 800);
2352
2353                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2354                         .as_directed(&target, &source, 1_000);
2355                 assert_eq!(liquidity.min_liquidity_msat(), 200);
2356                 assert_eq!(liquidity.max_liquidity_msat(), 600);
2357
2358                 // Reset from source to target.
2359                 scorer.channel_liquidities.get_mut(&42).unwrap()
2360                         .as_directed_mut(&source, &target, 1_000)
2361                         .set_max_liquidity_msat(300, Duration::ZERO);
2362
2363                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2364                         .as_directed(&source, &target, 1_000);
2365                 assert_eq!(liquidity.min_liquidity_msat(), 0);
2366                 assert_eq!(liquidity.max_liquidity_msat(), 300);
2367
2368                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2369                         .as_directed(&target, &source, 1_000);
2370                 assert_eq!(liquidity.min_liquidity_msat(), 700);
2371                 assert_eq!(liquidity.max_liquidity_msat(), 1_000);
2372
2373                 // Reset from target to source.
2374                 scorer.channel_liquidities.get_mut(&42).unwrap()
2375                         .as_directed_mut(&target, &source, 1_000)
2376                         .set_max_liquidity_msat(600, Duration::ZERO);
2377
2378                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2379                         .as_directed(&source, &target, 1_000);
2380                 assert_eq!(liquidity.min_liquidity_msat(), 400);
2381                 assert_eq!(liquidity.max_liquidity_msat(), 1_000);
2382
2383                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2384                         .as_directed(&target, &source, 1_000);
2385                 assert_eq!(liquidity.min_liquidity_msat(), 0);
2386                 assert_eq!(liquidity.max_liquidity_msat(), 600);
2387         }
2388
2389         #[test]
2390         fn increased_penalty_nearing_liquidity_upper_bound() {
2391                 let logger = TestLogger::new();
2392                 let network_graph = network_graph(&logger);
2393                 let params = ProbabilisticScoringFeeParameters {
2394                         liquidity_penalty_multiplier_msat: 1_000,
2395                         ..ProbabilisticScoringFeeParameters::zero_penalty()
2396                 };
2397                 let decay_params = ProbabilisticScoringDecayParameters::default();
2398                 let scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
2399                 let source = source_node_id();
2400
2401                 let usage = ChannelUsage {
2402                         amount_msat: 1_024,
2403                         inflight_htlc_msat: 0,
2404                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024_000, htlc_maximum_msat: 1_000 },
2405                 };
2406                 let network_graph = network_graph.read_only();
2407                 let channel = network_graph.channel(42).unwrap();
2408                 let (info, _) = channel.as_directed_from(&source).unwrap();
2409                 let candidate = CandidateRouteHop::PublicHop {
2410                         info,
2411                         short_channel_id: 42,
2412                 };
2413                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2414                 let usage = ChannelUsage { amount_msat: 10_240, ..usage };
2415                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2416                 let usage = ChannelUsage { amount_msat: 102_400, ..usage };
2417                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 47);
2418                 let usage = ChannelUsage { amount_msat: 1_023_999, ..usage };
2419                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 2_000);
2420
2421                 let usage = ChannelUsage {
2422                         amount_msat: 128,
2423                         inflight_htlc_msat: 0,
2424                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024, htlc_maximum_msat: 1_000 },
2425                 };
2426                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 58);
2427                 let usage = ChannelUsage { amount_msat: 256, ..usage };
2428                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 125);
2429                 let usage = ChannelUsage { amount_msat: 374, ..usage };
2430                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 198);
2431                 let usage = ChannelUsage { amount_msat: 512, ..usage };
2432                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 300);
2433                 let usage = ChannelUsage { amount_msat: 640, ..usage };
2434                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 425);
2435                 let usage = ChannelUsage { amount_msat: 768, ..usage };
2436                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 602);
2437                 let usage = ChannelUsage { amount_msat: 896, ..usage };
2438                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 902);
2439         }
2440
2441         #[test]
2442         fn constant_penalty_outside_liquidity_bounds() {
2443                 let logger = TestLogger::new();
2444                 let last_updated = Duration::ZERO;
2445                 let offset_history_last_updated = Duration::ZERO;
2446                 let network_graph = network_graph(&logger);
2447                 let params = ProbabilisticScoringFeeParameters {
2448                         liquidity_penalty_multiplier_msat: 1_000,
2449                         considered_impossible_penalty_msat: u64::max_value(),
2450                         ..ProbabilisticScoringFeeParameters::zero_penalty()
2451                 };
2452                 let decay_params = ProbabilisticScoringDecayParameters {
2453                         ..ProbabilisticScoringDecayParameters::zero_penalty()
2454                 };
2455                 let scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger)
2456                         .with_channel(42,
2457                                 ChannelLiquidity {
2458                                         min_liquidity_offset_msat: 40, max_liquidity_offset_msat: 40,
2459                                         last_updated, offset_history_last_updated,
2460                                         liquidity_history: HistoricalLiquidityTracker::new(),
2461                                 });
2462                 let source = source_node_id();
2463
2464                 let usage = ChannelUsage {
2465                         amount_msat: 39,
2466                         inflight_htlc_msat: 0,
2467                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 100, htlc_maximum_msat: 1_000 },
2468                 };
2469                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
2470                 let (info, _) = channel.as_directed_from(&source).unwrap();
2471                 let candidate = CandidateRouteHop::PublicHop {
2472                         info,
2473                         short_channel_id: 42,
2474                 };
2475                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2476                 let usage = ChannelUsage { amount_msat: 50, ..usage };
2477                 assert_ne!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2478                 assert_ne!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
2479                 let usage = ChannelUsage { amount_msat: 61, ..usage };
2480                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
2481         }
2482
2483         #[test]
2484         fn does_not_further_penalize_own_channel() {
2485                 let logger = TestLogger::new();
2486                 let network_graph = network_graph(&logger);
2487                 let params = ProbabilisticScoringFeeParameters {
2488                         liquidity_penalty_multiplier_msat: 1_000,
2489                         ..ProbabilisticScoringFeeParameters::zero_penalty()
2490                 };
2491                 let mut scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
2492                 let source = source_node_id();
2493                 let usage = ChannelUsage {
2494                         amount_msat: 500,
2495                         inflight_htlc_msat: 0,
2496                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_000, htlc_maximum_msat: 1_000 },
2497                 };
2498                 let failed_path = payment_path_for_amount(500);
2499                 let successful_path = payment_path_for_amount(200);
2500                 let channel = &network_graph.read_only().channel(42).unwrap().to_owned();
2501                 let (info, _) = channel.as_directed_from(&source).unwrap();
2502                 let candidate = CandidateRouteHop::PublicHop {
2503                         info,
2504                         short_channel_id: 41,
2505                 };
2506
2507                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 301);
2508
2509                 scorer.payment_path_failed(&failed_path, 41, Duration::ZERO);
2510                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 301);
2511
2512                 scorer.payment_path_successful(&successful_path, Duration::ZERO);
2513                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 301);
2514         }
2515
2516         #[test]
2517         fn sets_liquidity_lower_bound_on_downstream_failure() {
2518                 let logger = TestLogger::new();
2519                 let network_graph = network_graph(&logger);
2520                 let params = ProbabilisticScoringFeeParameters {
2521                         liquidity_penalty_multiplier_msat: 1_000,
2522                         ..ProbabilisticScoringFeeParameters::zero_penalty()
2523                 };
2524                 let mut scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
2525                 let source = source_node_id();
2526                 let path = payment_path_for_amount(500);
2527
2528                 let usage = ChannelUsage {
2529                         amount_msat: 250,
2530                         inflight_htlc_msat: 0,
2531                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_000, htlc_maximum_msat: 1_000 },
2532                 };
2533                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
2534                 let (info, _) = channel.as_directed_from(&source).unwrap();
2535                 let candidate = CandidateRouteHop::PublicHop {
2536                         info,
2537                         short_channel_id: 42,
2538                 };
2539                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 128);
2540                 let usage = ChannelUsage { amount_msat: 500, ..usage };
2541                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 301);
2542                 let usage = ChannelUsage { amount_msat: 750, ..usage };
2543                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 602);
2544
2545                 scorer.payment_path_failed(&path, 43, Duration::ZERO);
2546
2547                 let usage = ChannelUsage { amount_msat: 250, ..usage };
2548                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2549                 let usage = ChannelUsage { amount_msat: 500, ..usage };
2550                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2551                 let usage = ChannelUsage { amount_msat: 750, ..usage };
2552                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 300);
2553         }
2554
2555         #[test]
2556         fn sets_liquidity_upper_bound_on_failure() {
2557                 let logger = TestLogger::new();
2558                 let network_graph = network_graph(&logger);
2559                 let params = ProbabilisticScoringFeeParameters {
2560                         liquidity_penalty_multiplier_msat: 1_000,
2561                         considered_impossible_penalty_msat: u64::max_value(),
2562                         ..ProbabilisticScoringFeeParameters::zero_penalty()
2563                 };
2564                 let mut scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
2565                 let source = source_node_id();
2566                 let path = payment_path_for_amount(500);
2567
2568                 let usage = ChannelUsage {
2569                         amount_msat: 250,
2570                         inflight_htlc_msat: 0,
2571                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_000, htlc_maximum_msat: 1_000 },
2572                 };
2573                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
2574                 let (info, _) = channel.as_directed_from(&source).unwrap();
2575                 let candidate = CandidateRouteHop::PublicHop {
2576                         info,
2577                         short_channel_id: 42,
2578                 };
2579                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 128);
2580                 let usage = ChannelUsage { amount_msat: 500, ..usage };
2581                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 301);
2582                 let usage = ChannelUsage { amount_msat: 750, ..usage };
2583                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 602);
2584
2585                 scorer.payment_path_failed(&path, 42, Duration::ZERO);
2586
2587                 let usage = ChannelUsage { amount_msat: 250, ..usage };
2588                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 300);
2589                 let usage = ChannelUsage { amount_msat: 500, ..usage };
2590                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
2591                 let usage = ChannelUsage { amount_msat: 750, ..usage };
2592                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
2593         }
2594
2595         #[test]
2596         fn ignores_channels_after_removed_failed_channel() {
2597                 // Previously, if we'd tried to send over a channel which was removed from the network
2598                 // graph before we call `payment_path_failed` (which is the default if the we get a "no
2599                 // such channel" error in the `InvoicePayer`), we would call `failed_downstream` on all
2600                 // channels in the route, even ones which they payment never reached. This tests to ensure
2601                 // we do not score such channels.
2602                 let secp_ctx = Secp256k1::new();
2603                 let logger = TestLogger::new();
2604                 let mut network_graph = NetworkGraph::new(Network::Testnet, &logger);
2605                 let secret_a = SecretKey::from_slice(&[42; 32]).unwrap();
2606                 let secret_b = SecretKey::from_slice(&[43; 32]).unwrap();
2607                 let secret_c = SecretKey::from_slice(&[44; 32]).unwrap();
2608                 let secret_d = SecretKey::from_slice(&[45; 32]).unwrap();
2609                 add_channel(&mut network_graph, 42, secret_a, secret_b);
2610                 // Don't add the channel from B -> C.
2611                 add_channel(&mut network_graph, 44, secret_c, secret_d);
2612
2613                 let pub_a = PublicKey::from_secret_key(&secp_ctx, &secret_a);
2614                 let pub_b = PublicKey::from_secret_key(&secp_ctx, &secret_b);
2615                 let pub_c = PublicKey::from_secret_key(&secp_ctx, &secret_c);
2616                 let pub_d = PublicKey::from_secret_key(&secp_ctx, &secret_d);
2617
2618                 let path = vec![
2619                         path_hop(pub_b, 42, 1),
2620                         path_hop(pub_c, 43, 2),
2621                         path_hop(pub_d, 44, 100),
2622                 ];
2623
2624                 let node_a = NodeId::from_pubkey(&pub_a);
2625                 let node_b = NodeId::from_pubkey(&pub_b);
2626                 let node_c = NodeId::from_pubkey(&pub_c);
2627
2628                 let params = ProbabilisticScoringFeeParameters {
2629                         liquidity_penalty_multiplier_msat: 1_000,
2630                         ..ProbabilisticScoringFeeParameters::zero_penalty()
2631                 };
2632                 let mut scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
2633
2634                 let usage = ChannelUsage {
2635                         amount_msat: 250,
2636                         inflight_htlc_msat: 0,
2637                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_000, htlc_maximum_msat: 1_000 },
2638                 };
2639                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
2640                 let (info, _) = channel.as_directed_from(&node_a).unwrap();
2641                 let candidate = CandidateRouteHop::PublicHop {
2642                         info,
2643                         short_channel_id: 42,
2644                 };
2645                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 128);
2646                 // Note that a default liquidity bound is used for B -> C as no channel exists
2647                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
2648                 let (info, _) = channel.as_directed_from(&node_b).unwrap();
2649                 let candidate = CandidateRouteHop::PublicHop {
2650                         info,
2651                         short_channel_id: 43,
2652                 };
2653                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 128);
2654                 let channel = network_graph.read_only().channel(44).unwrap().to_owned();
2655                 let (info, _) = channel.as_directed_from(&node_c).unwrap();
2656                 let candidate = CandidateRouteHop::PublicHop {
2657                         info,
2658                         short_channel_id: 44,
2659                 };
2660                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 128);
2661
2662                 scorer.payment_path_failed(&Path { hops: path, blinded_tail: None }, 43, Duration::ZERO);
2663
2664                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
2665                 let (info, _) = channel.as_directed_from(&node_a).unwrap();
2666                 let candidate = CandidateRouteHop::PublicHop {
2667                         info,
2668                         short_channel_id: 42,
2669                 };
2670                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 80);
2671                 // Note that a default liquidity bound is used for B -> C as no channel exists
2672                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
2673                 let (info, _) = channel.as_directed_from(&node_b).unwrap();
2674                 let candidate = CandidateRouteHop::PublicHop {
2675                         info,
2676                         short_channel_id: 43,
2677                 };
2678                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 128);
2679                 let channel = network_graph.read_only().channel(44).unwrap().to_owned();
2680                 let (info, _) = channel.as_directed_from(&node_c).unwrap();
2681                 let candidate = CandidateRouteHop::PublicHop {
2682                         info,
2683                         short_channel_id: 44,
2684                 };
2685                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 128);
2686         }
2687
2688         #[test]
2689         fn reduces_liquidity_upper_bound_along_path_on_success() {
2690                 let logger = TestLogger::new();
2691                 let network_graph = network_graph(&logger);
2692                 let params = ProbabilisticScoringFeeParameters {
2693                         liquidity_penalty_multiplier_msat: 1_000,
2694                         ..ProbabilisticScoringFeeParameters::zero_penalty()
2695                 };
2696                 let mut scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
2697                 let source = source_node_id();
2698                 let usage = ChannelUsage {
2699                         amount_msat: 250,
2700                         inflight_htlc_msat: 0,
2701                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_000, htlc_maximum_msat: 1_000 },
2702                 };
2703                 let network_graph = network_graph.read_only().channels().clone();
2704                 let channel_42 = network_graph.get(&42).unwrap();
2705                 let channel_43 = network_graph.get(&43).unwrap();
2706                 let (info, _) = channel_42.as_directed_from(&source).unwrap();
2707                 let candidate_41 = CandidateRouteHop::PublicHop {
2708                         info,
2709                         short_channel_id: 41,
2710                 };
2711                 let (info, target) = channel_42.as_directed_from(&source).unwrap();
2712                 let candidate_42 = CandidateRouteHop::PublicHop {
2713                         info,
2714                         short_channel_id: 42,
2715                 };
2716                 let (info, _) = channel_43.as_directed_from(&target).unwrap();
2717                 let candidate_43 = CandidateRouteHop::PublicHop {
2718                         info,
2719                         short_channel_id: 43,
2720                 };
2721                 assert_eq!(scorer.channel_penalty_msat(&candidate_41, usage, &params), 128);
2722                 assert_eq!(scorer.channel_penalty_msat(&candidate_42, usage, &params), 128);
2723                 assert_eq!(scorer.channel_penalty_msat(&candidate_43, usage, &params), 128);
2724
2725                 scorer.payment_path_successful(&payment_path_for_amount(500), Duration::ZERO);
2726
2727                 assert_eq!(scorer.channel_penalty_msat(&candidate_41, usage, &params), 128);
2728                 assert_eq!(scorer.channel_penalty_msat(&candidate_42, usage, &params), 300);
2729                 assert_eq!(scorer.channel_penalty_msat(&candidate_43, usage, &params), 300);
2730         }
2731
2732         #[test]
2733         fn decays_liquidity_bounds_over_time() {
2734                 let logger = TestLogger::new();
2735                 let network_graph = network_graph(&logger);
2736                 let params = ProbabilisticScoringFeeParameters {
2737                         liquidity_penalty_multiplier_msat: 1_000,
2738                         considered_impossible_penalty_msat: u64::max_value(),
2739                         ..ProbabilisticScoringFeeParameters::zero_penalty()
2740                 };
2741                 let decay_params = ProbabilisticScoringDecayParameters {
2742                         liquidity_offset_half_life: Duration::from_secs(10),
2743                         ..ProbabilisticScoringDecayParameters::zero_penalty()
2744                 };
2745                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
2746                 let source = source_node_id();
2747
2748                 let usage = ChannelUsage {
2749                         amount_msat: 0,
2750                         inflight_htlc_msat: 0,
2751                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024, htlc_maximum_msat: 1_024 },
2752                 };
2753                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
2754                 let (info, _) = channel.as_directed_from(&source).unwrap();
2755                 let candidate = CandidateRouteHop::PublicHop {
2756                         info,
2757                         short_channel_id: 42,
2758                 };
2759                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2760                 let usage = ChannelUsage { amount_msat: 1_023, ..usage };
2761                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 2_000);
2762
2763                 scorer.payment_path_failed(&payment_path_for_amount(768), 42, Duration::ZERO);
2764                 scorer.payment_path_failed(&payment_path_for_amount(128), 43, Duration::ZERO);
2765
2766                 // Initial penalties
2767                 let usage = ChannelUsage { amount_msat: 128, ..usage };
2768                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2769                 let usage = ChannelUsage { amount_msat: 256, ..usage };
2770                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 93);
2771                 let usage = ChannelUsage { amount_msat: 768, ..usage };
2772                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 1_479);
2773                 let usage = ChannelUsage { amount_msat: 896, ..usage };
2774                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
2775
2776                 // Half decay (i.e., three-quarter life)
2777                 scorer.decay_liquidity_certainty(Duration::from_secs(5));
2778                 let usage = ChannelUsage { amount_msat: 128, ..usage };
2779                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 22);
2780                 let usage = ChannelUsage { amount_msat: 256, ..usage };
2781                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 106);
2782                 let usage = ChannelUsage { amount_msat: 768, ..usage };
2783                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 921);
2784                 let usage = ChannelUsage { amount_msat: 896, ..usage };
2785                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
2786
2787                 // One decay (i.e., half life)
2788                 scorer.decay_liquidity_certainty(Duration::from_secs(10));
2789                 let usage = ChannelUsage { amount_msat: 64, ..usage };
2790                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2791                 let usage = ChannelUsage { amount_msat: 128, ..usage };
2792                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 34);
2793                 let usage = ChannelUsage { amount_msat: 896, ..usage };
2794                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 1_970);
2795                 let usage = ChannelUsage { amount_msat: 960, ..usage };
2796                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
2797
2798                 // Fully decay liquidity lower bound.
2799                 scorer.decay_liquidity_certainty(Duration::from_secs(10 * 8));
2800                 let usage = ChannelUsage { amount_msat: 0, ..usage };
2801                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2802                 let usage = ChannelUsage { amount_msat: 1, ..usage };
2803                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2804                 let usage = ChannelUsage { amount_msat: 1_023, ..usage };
2805                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 2_000);
2806                 let usage = ChannelUsage { amount_msat: 1_024, ..usage };
2807                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
2808
2809                 // Fully decay liquidity upper bound.
2810                 scorer.decay_liquidity_certainty(Duration::from_secs(10 * 9));
2811                 let usage = ChannelUsage { amount_msat: 0, ..usage };
2812                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2813                 let usage = ChannelUsage { amount_msat: 1_024, ..usage };
2814                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
2815
2816                 scorer.decay_liquidity_certainty(Duration::from_secs(10 * 10));
2817                 let usage = ChannelUsage { amount_msat: 0, ..usage };
2818                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2819                 let usage = ChannelUsage { amount_msat: 1_024, ..usage };
2820                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
2821         }
2822
2823         #[test]
2824         fn restricts_liquidity_bounds_after_decay() {
2825                 let logger = TestLogger::new();
2826                 let network_graph = network_graph(&logger);
2827                 let params = ProbabilisticScoringFeeParameters {
2828                         liquidity_penalty_multiplier_msat: 1_000,
2829                         ..ProbabilisticScoringFeeParameters::zero_penalty()
2830                 };
2831                 let decay_params = ProbabilisticScoringDecayParameters {
2832                         liquidity_offset_half_life: Duration::from_secs(10),
2833                         ..ProbabilisticScoringDecayParameters::default()
2834                 };
2835                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
2836                 let source = source_node_id();
2837                 let usage = ChannelUsage {
2838                         amount_msat: 512,
2839                         inflight_htlc_msat: 0,
2840                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024, htlc_maximum_msat: 1_000 },
2841                 };
2842                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
2843                 let (info, _) = channel.as_directed_from(&source).unwrap();
2844                 let candidate = CandidateRouteHop::PublicHop {
2845                         info,
2846                         short_channel_id: 42,
2847                 };
2848
2849                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 300);
2850
2851                 // More knowledge gives higher confidence (256, 768), meaning a lower penalty.
2852                 scorer.payment_path_failed(&payment_path_for_amount(768), 42, Duration::ZERO);
2853                 scorer.payment_path_failed(&payment_path_for_amount(256), 43, Duration::ZERO);
2854                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 281);
2855
2856                 // Decaying knowledge gives less confidence (128, 896), meaning a higher penalty.
2857                 scorer.decay_liquidity_certainty(Duration::from_secs(10));
2858                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 291);
2859
2860                 // Reducing the upper bound gives more confidence (128, 832) that the payment amount (512)
2861                 // is closer to the upper bound, meaning a higher penalty.
2862                 scorer.payment_path_successful(&payment_path_for_amount(64), Duration::from_secs(10));
2863                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 331);
2864
2865                 // Increasing the lower bound gives more confidence (256, 832) that the payment amount (512)
2866                 // is closer to the lower bound, meaning a lower penalty.
2867                 scorer.payment_path_failed(&payment_path_for_amount(256), 43, Duration::from_secs(10));
2868                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 245);
2869
2870                 // Further decaying affects the lower bound more than the upper bound (128, 928).
2871                 scorer.decay_liquidity_certainty(Duration::from_secs(20));
2872                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 280);
2873         }
2874
2875         #[test]
2876         fn restores_persisted_liquidity_bounds() {
2877                 let logger = TestLogger::new();
2878                 let network_graph = network_graph(&logger);
2879                 let params = ProbabilisticScoringFeeParameters {
2880                         liquidity_penalty_multiplier_msat: 1_000,
2881                         considered_impossible_penalty_msat: u64::max_value(),
2882                         ..ProbabilisticScoringFeeParameters::zero_penalty()
2883                 };
2884                 let decay_params = ProbabilisticScoringDecayParameters {
2885                         liquidity_offset_half_life: Duration::from_secs(10),
2886                         ..ProbabilisticScoringDecayParameters::default()
2887                 };
2888                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
2889                 let source = source_node_id();
2890                 let usage = ChannelUsage {
2891                         amount_msat: 500,
2892                         inflight_htlc_msat: 0,
2893                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_000, htlc_maximum_msat: 1_000 },
2894                 };
2895
2896                 scorer.payment_path_failed(&payment_path_for_amount(500), 42, Duration::ZERO);
2897                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
2898                 let (info, _) = channel.as_directed_from(&source).unwrap();
2899                 let candidate = CandidateRouteHop::PublicHop {
2900                         info,
2901                         short_channel_id: 42,
2902                 };
2903                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
2904
2905                 scorer.decay_liquidity_certainty(Duration::from_secs(10));
2906                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 473);
2907
2908                 scorer.payment_path_failed(&payment_path_for_amount(250), 43, Duration::from_secs(10));
2909                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 300);
2910
2911                 let mut serialized_scorer = Vec::new();
2912                 scorer.write(&mut serialized_scorer).unwrap();
2913
2914                 let mut serialized_scorer = io::Cursor::new(&serialized_scorer);
2915                 let deserialized_scorer =
2916                         <ProbabilisticScorer<_, _>>::read(&mut serialized_scorer, (decay_params, &network_graph, &logger)).unwrap();
2917                 assert_eq!(deserialized_scorer.channel_penalty_msat(&candidate, usage, &params), 300);
2918         }
2919
2920         fn do_decays_persisted_liquidity_bounds(decay_before_reload: bool) {
2921                 let logger = TestLogger::new();
2922                 let network_graph = network_graph(&logger);
2923                 let params = ProbabilisticScoringFeeParameters {
2924                         liquidity_penalty_multiplier_msat: 1_000,
2925                         considered_impossible_penalty_msat: u64::max_value(),
2926                         ..ProbabilisticScoringFeeParameters::zero_penalty()
2927                 };
2928                 let decay_params = ProbabilisticScoringDecayParameters {
2929                         liquidity_offset_half_life: Duration::from_secs(10),
2930                         ..ProbabilisticScoringDecayParameters::zero_penalty()
2931                 };
2932                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
2933                 let source = source_node_id();
2934                 let usage = ChannelUsage {
2935                         amount_msat: 500,
2936                         inflight_htlc_msat: 0,
2937                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_000, htlc_maximum_msat: 1_000 },
2938                 };
2939
2940                 scorer.payment_path_failed(&payment_path_for_amount(500), 42, Duration::ZERO);
2941                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
2942                 let (info, _) = channel.as_directed_from(&source).unwrap();
2943                 let candidate = CandidateRouteHop::PublicHop {
2944                         info,
2945                         short_channel_id: 42,
2946                 };
2947                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
2948
2949                 if decay_before_reload {
2950                         scorer.decay_liquidity_certainty(Duration::from_secs(10));
2951                 }
2952
2953                 let mut serialized_scorer = Vec::new();
2954                 scorer.write(&mut serialized_scorer).unwrap();
2955
2956                 let mut serialized_scorer = io::Cursor::new(&serialized_scorer);
2957                 let mut deserialized_scorer =
2958                         <ProbabilisticScorer<_, _>>::read(&mut serialized_scorer, (decay_params, &network_graph, &logger)).unwrap();
2959                 if !decay_before_reload {
2960                         scorer.decay_liquidity_certainty(Duration::from_secs(10));
2961                         deserialized_scorer.decay_liquidity_certainty(Duration::from_secs(10));
2962                 }
2963                 assert_eq!(deserialized_scorer.channel_penalty_msat(&candidate, usage, &params), 473);
2964
2965                 scorer.payment_path_failed(&payment_path_for_amount(250), 43, Duration::from_secs(10));
2966                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 300);
2967
2968                 deserialized_scorer.decay_liquidity_certainty(Duration::from_secs(20));
2969                 assert_eq!(deserialized_scorer.channel_penalty_msat(&candidate, usage, &params), 370);
2970         }
2971
2972         #[test]
2973         fn decays_persisted_liquidity_bounds() {
2974                 do_decays_persisted_liquidity_bounds(false);
2975                 do_decays_persisted_liquidity_bounds(true);
2976         }
2977
2978         #[test]
2979         fn scores_realistic_payments() {
2980                 // Shows the scores of "realistic" sends of 100k sats over channels of 1-10m sats (with a
2981                 // 50k sat reserve).
2982                 let logger = TestLogger::new();
2983                 let network_graph = network_graph(&logger);
2984                 let params = ProbabilisticScoringFeeParameters::default();
2985                 let scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
2986                 let source = source_node_id();
2987
2988                 let usage = ChannelUsage {
2989                         amount_msat: 100_000_000,
2990                         inflight_htlc_msat: 0,
2991                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 950_000_000, htlc_maximum_msat: 1_000 },
2992                 };
2993                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
2994                 let (info, _) = channel.as_directed_from(&source).unwrap();
2995                 let candidate = CandidateRouteHop::PublicHop {
2996                         info,
2997                         short_channel_id: 42,
2998                 };
2999                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 11497);
3000                 let usage = ChannelUsage {
3001                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_950_000_000, htlc_maximum_msat: 1_000 }, ..usage
3002                 };
3003                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 7408);
3004                 let usage = ChannelUsage {
3005                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 2_950_000_000, htlc_maximum_msat: 1_000 }, ..usage
3006                 };
3007                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 6151);
3008                 let usage = ChannelUsage {
3009                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 3_950_000_000, htlc_maximum_msat: 1_000 }, ..usage
3010                 };
3011                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 5427);
3012                 let usage = ChannelUsage {
3013                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 4_950_000_000, htlc_maximum_msat: 1_000 }, ..usage
3014                 };
3015                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 4955);
3016                 let usage = ChannelUsage {
3017                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 5_950_000_000, htlc_maximum_msat: 1_000 }, ..usage
3018                 };
3019                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 4736);
3020                 let usage = ChannelUsage {
3021                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 6_950_000_000, htlc_maximum_msat: 1_000 }, ..usage
3022                 };
3023                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 4484);
3024                 let usage = ChannelUsage {
3025                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 7_450_000_000, htlc_maximum_msat: 1_000 }, ..usage
3026                 };
3027                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 4484);
3028                 let usage = ChannelUsage {
3029                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 7_950_000_000, htlc_maximum_msat: 1_000 }, ..usage
3030                 };
3031                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 4263);
3032                 let usage = ChannelUsage {
3033                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 8_950_000_000, htlc_maximum_msat: 1_000 }, ..usage
3034                 };
3035                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 4263);
3036                 let usage = ChannelUsage {
3037                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 9_950_000_000, htlc_maximum_msat: 1_000 }, ..usage
3038                 };
3039                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 4044);
3040         }
3041
3042         #[test]
3043         fn adds_base_penalty_to_liquidity_penalty() {
3044                 let logger = TestLogger::new();
3045                 let network_graph = network_graph(&logger);
3046                 let source = source_node_id();
3047                 let usage = ChannelUsage {
3048                         amount_msat: 128,
3049                         inflight_htlc_msat: 0,
3050                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024, htlc_maximum_msat: 1_000 },
3051                 };
3052
3053                 let params = ProbabilisticScoringFeeParameters {
3054                         liquidity_penalty_multiplier_msat: 1_000,
3055                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3056                 };
3057                 let scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
3058                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
3059                 let (info, _) = channel.as_directed_from(&source).unwrap();
3060                 let candidate = CandidateRouteHop::PublicHop {
3061                         info,
3062                         short_channel_id: 42,
3063                 };
3064                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 58);
3065
3066                 let params = ProbabilisticScoringFeeParameters {
3067                         base_penalty_msat: 500, liquidity_penalty_multiplier_msat: 1_000,
3068                         anti_probing_penalty_msat: 0, ..ProbabilisticScoringFeeParameters::zero_penalty()
3069                 };
3070                 let scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
3071                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 558);
3072
3073                 let params = ProbabilisticScoringFeeParameters {
3074                         base_penalty_msat: 500, liquidity_penalty_multiplier_msat: 1_000,
3075                         base_penalty_amount_multiplier_msat: (1 << 30),
3076                         anti_probing_penalty_msat: 0, ..ProbabilisticScoringFeeParameters::zero_penalty()
3077                 };
3078
3079                 let scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
3080                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 558 + 128);
3081         }
3082
3083         #[test]
3084         fn adds_amount_penalty_to_liquidity_penalty() {
3085                 let logger = TestLogger::new();
3086                 let network_graph = network_graph(&logger);
3087                 let source = source_node_id();
3088                 let usage = ChannelUsage {
3089                         amount_msat: 512_000,
3090                         inflight_htlc_msat: 0,
3091                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024_000, htlc_maximum_msat: 1_000 },
3092                 };
3093
3094                 let params = ProbabilisticScoringFeeParameters {
3095                         liquidity_penalty_multiplier_msat: 1_000,
3096                         liquidity_penalty_amount_multiplier_msat: 0,
3097                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3098                 };
3099                 let scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
3100                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
3101                 let (info, _) = channel.as_directed_from(&source).unwrap();
3102                 let candidate = CandidateRouteHop::PublicHop {
3103                         info,
3104                         short_channel_id: 42,
3105                 };
3106                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 300);
3107
3108                 let params = ProbabilisticScoringFeeParameters {
3109                         liquidity_penalty_multiplier_msat: 1_000,
3110                         liquidity_penalty_amount_multiplier_msat: 256,
3111                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3112                 };
3113                 let scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
3114                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 337);
3115         }
3116
3117         #[test]
3118         fn calculates_log10_without_overflowing_u64_max_value() {
3119                 let logger = TestLogger::new();
3120                 let network_graph = network_graph(&logger);
3121                 let source = source_node_id();
3122                 let usage = ChannelUsage {
3123                         amount_msat: u64::max_value(),
3124                         inflight_htlc_msat: 0,
3125                         effective_capacity: EffectiveCapacity::Infinite,
3126                 };
3127                 let params = ProbabilisticScoringFeeParameters {
3128                         liquidity_penalty_multiplier_msat: 40_000,
3129                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3130                 };
3131                 let decay_params = ProbabilisticScoringDecayParameters::zero_penalty();
3132                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
3133                 let (info, _) = channel.as_directed_from(&source).unwrap();
3134                 let candidate = CandidateRouteHop::PublicHop {
3135                         info,
3136                         short_channel_id: 42,
3137                 };
3138                 let scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
3139                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 80_000);
3140         }
3141
3142         #[test]
3143         fn accounts_for_inflight_htlc_usage() {
3144                 let logger = TestLogger::new();
3145                 let network_graph = network_graph(&logger);
3146                 let params = ProbabilisticScoringFeeParameters {
3147                         considered_impossible_penalty_msat: u64::max_value(),
3148                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3149                 };
3150                 let scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
3151                 let source = source_node_id();
3152
3153                 let usage = ChannelUsage {
3154                         amount_msat: 750,
3155                         inflight_htlc_msat: 0,
3156                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_000, htlc_maximum_msat: 1_000 },
3157                 };
3158                 let network_graph = network_graph.read_only();
3159                 let channel = network_graph.channel(42).unwrap();
3160                 let (info, _) = channel.as_directed_from(&source).unwrap();
3161                 let candidate = CandidateRouteHop::PublicHop {
3162                         info,
3163                         short_channel_id: 42,
3164                 };
3165                 assert_ne!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
3166
3167                 let usage = ChannelUsage { inflight_htlc_msat: 251, ..usage };
3168                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
3169         }
3170
3171         #[test]
3172         fn removes_uncertainity_when_exact_liquidity_known() {
3173                 let logger = TestLogger::new();
3174                 let network_graph = network_graph(&logger);
3175                 let params = ProbabilisticScoringFeeParameters::default();
3176                 let scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
3177                 let source = source_node_id();
3178
3179                 let base_penalty_msat = params.base_penalty_msat;
3180                 let usage = ChannelUsage {
3181                         amount_msat: 750,
3182                         inflight_htlc_msat: 0,
3183                         effective_capacity: EffectiveCapacity::ExactLiquidity { liquidity_msat: 1_000 },
3184                 };
3185                 let network_graph = network_graph.read_only();
3186                 let channel = network_graph.channel(42).unwrap();
3187                 let (info, _) = channel.as_directed_from(&source).unwrap();
3188                 let candidate = CandidateRouteHop::PublicHop {
3189                         info,
3190                         short_channel_id: 42,
3191                 };
3192                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), base_penalty_msat);
3193
3194                 let usage = ChannelUsage { amount_msat: 1_000, ..usage };
3195                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), base_penalty_msat);
3196
3197                 let usage = ChannelUsage { amount_msat: 1_001, ..usage };
3198                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
3199         }
3200
3201         #[test]
3202         fn remembers_historical_failures() {
3203                 let logger = TestLogger::new();
3204                 let network_graph = network_graph(&logger);
3205                 let params = ProbabilisticScoringFeeParameters {
3206                         historical_liquidity_penalty_multiplier_msat: 1024,
3207                         historical_liquidity_penalty_amount_multiplier_msat: 1024,
3208                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3209                 };
3210                 let decay_params = ProbabilisticScoringDecayParameters {
3211                         liquidity_offset_half_life: Duration::from_secs(60 * 60),
3212                         historical_no_updates_half_life: Duration::from_secs(10),
3213                 };
3214                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
3215                 let source = source_node_id();
3216                 let target = target_node_id();
3217
3218                 let usage = ChannelUsage {
3219                         amount_msat: 100,
3220                         inflight_htlc_msat: 0,
3221                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024, htlc_maximum_msat: 1_024 },
3222                 };
3223                 let usage_1 = ChannelUsage {
3224                         amount_msat: 1,
3225                         inflight_htlc_msat: 0,
3226                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024, htlc_maximum_msat: 1_024 },
3227                 };
3228
3229                 {
3230                         let network_graph = network_graph.read_only();
3231                         let channel = network_graph.channel(42).unwrap();
3232                         let (info, _) = channel.as_directed_from(&source).unwrap();
3233                         let candidate = CandidateRouteHop::PublicHop {
3234                                 info,
3235                                 short_channel_id: 42,
3236                         };
3237
3238                         // With no historical data the normal liquidity penalty calculation is used.
3239                         assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 168);
3240                 }
3241                 assert_eq!(scorer.historical_estimated_channel_liquidity_probabilities(42, &target),
3242                 None);
3243                 assert_eq!(scorer.historical_estimated_payment_success_probability(42, &target, 42, &params),
3244                 None);
3245
3246                 scorer.payment_path_failed(&payment_path_for_amount(1), 42, Duration::ZERO);
3247                 {
3248                         let network_graph = network_graph.read_only();
3249                         let channel = network_graph.channel(42).unwrap();
3250                         let (info, _) = channel.as_directed_from(&source).unwrap();
3251                         let candidate = CandidateRouteHop::PublicHop {
3252                                 info,
3253                                 short_channel_id: 42,
3254                         };
3255
3256                         assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 2048);
3257                         assert_eq!(scorer.channel_penalty_msat(&candidate, usage_1, &params), 249);
3258                 }
3259                 // The "it failed" increment is 32, where the probability should lie several buckets into
3260                 // the first octile.
3261                 assert_eq!(scorer.historical_estimated_channel_liquidity_probabilities(42, &target),
3262                         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],
3263                                 [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])));
3264                 assert!(scorer.historical_estimated_payment_success_probability(42, &target, 1, &params)
3265                         .unwrap() > 0.35);
3266                 assert_eq!(scorer.historical_estimated_payment_success_probability(42, &target, 500, &params),
3267                         Some(0.0));
3268
3269                 // Even after we tell the scorer we definitely have enough available liquidity, it will
3270                 // still remember that there was some failure in the past, and assign a non-0 penalty.
3271                 scorer.payment_path_failed(&payment_path_for_amount(1000), 43, Duration::ZERO);
3272                 {
3273                         let network_graph = network_graph.read_only();
3274                         let channel = network_graph.channel(42).unwrap();
3275                         let (info, _) = channel.as_directed_from(&source).unwrap();
3276                         let candidate = CandidateRouteHop::PublicHop {
3277                                 info,
3278                                 short_channel_id: 42,
3279                         };
3280
3281                         assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 105);
3282                 }
3283                 // The first points should be decayed just slightly and the last bucket has a new point.
3284                 assert_eq!(scorer.historical_estimated_channel_liquidity_probabilities(42, &target),
3285                         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],
3286                                 [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])));
3287
3288                 // The exact success probability is a bit complicated and involves integer rounding, so we
3289                 // simply check bounds here.
3290                 let five_hundred_prob =
3291                         scorer.historical_estimated_payment_success_probability(42, &target, 500, &params).unwrap();
3292                 assert!(five_hundred_prob > 0.59);
3293                 assert!(five_hundred_prob < 0.60);
3294                 let one_prob =
3295                         scorer.historical_estimated_payment_success_probability(42, &target, 1, &params).unwrap();
3296                 assert!(one_prob < 0.85);
3297                 assert!(one_prob > 0.84);
3298
3299                 // Advance the time forward 16 half-lives (which the docs claim will ensure all data is
3300                 // gone), and check that we're back to where we started.
3301                 scorer.decay_liquidity_certainty(Duration::from_secs(10 * 16));
3302                 {
3303                         let network_graph = network_graph.read_only();
3304                         let channel = network_graph.channel(42).unwrap();
3305                         let (info, _) = channel.as_directed_from(&source).unwrap();
3306                         let candidate = CandidateRouteHop::PublicHop {
3307                                 info,
3308                                 short_channel_id: 42,
3309                         };
3310
3311                         assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 168);
3312                 }
3313                 // Once fully decayed we still have data, but its all-0s. In the future we may remove the
3314                 // data entirely instead.
3315                 assert_eq!(scorer.historical_estimated_channel_liquidity_probabilities(42, &target),
3316                         Some(([0; 32], [0; 32])));
3317                 assert_eq!(scorer.historical_estimated_payment_success_probability(42, &target, 1, &params), None);
3318
3319                 let mut usage = ChannelUsage {
3320                         amount_msat: 100,
3321                         inflight_htlc_msat: 1024,
3322                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024, htlc_maximum_msat: 1_024 },
3323                 };
3324                 scorer.payment_path_failed(&payment_path_for_amount(1), 42, Duration::from_secs(10 * 16));
3325                 {
3326                         let network_graph = network_graph.read_only();
3327                         let channel = network_graph.channel(42).unwrap();
3328                         let (info, _) = channel.as_directed_from(&source).unwrap();
3329                         let candidate = CandidateRouteHop::PublicHop {
3330                                 info,
3331                                 short_channel_id: 42,
3332                         };
3333
3334                         assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 2050);
3335
3336                         let usage = ChannelUsage {
3337                                 amount_msat: 1,
3338                                 inflight_htlc_msat: 0,
3339                                 effective_capacity: EffectiveCapacity::AdvertisedMaxHTLC { amount_msat: 0 },
3340                         };
3341                         assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 2048);
3342                 }
3343
3344                 // Advance to decay all liquidity offsets to zero.
3345                 scorer.decay_liquidity_certainty(Duration::from_secs(10 * (16 + 60 * 60)));
3346
3347                 // Once even the bounds have decayed information about the channel should be removed
3348                 // entirely.
3349                 assert_eq!(scorer.historical_estimated_channel_liquidity_probabilities(42, &target),
3350                         None);
3351
3352                 // Use a path in the opposite direction, which have zero for htlc_maximum_msat. This will
3353                 // ensure that the effective capacity is zero to test division-by-zero edge cases.
3354                 let path = vec![
3355                         path_hop(target_pubkey(), 43, 2),
3356                         path_hop(source_pubkey(), 42, 1),
3357                         path_hop(sender_pubkey(), 41, 0),
3358                 ];
3359                 scorer.payment_path_failed(&Path { hops: path, blinded_tail: None }, 42, Duration::from_secs(10 * (16 + 60 * 60)));
3360         }
3361
3362         #[test]
3363         fn adds_anti_probing_penalty() {
3364                 let logger = TestLogger::new();
3365                 let network_graph = network_graph(&logger);
3366                 let source = source_node_id();
3367                 let params = ProbabilisticScoringFeeParameters {
3368                         anti_probing_penalty_msat: 500,
3369                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3370                 };
3371                 let scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
3372
3373                 // Check we receive no penalty for a low htlc_maximum_msat.
3374                 let usage = ChannelUsage {
3375                         amount_msat: 512_000,
3376                         inflight_htlc_msat: 0,
3377                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024_000, htlc_maximum_msat: 1_000 },
3378                 };
3379                 let network_graph = network_graph.read_only();
3380                 let channel = network_graph.channel(42).unwrap();
3381                 let (info, _) = channel.as_directed_from(&source).unwrap();
3382                 let candidate = CandidateRouteHop::PublicHop {
3383                         info,
3384                         short_channel_id: 42,
3385                 };
3386                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
3387
3388                 // Check we receive anti-probing penalty for htlc_maximum_msat == channel_capacity.
3389                 let usage = ChannelUsage {
3390                         amount_msat: 512_000,
3391                         inflight_htlc_msat: 0,
3392                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024_000, htlc_maximum_msat: 1_024_000 },
3393                 };
3394                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 500);
3395
3396                 // Check we receive anti-probing penalty for htlc_maximum_msat == channel_capacity/2.
3397                 let usage = ChannelUsage {
3398                         amount_msat: 512_000,
3399                         inflight_htlc_msat: 0,
3400                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024_000, htlc_maximum_msat: 512_000 },
3401                 };
3402                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 500);
3403
3404                 // Check we receive no anti-probing penalty for htlc_maximum_msat == channel_capacity/2 - 1.
3405                 let usage = ChannelUsage {
3406                         amount_msat: 512_000,
3407                         inflight_htlc_msat: 0,
3408                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024_000, htlc_maximum_msat: 511_999 },
3409                 };
3410                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
3411         }
3412
3413         #[test]
3414         fn scores_with_blinded_path() {
3415                 // Make sure we'll account for a blinded path's final_value_msat in scoring
3416                 let logger = TestLogger::new();
3417                 let network_graph = network_graph(&logger);
3418                 let params = ProbabilisticScoringFeeParameters {
3419                         liquidity_penalty_multiplier_msat: 1_000,
3420                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3421                 };
3422                 let decay_params = ProbabilisticScoringDecayParameters::default();
3423                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
3424                 let source = source_node_id();
3425                 let usage = ChannelUsage {
3426                         amount_msat: 512,
3427                         inflight_htlc_msat: 0,
3428                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024, htlc_maximum_msat: 1_000 },
3429                 };
3430                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
3431                 let (info, target) = channel.as_directed_from(&source).unwrap();
3432                 let candidate = CandidateRouteHop::PublicHop {
3433                         info,
3434                         short_channel_id: 42,
3435                 };
3436                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 300);
3437
3438                 let mut path = payment_path_for_amount(768);
3439                 let recipient_hop = path.hops.pop().unwrap();
3440                 let blinded_path = BlindedPath {
3441                         introduction_node_id: path.hops.last().as_ref().unwrap().pubkey,
3442                         blinding_point: test_utils::pubkey(42),
3443                         blinded_hops: vec![
3444                                 BlindedHop { blinded_node_id: test_utils::pubkey(44), encrypted_payload: Vec::new() }
3445                         ],
3446                 };
3447                 path.blinded_tail = Some(BlindedTail {
3448                         hops: blinded_path.blinded_hops,
3449                         blinding_point: blinded_path.blinding_point,
3450                         excess_final_cltv_expiry_delta: recipient_hop.cltv_expiry_delta,
3451                         final_value_msat: recipient_hop.fee_msat,
3452                 });
3453
3454                 // Check the liquidity before and after scoring payment failures to ensure the blinded path's
3455                 // final value is taken into account.
3456                 assert!(scorer.channel_liquidities.get(&42).is_none());
3457
3458                 scorer.payment_path_failed(&path, 42, Duration::ZERO);
3459                 path.blinded_tail.as_mut().unwrap().final_value_msat = 256;
3460                 scorer.payment_path_failed(&path, 43, Duration::ZERO);
3461
3462                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
3463                         .as_directed(&source, &target, 1_000);
3464                 assert_eq!(liquidity.min_liquidity_msat(), 256);
3465                 assert_eq!(liquidity.max_liquidity_msat(), 768);
3466         }
3467
3468         #[test]
3469         fn realistic_historical_failures() {
3470                 // The motivation for the unequal sized buckets came largely from attempting to pay 10k
3471                 // sats over a one bitcoin channel. This tests that case explicitly, ensuring that we score
3472                 // properly.
3473                 let logger = TestLogger::new();
3474                 let mut network_graph = network_graph(&logger);
3475                 let params = ProbabilisticScoringFeeParameters {
3476                         historical_liquidity_penalty_multiplier_msat: 1024,
3477                         historical_liquidity_penalty_amount_multiplier_msat: 1024,
3478                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3479                 };
3480                 let decay_params = ProbabilisticScoringDecayParameters {
3481                         liquidity_offset_half_life: Duration::from_secs(60 * 60),
3482                         historical_no_updates_half_life: Duration::from_secs(10),
3483                         ..ProbabilisticScoringDecayParameters::default()
3484                 };
3485
3486                 let capacity_msat = 100_000_000_000;
3487                 update_channel(&mut network_graph, 42, source_privkey(), 0, capacity_msat, 200);
3488                 update_channel(&mut network_graph, 42, target_privkey(), 1, capacity_msat, 200);
3489
3490                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
3491                 let source = source_node_id();
3492
3493                 let mut amount_msat = 10_000_000;
3494                 let usage = ChannelUsage {
3495                         amount_msat,
3496                         inflight_htlc_msat: 0,
3497                         effective_capacity: EffectiveCapacity::Total { capacity_msat, htlc_maximum_msat: capacity_msat },
3498                 };
3499                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
3500                 let (info, target) = channel.as_directed_from(&source).unwrap();
3501                 let candidate = CandidateRouteHop::PublicHop {
3502                         info,
3503                         short_channel_id: 42,
3504                 };
3505                 // With no historical data the normal liquidity penalty calculation is used, which results
3506                 // in a success probability of ~75%.
3507                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 1269);
3508                 assert_eq!(scorer.historical_estimated_channel_liquidity_probabilities(42, &target),
3509                         None);
3510                 assert_eq!(scorer.historical_estimated_payment_success_probability(42, &target, 42, &params),
3511                         None);
3512
3513                 // Fail to pay once, and then check the buckets and penalty.
3514                 scorer.payment_path_failed(&payment_path_for_amount(amount_msat), 42, Duration::ZERO);
3515                 // The penalty should be the maximum penalty, as the payment we're scoring is now in the
3516                 // same bucket which is the only maximum datapoint.
3517                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params),
3518                         2048 + 2048 * amount_msat / super::AMOUNT_PENALTY_DIVISOR);
3519                 // The "it failed" increment is 32, which we should apply to the first upper-bound (between
3520                 // 6k sats and 12k sats).
3521                 assert_eq!(scorer.historical_estimated_channel_liquidity_probabilities(42, &target),
3522                         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],
3523                                 [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])));
3524                 // The success probability estimate itself should be zero.
3525                 assert_eq!(scorer.historical_estimated_payment_success_probability(42, &target, amount_msat, &params),
3526                         Some(0.0));
3527
3528                 // Now test again with the amount in the bottom bucket.
3529                 amount_msat /= 2;
3530                 // The new amount is entirely within the only minimum bucket with score, so the probability
3531                 // we assign is 1/2.
3532                 assert_eq!(scorer.historical_estimated_payment_success_probability(42, &target, amount_msat, &params),
3533                         Some(0.5));
3534
3535                 // ...but once we see a failure, we consider the payment to be substantially less likely,
3536                 // even though not a probability of zero as we still look at the second max bucket which
3537                 // now shows 31.
3538                 scorer.payment_path_failed(&payment_path_for_amount(amount_msat), 42, Duration::ZERO);
3539                 assert_eq!(scorer.historical_estimated_channel_liquidity_probabilities(42, &target),
3540                         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],
3541                                 [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])));
3542                 assert_eq!(scorer.historical_estimated_payment_success_probability(42, &target, amount_msat, &params),
3543                         Some(0.0));
3544         }
3545 }
3546
3547 #[cfg(ldk_bench)]
3548 pub mod benches {
3549         use super::*;
3550         use criterion::Criterion;
3551         use crate::routing::router::{bench_utils, RouteHop};
3552         use crate::util::test_utils::TestLogger;
3553         use crate::ln::features::{ChannelFeatures, NodeFeatures};
3554
3555         pub fn decay_100k_channel_bounds(bench: &mut Criterion) {
3556                 let logger = TestLogger::new();
3557                 let (network_graph, mut scorer) = bench_utils::read_graph_scorer(&logger).unwrap();
3558                 let mut cur_time = Duration::ZERO;
3559                         cur_time += Duration::from_millis(1);
3560                         scorer.decay_liquidity_certainty(cur_time);
3561                 bench.bench_function("decay_100k_channel_bounds", |b| b.iter(|| {
3562                         cur_time += Duration::from_millis(1);
3563                         scorer.decay_liquidity_certainty(cur_time);
3564                 }));
3565         }
3566 }