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