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