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