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