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