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