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