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