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