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