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