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