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