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