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