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