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