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