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