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