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