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