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