]> git.bitcoin.ninja Git - rust-lightning/blob - lightning/src/routing/scoring.rs
Decay channel liquidity balance offsets
[rust-lightning] / lightning / src / routing / scoring.rs
1 // This file is Copyright its original authors, visible in version control
2 // history.
3 //
4 // This file is licensed under the Apache License, Version 2.0 <LICENSE-APACHE
5 // or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
6 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
7 // You may not use this file except in accordance with one or both of these
8 // licenses.
9
10 //! Utilities for scoring payment channels.
11 //!
12 //! [`ProbabilisticScorer`] may be given to [`find_route`] to score payment channels during path
13 //! finding when a custom [`Score`] implementation is not needed.
14 //!
15 //! # Example
16 //!
17 //! ```
18 //! # extern crate secp256k1;
19 //! #
20 //! # use lightning::routing::network_graph::NetworkGraph;
21 //! # use lightning::routing::router::{RouteParameters, find_route};
22 //! # use lightning::routing::scoring::{ProbabilisticScorer, ProbabilisticScoringParameters, Scorer, ScoringParameters};
23 //! # use lightning::util::logger::{Logger, Record};
24 //! # use secp256k1::key::PublicKey;
25 //! #
26 //! # struct FakeLogger {};
27 //! # impl Logger for FakeLogger {
28 //! #     fn log(&self, record: &Record) { unimplemented!() }
29 //! # }
30 //! # fn find_scored_route(payer: PublicKey, route_params: RouteParameters, network_graph: NetworkGraph) {
31 //! # let logger = FakeLogger {};
32 //! #
33 //! // Use the default channel penalties.
34 //! let params = ProbabilisticScoringParameters::default();
35 //! let scorer = ProbabilisticScorer::new(params, &network_graph);
36 //!
37 //! // Or use custom channel penalties.
38 //! let params = ProbabilisticScoringParameters {
39 //!     liquidity_penalty_multiplier_msat: 2 * 1000,
40 //!     ..ProbabilisticScoringParameters::default()
41 //! };
42 //! let scorer = ProbabilisticScorer::new(params, &network_graph);
43 //!
44 //! let route = find_route(&payer, &route_params, &network_graph, None, &logger, &scorer);
45 //! # }
46 //! ```
47 //!
48 //! # Note
49 //!
50 //! Persisting when built with feature `no-std` and restoring without it, or vice versa, uses
51 //! different types and thus is undefined.
52 //!
53 //! [`find_route`]: crate::routing::router::find_route
54
55 use ln::msgs::DecodeError;
56 use routing::network_graph::{NetworkGraph, NodeId};
57 use routing::router::RouteHop;
58 use util::ser::{Readable, ReadableArgs, Writeable, Writer};
59
60 use prelude::*;
61 use core::cell::{RefCell, RefMut};
62 use core::ops::{Deref, DerefMut};
63 use core::time::Duration;
64 use io::{self, Read};
65 use sync::{Mutex, MutexGuard};
66
67 /// We define Score ever-so-slightly differently based on whether we are being built for C bindings
68 /// or not. For users, `LockableScore` must somehow be writeable to disk. For Rust users, this is
69 /// no problem - you move a `Score` that implements `Writeable` into a `Mutex`, lock it, and now
70 /// you have the original, concrete, `Score` type, which presumably implements `Writeable`.
71 ///
72 /// For C users, once you've moved the `Score` into a `LockableScore` all you have after locking it
73 /// is an opaque trait object with an opaque pointer with no type info. Users could take the unsafe
74 /// approach of blindly casting that opaque pointer to a concrete type and calling `Writeable` from
75 /// there, but other languages downstream of the C bindings (e.g. Java) can't even do that.
76 /// Instead, we really want `Score` and `LockableScore` to implement `Writeable` directly, which we
77 /// do here by defining `Score` differently for `cfg(c_bindings)`.
78 macro_rules! define_score { ($($supertrait: path)*) => {
79 /// An interface used to score payment channels for path finding.
80 ///
81 ///     Scoring is in terms of fees willing to be paid in order to avoid routing through a channel.
82 pub trait Score $(: $supertrait)* {
83         /// Returns the fee in msats willing to be paid to avoid routing `send_amt_msat` through the
84         /// given channel in the direction from `source` to `target`.
85         ///
86         /// The channel's capacity (less any other MPP parts that are also being considered for use in
87         /// the same payment) is given by `capacity_msat`. It may be determined from various sources
88         /// such as a chain data, network gossip, or invoice hints. For invoice hints, a capacity near
89         /// [`u64::max_value`] is given to indicate sufficient capacity for the invoice's full amount.
90         /// Thus, implementations should be overflow-safe.
91         fn channel_penalty_msat(&self, short_channel_id: u64, send_amt_msat: u64, capacity_msat: u64, source: &NodeId, target: &NodeId) -> u64;
92
93         /// Handles updating channel penalties after failing to route through a channel.
94         fn payment_path_failed(&mut self, path: &[&RouteHop], short_channel_id: u64);
95
96         /// Handles updating channel penalties after successfully routing along a path.
97         fn payment_path_successful(&mut self, path: &[&RouteHop]);
98 }
99
100 impl<S: Score, T: DerefMut<Target=S> $(+ $supertrait)*> Score for T {
101         fn channel_penalty_msat(&self, short_channel_id: u64, send_amt_msat: u64, capacity_msat: u64, source: &NodeId, target: &NodeId) -> u64 {
102                 self.deref().channel_penalty_msat(short_channel_id, send_amt_msat, capacity_msat, source, target)
103         }
104
105         fn payment_path_failed(&mut self, path: &[&RouteHop], short_channel_id: u64) {
106                 self.deref_mut().payment_path_failed(path, short_channel_id)
107         }
108
109         fn payment_path_successful(&mut self, path: &[&RouteHop]) {
110                 self.deref_mut().payment_path_successful(path)
111         }
112 }
113 } }
114
115 #[cfg(c_bindings)]
116 define_score!(Writeable);
117 #[cfg(not(c_bindings))]
118 define_score!();
119
120 /// A scorer that is accessed under a lock.
121 ///
122 /// Needed so that calls to [`Score::channel_penalty_msat`] in [`find_route`] can be made while
123 /// having shared ownership of a scorer but without requiring internal locking in [`Score`]
124 /// implementations. Internal locking would be detrimental to route finding performance and could
125 /// result in [`Score::channel_penalty_msat`] returning a different value for the same channel.
126 ///
127 /// [`find_route`]: crate::routing::router::find_route
128 pub trait LockableScore<'a> {
129         /// The locked [`Score`] type.
130         type Locked: 'a + Score;
131
132         /// Returns the locked scorer.
133         fn lock(&'a self) -> Self::Locked;
134 }
135
136 /// (C-not exported)
137 impl<'a, T: 'a + Score> LockableScore<'a> for Mutex<T> {
138         type Locked = MutexGuard<'a, T>;
139
140         fn lock(&'a self) -> MutexGuard<'a, T> {
141                 Mutex::lock(self).unwrap()
142         }
143 }
144
145 impl<'a, T: 'a + Score> LockableScore<'a> for RefCell<T> {
146         type Locked = RefMut<'a, T>;
147
148         fn lock(&'a self) -> RefMut<'a, T> {
149                 self.borrow_mut()
150         }
151 }
152
153 #[cfg(c_bindings)]
154 /// A concrete implementation of [`LockableScore`] which supports multi-threading.
155 pub struct MultiThreadedLockableScore<S: Score> {
156         score: Mutex<S>,
157 }
158 #[cfg(c_bindings)]
159 /// (C-not exported)
160 impl<'a, T: Score + 'a> LockableScore<'a> for MultiThreadedLockableScore<T> {
161         type Locked = MutexGuard<'a, T>;
162
163         fn lock(&'a self) -> MutexGuard<'a, T> {
164                 Mutex::lock(&self.score).unwrap()
165         }
166 }
167
168 #[cfg(c_bindings)]
169 impl<T: Score> MultiThreadedLockableScore<T> {
170         /// Creates a new [`MultiThreadedLockableScore`] given an underlying [`Score`].
171         pub fn new(score: T) -> Self {
172                 MultiThreadedLockableScore { score: Mutex::new(score) }
173         }
174 }
175
176 #[cfg(c_bindings)]
177 /// (C-not exported)
178 impl<'a, T: Writeable> Writeable for RefMut<'a, T> {
179         fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
180                 T::write(&**self, writer)
181         }
182 }
183
184 #[cfg(c_bindings)]
185 /// (C-not exported)
186 impl<'a, S: Writeable> Writeable for MutexGuard<'a, S> {
187         fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
188                 S::write(&**self, writer)
189         }
190 }
191
192 /// [`Score`] implementation that provides reasonable default behavior.
193 ///
194 /// Used to apply a fixed penalty to each channel, thus avoiding long paths when shorter paths with
195 /// slightly higher fees are available. Will further penalize channels that fail to relay payments.
196 ///
197 /// See [module-level documentation] for usage and [`ScoringParameters`] for customization.
198 ///
199 /// [module-level documentation]: crate::routing::scoring
200 pub type Scorer = ScorerUsingTime::<ConfiguredTime>;
201
202 #[cfg(not(feature = "no-std"))]
203 type ConfiguredTime = std::time::Instant;
204 #[cfg(feature = "no-std")]
205 type ConfiguredTime = time::Eternity;
206
207 // Note that ideally we'd hide ScorerUsingTime from public view by sealing it as well, but rustdoc
208 // doesn't handle this well - instead exposing a `Scorer` which has no trait implementation(s) or
209 // methods at all.
210
211 /// [`Score`] implementation.
212 ///
213 /// # Note
214 ///
215 /// Mixing the `no-std` feature between serialization and deserialization results in undefined
216 /// behavior.
217 ///
218 /// (C-not exported) generally all users should use the [`Scorer`] type alias.
219 #[doc(hidden)]
220 pub struct ScorerUsingTime<T: Time> {
221         params: ScoringParameters,
222         // TODO: Remove entries of closed channels.
223         channel_failures: HashMap<u64, ChannelFailure<T>>,
224 }
225
226 /// Parameters for configuring [`Scorer`].
227 pub struct ScoringParameters {
228         /// A fixed penalty in msats to apply to each channel.
229         ///
230         /// Default value: 500 msat
231         pub base_penalty_msat: u64,
232
233         /// A penalty in msats to apply to a channel upon failing to relay a payment.
234         ///
235         /// This accumulates for each failure but may be reduced over time based on
236         /// [`failure_penalty_half_life`] or when successfully routing through a channel.
237         ///
238         /// Default value: 1,024,000 msat
239         ///
240         /// [`failure_penalty_half_life`]: Self::failure_penalty_half_life
241         pub failure_penalty_msat: u64,
242
243         /// When the amount being sent over a channel is this many 1024ths of the total channel
244         /// capacity, we begin applying [`overuse_penalty_msat_per_1024th`].
245         ///
246         /// Default value: 128 1024ths (i.e. begin penalizing when an HTLC uses 1/8th of a channel)
247         ///
248         /// [`overuse_penalty_msat_per_1024th`]: Self::overuse_penalty_msat_per_1024th
249         pub overuse_penalty_start_1024th: u16,
250
251         /// A penalty applied, per whole 1024ths of the channel capacity which the amount being sent
252         /// over the channel exceeds [`overuse_penalty_start_1024th`] by.
253         ///
254         /// Default value: 20 msat (i.e. 2560 msat penalty to use 1/4th of a channel, 7680 msat penalty
255         ///                to use half a channel, and 12,560 msat penalty to use 3/4ths of a channel)
256         ///
257         /// [`overuse_penalty_start_1024th`]: Self::overuse_penalty_start_1024th
258         pub overuse_penalty_msat_per_1024th: u64,
259
260         /// The time required to elapse before any accumulated [`failure_penalty_msat`] penalties are
261         /// cut in half.
262         ///
263         /// Successfully routing through a channel will immediately cut the penalty in half as well.
264         ///
265         /// Default value: 1 hour
266         ///
267         /// # Note
268         ///
269         /// When built with the `no-std` feature, time will never elapse. Therefore, this penalty will
270         /// never decay.
271         ///
272         /// [`failure_penalty_msat`]: Self::failure_penalty_msat
273         pub failure_penalty_half_life: Duration,
274 }
275
276 impl_writeable_tlv_based!(ScoringParameters, {
277         (0, base_penalty_msat, required),
278         (1, overuse_penalty_start_1024th, (default_value, 128)),
279         (2, failure_penalty_msat, required),
280         (3, overuse_penalty_msat_per_1024th, (default_value, 20)),
281         (4, failure_penalty_half_life, required),
282 });
283
284 /// Accounting for penalties against a channel for failing to relay any payments.
285 ///
286 /// Penalties decay over time, though accumulate as more failures occur.
287 struct ChannelFailure<T: Time> {
288         /// Accumulated penalty in msats for the channel as of `last_updated`.
289         undecayed_penalty_msat: u64,
290
291         /// Last time the channel either failed to route or successfully routed a payment. Used to decay
292         /// `undecayed_penalty_msat`.
293         last_updated: T,
294 }
295
296 impl<T: Time> ScorerUsingTime<T> {
297         /// Creates a new scorer using the given scoring parameters.
298         pub fn new(params: ScoringParameters) -> Self {
299                 Self {
300                         params,
301                         channel_failures: HashMap::new(),
302                 }
303         }
304
305         /// Creates a new scorer using `penalty_msat` as a fixed channel penalty.
306         #[cfg(any(test, feature = "fuzztarget", feature = "_test_utils"))]
307         pub fn with_fixed_penalty(penalty_msat: u64) -> Self {
308                 Self::new(ScoringParameters {
309                         base_penalty_msat: penalty_msat,
310                         failure_penalty_msat: 0,
311                         failure_penalty_half_life: Duration::from_secs(0),
312                         overuse_penalty_start_1024th: 1024,
313                         overuse_penalty_msat_per_1024th: 0,
314                 })
315         }
316 }
317
318 impl<T: Time> ChannelFailure<T> {
319         fn new(failure_penalty_msat: u64) -> Self {
320                 Self {
321                         undecayed_penalty_msat: failure_penalty_msat,
322                         last_updated: T::now(),
323                 }
324         }
325
326         fn add_penalty(&mut self, failure_penalty_msat: u64, half_life: Duration) {
327                 self.undecayed_penalty_msat = self.decayed_penalty_msat(half_life) + failure_penalty_msat;
328                 self.last_updated = T::now();
329         }
330
331         fn reduce_penalty(&mut self, half_life: Duration) {
332                 self.undecayed_penalty_msat = self.decayed_penalty_msat(half_life) >> 1;
333                 self.last_updated = T::now();
334         }
335
336         fn decayed_penalty_msat(&self, half_life: Duration) -> u64 {
337                 self.last_updated.elapsed().as_secs()
338                         .checked_div(half_life.as_secs())
339                         .and_then(|decays| self.undecayed_penalty_msat.checked_shr(decays as u32))
340                         .unwrap_or(0)
341         }
342 }
343
344 impl<T: Time> Default for ScorerUsingTime<T> {
345         fn default() -> Self {
346                 Self::new(ScoringParameters::default())
347         }
348 }
349
350 impl Default for ScoringParameters {
351         fn default() -> Self {
352                 Self {
353                         base_penalty_msat: 500,
354                         failure_penalty_msat: 1024 * 1000,
355                         failure_penalty_half_life: Duration::from_secs(3600),
356                         overuse_penalty_start_1024th: 1024 / 8,
357                         overuse_penalty_msat_per_1024th: 20,
358                 }
359         }
360 }
361
362 impl<T: Time> Score for ScorerUsingTime<T> {
363         fn channel_penalty_msat(
364                 &self, short_channel_id: u64, send_amt_msat: u64, capacity_msat: u64, _source: &NodeId, _target: &NodeId
365         ) -> u64 {
366                 let failure_penalty_msat = self.channel_failures
367                         .get(&short_channel_id)
368                         .map_or(0, |value| value.decayed_penalty_msat(self.params.failure_penalty_half_life));
369
370                 let mut penalty_msat = self.params.base_penalty_msat + failure_penalty_msat;
371                 let send_1024ths = send_amt_msat.checked_mul(1024).unwrap_or(u64::max_value()) / capacity_msat;
372                 if send_1024ths > self.params.overuse_penalty_start_1024th as u64 {
373                         penalty_msat = penalty_msat.checked_add(
374                                         (send_1024ths - self.params.overuse_penalty_start_1024th as u64)
375                                         .checked_mul(self.params.overuse_penalty_msat_per_1024th).unwrap_or(u64::max_value()))
376                                 .unwrap_or(u64::max_value());
377                 }
378
379                 penalty_msat
380         }
381
382         fn payment_path_failed(&mut self, _path: &[&RouteHop], short_channel_id: u64) {
383                 let failure_penalty_msat = self.params.failure_penalty_msat;
384                 let half_life = self.params.failure_penalty_half_life;
385                 self.channel_failures
386                         .entry(short_channel_id)
387                         .and_modify(|failure| failure.add_penalty(failure_penalty_msat, half_life))
388                         .or_insert_with(|| ChannelFailure::new(failure_penalty_msat));
389         }
390
391         fn payment_path_successful(&mut self, path: &[&RouteHop]) {
392                 let half_life = self.params.failure_penalty_half_life;
393                 for hop in path.iter() {
394                         self.channel_failures
395                                 .entry(hop.short_channel_id)
396                                 .and_modify(|failure| failure.reduce_penalty(half_life));
397                 }
398         }
399 }
400
401 impl<T: Time> Writeable for ScorerUsingTime<T> {
402         #[inline]
403         fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
404                 self.params.write(w)?;
405                 self.channel_failures.write(w)?;
406                 write_tlv_fields!(w, {});
407                 Ok(())
408         }
409 }
410
411 impl<T: Time> Readable for ScorerUsingTime<T> {
412         #[inline]
413         fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
414                 let res = Ok(Self {
415                         params: Readable::read(r)?,
416                         channel_failures: Readable::read(r)?,
417                 });
418                 read_tlv_fields!(r, {});
419                 res
420         }
421 }
422
423 impl<T: Time> Writeable for ChannelFailure<T> {
424         #[inline]
425         fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
426                 let duration_since_epoch = T::duration_since_epoch() - self.last_updated.elapsed();
427                 write_tlv_fields!(w, {
428                         (0, self.undecayed_penalty_msat, required),
429                         (2, duration_since_epoch, required),
430                 });
431                 Ok(())
432         }
433 }
434
435 impl<T: Time> Readable for ChannelFailure<T> {
436         #[inline]
437         fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
438                 let mut undecayed_penalty_msat = 0;
439                 let mut duration_since_epoch = Duration::from_secs(0);
440                 read_tlv_fields!(r, {
441                         (0, undecayed_penalty_msat, required),
442                         (2, duration_since_epoch, required),
443                 });
444                 Ok(Self {
445                         undecayed_penalty_msat,
446                         last_updated: T::now() - (T::duration_since_epoch() - duration_since_epoch),
447                 })
448         }
449 }
450
451 /// [`Score`] implementation using channel success probability distributions.
452 ///
453 /// Based on *Optimally Reliable & Cheap Payment Flows on the Lightning Network* by Rene Pickhardt
454 /// and Stefan Richter [[1]]. Given the uncertainty of channel liquidity balances, probability
455 /// distributions are defined based on knowledge learned from successful and unsuccessful attempts.
456 /// Then the negative log of the success probability is used to determine the cost of routing a
457 /// specific HTLC amount through a channel.
458 ///
459 /// Knowledge about channel liquidity balances takes the form of upper and lower bounds on the
460 /// possible liquidity. Certainty of the bounds is decreased over time using a decay function. See
461 /// [`ProbabilisticScoringParameters`] for details.
462 ///
463 /// [1]: https://arxiv.org/abs/2107.05322
464 pub type ProbabilisticScorer<G> = ProbabilisticScorerUsingTime::<G, ConfiguredTime>;
465
466 /// Probabilistic [`Score`] implementation.
467 ///
468 /// # Note
469 ///
470 /// Mixing the `no-std` feature between serialization and deserialization results in undefined
471 /// behavior.
472 ///
473 /// (C-not exported) generally all users should use the [`ProbabilisticScorer`] type alias.
474 #[doc(hidden)]
475 pub struct ProbabilisticScorerUsingTime<G: Deref<Target = NetworkGraph>, T: Time> {
476         params: ProbabilisticScoringParameters,
477         network_graph: G,
478         // TODO: Remove entries of closed channels.
479         channel_liquidities: HashMap<u64, ChannelLiquidity<T>>,
480 }
481
482 /// Parameters for configuring [`ProbabilisticScorer`].
483 #[derive(Clone, Copy)]
484 pub struct ProbabilisticScoringParameters {
485         /// A penalty applied after multiplying by the negative log of the channel's success probability
486         /// for a payment.
487         ///
488         /// The success probability is determined by the effective channel capacity, the payment amount,
489         /// and knowledge learned from prior successful and unsuccessful payments. The lower bound of
490         /// the success probability is 0.01, effectively limiting the penalty to the range
491         /// `0..=2*liquidity_penalty_multiplier_msat`. The knowledge learned is reduced over time based
492         /// on [`liquidity_offset_half_life`].
493         ///
494         /// Default value: 10,000 msat
495         ///
496         /// [`liquidity_offset_half_life`]: Self::liquidity_offset_half_life
497         pub liquidity_penalty_multiplier_msat: u64,
498
499         /// The time required to elapse before any knowledge learned about channel liquidity balances is
500         /// cut in half.
501         ///
502         /// The bounds are defined in terms offsets and are initially zero. Increasing the offsets gives
503         /// tighter bounds on the channel liquidity balance. Thus, halving the offsets decreases the
504         /// certainty of the channel liquidity balance.
505         ///
506         /// Default value: 1 hour
507         ///
508         /// # Note
509         ///
510         /// When built with the `no-std` feature, time will never elapse. Therefore, the channel
511         /// liquidity knowledge will never decay except when the bounds cross.
512         pub liquidity_offset_half_life: Duration,
513 }
514
515 impl_writeable_tlv_based!(ProbabilisticScoringParameters, {
516         (0, liquidity_penalty_multiplier_msat, required),
517         (2, liquidity_offset_half_life, required),
518 });
519
520 /// Accounting for channel liquidity balance uncertainty.
521 ///
522 /// Direction is defined in terms of [`NodeId`] partial ordering, where the source node is the
523 /// first node in the ordering of the channel's counterparties. Thus, swapping the two liquidity
524 /// offset fields gives the opposite direction.
525 struct ChannelLiquidity<T: Time> {
526         /// Lower channel liquidity bound in terms of an offset from zero.
527         min_liquidity_offset_msat: u64,
528
529         /// Upper channel liquidity bound in terms of an offset from the effective capacity.
530         max_liquidity_offset_msat: u64,
531         last_updated: T,
532 }
533
534 /// A view of [`ChannelLiquidity`] in one direction assuming a certain channel capacity and decayed
535 /// with a given half life.
536 struct DirectedChannelLiquidity<L: Deref<Target = u64>, T: Time, U: Deref<Target = T>> {
537         min_liquidity_offset_msat: L,
538         max_liquidity_offset_msat: L,
539         capacity_msat: u64,
540         last_updated: U,
541         now: T,
542         half_life: Duration,
543 }
544
545 impl<G: Deref<Target = NetworkGraph>, T: Time> ProbabilisticScorerUsingTime<G, T> {
546         /// Creates a new scorer using the given scoring parameters for sending payments from a node
547         /// through a network graph.
548         pub fn new(params: ProbabilisticScoringParameters, network_graph: G) -> Self {
549                 Self {
550                         params,
551                         network_graph,
552                         channel_liquidities: HashMap::new(),
553                 }
554         }
555
556         #[cfg(test)]
557         fn with_channel(mut self, short_channel_id: u64, liquidity: ChannelLiquidity<T>) -> Self {
558                 assert!(self.channel_liquidities.insert(short_channel_id, liquidity).is_none());
559                 self
560         }
561 }
562
563 impl Default for ProbabilisticScoringParameters {
564         fn default() -> Self {
565                 Self {
566                         liquidity_penalty_multiplier_msat: 10_000,
567                         liquidity_offset_half_life: Duration::from_secs(3600),
568                 }
569         }
570 }
571
572 impl<T: Time> ChannelLiquidity<T> {
573         #[inline]
574         fn new() -> Self {
575                 Self {
576                         min_liquidity_offset_msat: 0,
577                         max_liquidity_offset_msat: 0,
578                         last_updated: T::now(),
579                 }
580         }
581
582         /// Returns a view of the channel liquidity directed from `source` to `target` assuming
583         /// `capacity_msat`.
584         fn as_directed(
585                 &self, source: &NodeId, target: &NodeId, capacity_msat: u64, half_life: Duration
586         ) -> DirectedChannelLiquidity<&u64, T, &T> {
587                 let (min_liquidity_offset_msat, max_liquidity_offset_msat) = if source < target {
588                         (&self.min_liquidity_offset_msat, &self.max_liquidity_offset_msat)
589                 } else {
590                         (&self.max_liquidity_offset_msat, &self.min_liquidity_offset_msat)
591                 };
592
593                 DirectedChannelLiquidity {
594                         min_liquidity_offset_msat,
595                         max_liquidity_offset_msat,
596                         capacity_msat,
597                         last_updated: &self.last_updated,
598                         now: T::now(),
599                         half_life,
600                 }
601         }
602
603         /// Returns a mutable view of the channel liquidity directed from `source` to `target` assuming
604         /// `capacity_msat`.
605         fn as_directed_mut(
606                 &mut self, source: &NodeId, target: &NodeId, capacity_msat: u64, half_life: Duration
607         ) -> DirectedChannelLiquidity<&mut u64, T, &mut T> {
608                 let (min_liquidity_offset_msat, max_liquidity_offset_msat) = if source < target {
609                         (&mut self.min_liquidity_offset_msat, &mut self.max_liquidity_offset_msat)
610                 } else {
611                         (&mut self.max_liquidity_offset_msat, &mut self.min_liquidity_offset_msat)
612                 };
613
614                 DirectedChannelLiquidity {
615                         min_liquidity_offset_msat,
616                         max_liquidity_offset_msat,
617                         capacity_msat,
618                         last_updated: &mut self.last_updated,
619                         now: T::now(),
620                         half_life,
621                 }
622         }
623 }
624
625 impl<L: Deref<Target = u64>, T: Time, U: Deref<Target = T>> DirectedChannelLiquidity<L, T, U> {
626         /// Returns the success probability of routing the given HTLC `amount_msat` through the channel
627         /// in this direction.
628         fn success_probability(&self, amount_msat: u64) -> f64 {
629                 let max_liquidity_msat = self.max_liquidity_msat();
630                 let min_liquidity_msat = core::cmp::min(self.min_liquidity_msat(), max_liquidity_msat);
631                 if amount_msat > max_liquidity_msat {
632                         0.0
633                 } else if amount_msat <= min_liquidity_msat {
634                         1.0
635                 } else {
636                         let numerator = max_liquidity_msat + 1 - amount_msat;
637                         let denominator = max_liquidity_msat + 1 - min_liquidity_msat;
638                         numerator as f64 / denominator as f64
639                 }.max(0.01) // Lower bound the success probability to ensure some channel is selected.
640         }
641
642         /// Returns the lower bound of the channel liquidity balance in this direction.
643         fn min_liquidity_msat(&self) -> u64 {
644                 self.decayed_offset_msat(*self.min_liquidity_offset_msat)
645         }
646
647         /// Returns the upper bound of the channel liquidity balance in this direction.
648         fn max_liquidity_msat(&self) -> u64 {
649                 self.capacity_msat
650                         .checked_sub(self.decayed_offset_msat(*self.max_liquidity_offset_msat))
651                         .unwrap_or(0)
652         }
653
654         fn decayed_offset_msat(&self, offset_msat: u64) -> u64 {
655                 self.now.duration_since(*self.last_updated).as_secs()
656                         .checked_div(self.half_life.as_secs())
657                         .and_then(|decays| offset_msat.checked_shr(decays as u32))
658                         .unwrap_or(0)
659         }
660 }
661
662 impl<L: DerefMut<Target = u64>, T: Time, U: DerefMut<Target = T>> DirectedChannelLiquidity<L, T, U> {
663         /// Adjusts the channel liquidity balance bounds when failing to route `amount_msat`.
664         fn failed_at_channel(&mut self, amount_msat: u64) {
665                 if amount_msat < self.max_liquidity_msat() {
666                         self.set_max_liquidity_msat(amount_msat);
667                 }
668         }
669
670         /// Adjusts the channel liquidity balance bounds when failing to route `amount_msat` downstream.
671         fn failed_downstream(&mut self, amount_msat: u64) {
672                 if amount_msat > self.min_liquidity_msat() {
673                         self.set_min_liquidity_msat(amount_msat);
674                 }
675         }
676
677         /// Adjusts the channel liquidity balance bounds when successfully routing `amount_msat`.
678         fn successful(&mut self, amount_msat: u64) {
679                 let max_liquidity_msat = self.max_liquidity_msat().checked_sub(amount_msat).unwrap_or(0);
680                 self.set_max_liquidity_msat(max_liquidity_msat);
681         }
682
683         /// Adjusts the lower bound of the channel liquidity balance in this direction.
684         fn set_min_liquidity_msat(&mut self, amount_msat: u64) {
685                 *self.min_liquidity_offset_msat = amount_msat;
686                 *self.max_liquidity_offset_msat = if amount_msat > self.max_liquidity_msat() {
687                         0
688                 } else {
689                         self.decayed_offset_msat(*self.max_liquidity_offset_msat)
690                 };
691                 *self.last_updated = self.now;
692         }
693
694         /// Adjusts the upper bound of the channel liquidity balance in this direction.
695         fn set_max_liquidity_msat(&mut self, amount_msat: u64) {
696                 *self.max_liquidity_offset_msat = self.capacity_msat.checked_sub(amount_msat).unwrap_or(0);
697                 *self.min_liquidity_offset_msat = if amount_msat < self.min_liquidity_msat() {
698                         0
699                 } else {
700                         self.decayed_offset_msat(*self.min_liquidity_offset_msat)
701                 };
702                 *self.last_updated = self.now;
703         }
704 }
705
706 impl<G: Deref<Target = NetworkGraph>, T: Time> Score for ProbabilisticScorerUsingTime<G, T> {
707         fn channel_penalty_msat(
708                 &self, short_channel_id: u64, amount_msat: u64, capacity_msat: u64, source: &NodeId,
709                 target: &NodeId
710         ) -> u64 {
711                 let liquidity_penalty_multiplier_msat = self.params.liquidity_penalty_multiplier_msat;
712                 let liquidity_offset_half_life = self.params.liquidity_offset_half_life;
713                 let success_probability = self.channel_liquidities
714                         .get(&short_channel_id)
715                         .unwrap_or(&ChannelLiquidity::new())
716                         .as_directed(source, target, capacity_msat, liquidity_offset_half_life)
717                         .success_probability(amount_msat);
718                 // NOTE: If success_probability is ever changed to return 0.0, log10 is undefined so return
719                 // u64::max_value instead.
720                 debug_assert!(success_probability > core::f64::EPSILON);
721                 (-(success_probability.log10()) * liquidity_penalty_multiplier_msat as f64) as u64
722         }
723
724         fn payment_path_failed(&mut self, path: &[&RouteHop], short_channel_id: u64) {
725                 let amount_msat = path.split_last().map(|(hop, _)| hop.fee_msat).unwrap_or(0);
726                 let liquidity_offset_half_life = self.params.liquidity_offset_half_life;
727                 let network_graph = self.network_graph.read_only();
728                 for hop in path {
729                         let target = NodeId::from_pubkey(&hop.pubkey);
730                         let channel_directed_from_source = network_graph.channels()
731                                 .get(&hop.short_channel_id)
732                                 .and_then(|channel| channel.as_directed_to(&target));
733
734                         // Only score announced channels.
735                         if let Some((channel, source)) = channel_directed_from_source {
736                                 let capacity_msat = channel.effective_capacity().as_msat();
737                                 if hop.short_channel_id == short_channel_id {
738                                         self.channel_liquidities
739                                                 .entry(hop.short_channel_id)
740                                                 .or_insert_with(ChannelLiquidity::new)
741                                                 .as_directed_mut(source, &target, capacity_msat, liquidity_offset_half_life)
742                                                 .failed_at_channel(amount_msat);
743                                         break;
744                                 }
745
746                                 self.channel_liquidities
747                                         .entry(hop.short_channel_id)
748                                         .or_insert_with(ChannelLiquidity::new)
749                                         .as_directed_mut(source, &target, capacity_msat, liquidity_offset_half_life)
750                                         .failed_downstream(amount_msat);
751                         }
752                 }
753         }
754
755         fn payment_path_successful(&mut self, path: &[&RouteHop]) {
756                 let amount_msat = path.split_last().map(|(hop, _)| hop.fee_msat).unwrap_or(0);
757                 let liquidity_offset_half_life = self.params.liquidity_offset_half_life;
758                 let network_graph = self.network_graph.read_only();
759                 for hop in path {
760                         let target = NodeId::from_pubkey(&hop.pubkey);
761                         let channel_directed_from_source = network_graph.channels()
762                                 .get(&hop.short_channel_id)
763                                 .and_then(|channel| channel.as_directed_to(&target));
764
765                         // Only score announced channels.
766                         if let Some((channel, source)) = channel_directed_from_source {
767                                 let capacity_msat = channel.effective_capacity().as_msat();
768                                 self.channel_liquidities
769                                         .entry(hop.short_channel_id)
770                                         .or_insert_with(ChannelLiquidity::new)
771                                         .as_directed_mut(source, &target, capacity_msat, liquidity_offset_half_life)
772                                         .successful(amount_msat);
773                         }
774                 }
775         }
776 }
777
778 impl<G: Deref<Target = NetworkGraph>, T: Time> Writeable for ProbabilisticScorerUsingTime<G, T> {
779         #[inline]
780         fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
781                 write_tlv_fields!(w, {
782                         (0, self.channel_liquidities, required)
783                 });
784                 Ok(())
785         }
786 }
787
788 impl<G, T> ReadableArgs<(ProbabilisticScoringParameters, G)> for ProbabilisticScorerUsingTime<G, T>
789 where
790         G: Deref<Target = NetworkGraph>,
791         T: Time,
792 {
793         #[inline]
794         fn read<R: Read>(
795                 r: &mut R, args: (ProbabilisticScoringParameters, G)
796         ) -> Result<Self, DecodeError> {
797                 let (params, network_graph) = args;
798                 let mut channel_liquidities = HashMap::new();
799                 read_tlv_fields!(r, {
800                         (0, channel_liquidities, required)
801                 });
802                 Ok(Self {
803                         params,
804                         network_graph,
805                         channel_liquidities,
806                 })
807         }
808 }
809
810 impl<T: Time> Writeable for ChannelLiquidity<T> {
811         #[inline]
812         fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
813                 let duration_since_epoch = T::duration_since_epoch() - self.last_updated.elapsed();
814                 write_tlv_fields!(w, {
815                         (0, self.min_liquidity_offset_msat, required),
816                         (2, self.max_liquidity_offset_msat, required),
817                         (4, duration_since_epoch, required),
818                 });
819                 Ok(())
820         }
821 }
822
823 impl<T: Time> Readable for ChannelLiquidity<T> {
824         #[inline]
825         fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
826                 let mut min_liquidity_offset_msat = 0;
827                 let mut max_liquidity_offset_msat = 0;
828                 let mut duration_since_epoch = Duration::from_secs(0);
829                 read_tlv_fields!(r, {
830                         (0, min_liquidity_offset_msat, required),
831                         (2, max_liquidity_offset_msat, required),
832                         (4, duration_since_epoch, required),
833                 });
834                 Ok(Self {
835                         min_liquidity_offset_msat,
836                         max_liquidity_offset_msat,
837                         last_updated: T::now() - (T::duration_since_epoch() - duration_since_epoch),
838                 })
839         }
840 }
841
842 pub(crate) mod time {
843         use core::ops::Sub;
844         use core::time::Duration;
845         /// A measurement of time.
846         pub trait Time: Copy + Sub<Duration, Output = Self> where Self: Sized {
847                 /// Returns an instance corresponding to the current moment.
848                 fn now() -> Self;
849
850                 /// Returns the amount of time elapsed since `self` was created.
851                 fn elapsed(&self) -> Duration;
852
853                 /// Returns the amount of time passed between `earlier` and `self`.
854                 fn duration_since(&self, earlier: Self) -> Duration;
855
856                 /// Returns the amount of time passed since the beginning of [`Time`].
857                 ///
858                 /// Used during (de-)serialization.
859                 fn duration_since_epoch() -> Duration;
860         }
861
862         /// A state in which time has no meaning.
863         #[derive(Clone, Copy, Debug, PartialEq, Eq)]
864         pub struct Eternity;
865
866         #[cfg(not(feature = "no-std"))]
867         impl Time for std::time::Instant {
868                 fn now() -> Self {
869                         std::time::Instant::now()
870                 }
871
872                 fn duration_since(&self, earlier: Self) -> Duration {
873                         self.duration_since(earlier)
874                 }
875
876                 fn duration_since_epoch() -> Duration {
877                         use std::time::SystemTime;
878                         SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap()
879                 }
880
881                 fn elapsed(&self) -> Duration {
882                         std::time::Instant::elapsed(self)
883                 }
884         }
885
886         impl Time for Eternity {
887                 fn now() -> Self {
888                         Self
889                 }
890
891                 fn duration_since(&self, _earlier: Self) -> Duration {
892                         Duration::from_secs(0)
893                 }
894
895                 fn duration_since_epoch() -> Duration {
896                         Duration::from_secs(0)
897                 }
898
899                 fn elapsed(&self) -> Duration {
900                         Duration::from_secs(0)
901                 }
902         }
903
904         impl Sub<Duration> for Eternity {
905                 type Output = Self;
906
907                 fn sub(self, _other: Duration) -> Self {
908                         self
909                 }
910         }
911 }
912
913 pub(crate) use self::time::Time;
914
915 #[cfg(test)]
916 mod tests {
917         use super::{ChannelLiquidity, ProbabilisticScoringParameters, ProbabilisticScorerUsingTime, ScoringParameters, ScorerUsingTime, Time};
918         use super::time::Eternity;
919
920         use ln::features::{ChannelFeatures, NodeFeatures};
921         use ln::msgs::{ChannelAnnouncement, ChannelUpdate, OptionalField, UnsignedChannelAnnouncement, UnsignedChannelUpdate};
922         use routing::scoring::Score;
923         use routing::network_graph::{NetworkGraph, NodeId};
924         use routing::router::RouteHop;
925         use util::ser::{Readable, ReadableArgs, Writeable};
926
927         use bitcoin::blockdata::constants::genesis_block;
928         use bitcoin::hashes::Hash;
929         use bitcoin::hashes::sha256d::Hash as Sha256dHash;
930         use bitcoin::network::constants::Network;
931         use bitcoin::secp256k1::{PublicKey, Secp256k1, SecretKey};
932         use core::cell::Cell;
933         use core::ops::Sub;
934         use core::time::Duration;
935         use io;
936
937         // `Time` tests
938
939         /// Time that can be advanced manually in tests.
940         #[derive(Clone, Copy, Debug, PartialEq, Eq)]
941         struct SinceEpoch(Duration);
942
943         impl SinceEpoch {
944                 thread_local! {
945                         static ELAPSED: Cell<Duration> = core::cell::Cell::new(Duration::from_secs(0));
946                 }
947
948                 fn advance(duration: Duration) {
949                         Self::ELAPSED.with(|elapsed| elapsed.set(elapsed.get() + duration))
950                 }
951         }
952
953         impl Time for SinceEpoch {
954                 fn now() -> Self {
955                         Self(Self::duration_since_epoch())
956                 }
957
958                 fn duration_since(&self, earlier: Self) -> Duration {
959                         self.0 - earlier.0
960                 }
961
962                 fn duration_since_epoch() -> Duration {
963                         Self::ELAPSED.with(|elapsed| elapsed.get())
964                 }
965
966                 fn elapsed(&self) -> Duration {
967                         Self::duration_since_epoch() - self.0
968                 }
969         }
970
971         impl Sub<Duration> for SinceEpoch {
972                 type Output = Self;
973
974                 fn sub(self, other: Duration) -> Self {
975                         Self(self.0 - other)
976                 }
977         }
978
979         #[test]
980         fn time_passes_when_advanced() {
981                 let now = SinceEpoch::now();
982                 assert_eq!(now.elapsed(), Duration::from_secs(0));
983
984                 SinceEpoch::advance(Duration::from_secs(1));
985                 SinceEpoch::advance(Duration::from_secs(1));
986
987                 let elapsed = now.elapsed();
988                 let later = SinceEpoch::now();
989
990                 assert_eq!(elapsed, Duration::from_secs(2));
991                 assert_eq!(later - elapsed, now);
992         }
993
994         #[test]
995         fn time_never_passes_in_an_eternity() {
996                 let now = Eternity::now();
997                 let elapsed = now.elapsed();
998                 let later = Eternity::now();
999
1000                 assert_eq!(now.elapsed(), Duration::from_secs(0));
1001                 assert_eq!(later - elapsed, now);
1002         }
1003
1004         // `Scorer` tests
1005
1006         /// A scorer for testing with time that can be manually advanced.
1007         type Scorer = ScorerUsingTime::<SinceEpoch>;
1008
1009         fn source_privkey() -> SecretKey {
1010                 SecretKey::from_slice(&[42; 32]).unwrap()
1011         }
1012
1013         fn target_privkey() -> SecretKey {
1014                 SecretKey::from_slice(&[43; 32]).unwrap()
1015         }
1016
1017         fn source_pubkey() -> PublicKey {
1018                 let secp_ctx = Secp256k1::new();
1019                 PublicKey::from_secret_key(&secp_ctx, &source_privkey())
1020         }
1021
1022         fn target_pubkey() -> PublicKey {
1023                 let secp_ctx = Secp256k1::new();
1024                 PublicKey::from_secret_key(&secp_ctx, &target_privkey())
1025         }
1026
1027         fn source_node_id() -> NodeId {
1028                 NodeId::from_pubkey(&source_pubkey())
1029         }
1030
1031         fn target_node_id() -> NodeId {
1032                 NodeId::from_pubkey(&target_pubkey())
1033         }
1034
1035         #[test]
1036         fn penalizes_without_channel_failures() {
1037                 let scorer = Scorer::new(ScoringParameters {
1038                         base_penalty_msat: 1_000,
1039                         failure_penalty_msat: 512,
1040                         failure_penalty_half_life: Duration::from_secs(1),
1041                         overuse_penalty_start_1024th: 1024,
1042                         overuse_penalty_msat_per_1024th: 0,
1043                 });
1044                 let source = source_node_id();
1045                 let target = target_node_id();
1046                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_000);
1047
1048                 SinceEpoch::advance(Duration::from_secs(1));
1049                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_000);
1050         }
1051
1052         #[test]
1053         fn accumulates_channel_failure_penalties() {
1054                 let mut scorer = Scorer::new(ScoringParameters {
1055                         base_penalty_msat: 1_000,
1056                         failure_penalty_msat: 64,
1057                         failure_penalty_half_life: Duration::from_secs(10),
1058                         overuse_penalty_start_1024th: 1024,
1059                         overuse_penalty_msat_per_1024th: 0,
1060                 });
1061                 let source = source_node_id();
1062                 let target = target_node_id();
1063                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_000);
1064
1065                 scorer.payment_path_failed(&[], 42);
1066                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_064);
1067
1068                 scorer.payment_path_failed(&[], 42);
1069                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_128);
1070
1071                 scorer.payment_path_failed(&[], 42);
1072                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_192);
1073         }
1074
1075         #[test]
1076         fn decays_channel_failure_penalties_over_time() {
1077                 let mut scorer = Scorer::new(ScoringParameters {
1078                         base_penalty_msat: 1_000,
1079                         failure_penalty_msat: 512,
1080                         failure_penalty_half_life: Duration::from_secs(10),
1081                         overuse_penalty_start_1024th: 1024,
1082                         overuse_penalty_msat_per_1024th: 0,
1083                 });
1084                 let source = source_node_id();
1085                 let target = target_node_id();
1086                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_000);
1087
1088                 scorer.payment_path_failed(&[], 42);
1089                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_512);
1090
1091                 SinceEpoch::advance(Duration::from_secs(9));
1092                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_512);
1093
1094                 SinceEpoch::advance(Duration::from_secs(1));
1095                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_256);
1096
1097                 SinceEpoch::advance(Duration::from_secs(10 * 8));
1098                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_001);
1099
1100                 SinceEpoch::advance(Duration::from_secs(10));
1101                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_000);
1102
1103                 SinceEpoch::advance(Duration::from_secs(10));
1104                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_000);
1105         }
1106
1107         #[test]
1108         fn decays_channel_failure_penalties_without_shift_overflow() {
1109                 let mut scorer = Scorer::new(ScoringParameters {
1110                         base_penalty_msat: 1_000,
1111                         failure_penalty_msat: 512,
1112                         failure_penalty_half_life: Duration::from_secs(10),
1113                         overuse_penalty_start_1024th: 1024,
1114                         overuse_penalty_msat_per_1024th: 0,
1115                 });
1116                 let source = source_node_id();
1117                 let target = target_node_id();
1118                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_000);
1119
1120                 scorer.payment_path_failed(&[], 42);
1121                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_512);
1122
1123                 // An unchecked right shift 64 bits or more in ChannelFailure::decayed_penalty_msat would
1124                 // cause an overflow.
1125                 SinceEpoch::advance(Duration::from_secs(10 * 64));
1126                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_000);
1127
1128                 SinceEpoch::advance(Duration::from_secs(10));
1129                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_000);
1130         }
1131
1132         #[test]
1133         fn accumulates_channel_failure_penalties_after_decay() {
1134                 let mut scorer = Scorer::new(ScoringParameters {
1135                         base_penalty_msat: 1_000,
1136                         failure_penalty_msat: 512,
1137                         failure_penalty_half_life: Duration::from_secs(10),
1138                         overuse_penalty_start_1024th: 1024,
1139                         overuse_penalty_msat_per_1024th: 0,
1140                 });
1141                 let source = source_node_id();
1142                 let target = target_node_id();
1143                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_000);
1144
1145                 scorer.payment_path_failed(&[], 42);
1146                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_512);
1147
1148                 SinceEpoch::advance(Duration::from_secs(10));
1149                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_256);
1150
1151                 scorer.payment_path_failed(&[], 42);
1152                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_768);
1153
1154                 SinceEpoch::advance(Duration::from_secs(10));
1155                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_384);
1156         }
1157
1158         #[test]
1159         fn reduces_channel_failure_penalties_after_success() {
1160                 let mut scorer = Scorer::new(ScoringParameters {
1161                         base_penalty_msat: 1_000,
1162                         failure_penalty_msat: 512,
1163                         failure_penalty_half_life: Duration::from_secs(10),
1164                         overuse_penalty_start_1024th: 1024,
1165                         overuse_penalty_msat_per_1024th: 0,
1166                 });
1167                 let source = source_node_id();
1168                 let target = target_node_id();
1169                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_000);
1170
1171                 scorer.payment_path_failed(&[], 42);
1172                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_512);
1173
1174                 SinceEpoch::advance(Duration::from_secs(10));
1175                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_256);
1176
1177                 let hop = RouteHop {
1178                         pubkey: PublicKey::from_slice(target.as_slice()).unwrap(),
1179                         node_features: NodeFeatures::known(),
1180                         short_channel_id: 42,
1181                         channel_features: ChannelFeatures::known(),
1182                         fee_msat: 1,
1183                         cltv_expiry_delta: 18,
1184                 };
1185                 scorer.payment_path_successful(&[&hop]);
1186                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_128);
1187
1188                 SinceEpoch::advance(Duration::from_secs(10));
1189                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_064);
1190         }
1191
1192         #[test]
1193         fn restores_persisted_channel_failure_penalties() {
1194                 let mut scorer = Scorer::new(ScoringParameters {
1195                         base_penalty_msat: 1_000,
1196                         failure_penalty_msat: 512,
1197                         failure_penalty_half_life: Duration::from_secs(10),
1198                         overuse_penalty_start_1024th: 1024,
1199                         overuse_penalty_msat_per_1024th: 0,
1200                 });
1201                 let source = source_node_id();
1202                 let target = target_node_id();
1203
1204                 scorer.payment_path_failed(&[], 42);
1205                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_512);
1206
1207                 SinceEpoch::advance(Duration::from_secs(10));
1208                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_256);
1209
1210                 scorer.payment_path_failed(&[], 43);
1211                 assert_eq!(scorer.channel_penalty_msat(43, 1, 1, &source, &target), 1_512);
1212
1213                 let mut serialized_scorer = Vec::new();
1214                 scorer.write(&mut serialized_scorer).unwrap();
1215
1216                 let deserialized_scorer = <Scorer>::read(&mut io::Cursor::new(&serialized_scorer)).unwrap();
1217                 assert_eq!(deserialized_scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_256);
1218                 assert_eq!(deserialized_scorer.channel_penalty_msat(43, 1, 1, &source, &target), 1_512);
1219         }
1220
1221         #[test]
1222         fn decays_persisted_channel_failure_penalties() {
1223                 let mut scorer = Scorer::new(ScoringParameters {
1224                         base_penalty_msat: 1_000,
1225                         failure_penalty_msat: 512,
1226                         failure_penalty_half_life: Duration::from_secs(10),
1227                         overuse_penalty_start_1024th: 1024,
1228                         overuse_penalty_msat_per_1024th: 0,
1229                 });
1230                 let source = source_node_id();
1231                 let target = target_node_id();
1232
1233                 scorer.payment_path_failed(&[], 42);
1234                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_512);
1235
1236                 let mut serialized_scorer = Vec::new();
1237                 scorer.write(&mut serialized_scorer).unwrap();
1238
1239                 SinceEpoch::advance(Duration::from_secs(10));
1240
1241                 let deserialized_scorer = <Scorer>::read(&mut io::Cursor::new(&serialized_scorer)).unwrap();
1242                 assert_eq!(deserialized_scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_256);
1243
1244                 SinceEpoch::advance(Duration::from_secs(10));
1245                 assert_eq!(deserialized_scorer.channel_penalty_msat(42, 1, 1, &source, &target), 1_128);
1246         }
1247
1248         #[test]
1249         fn charges_per_1024th_penalty() {
1250                 let scorer = Scorer::new(ScoringParameters {
1251                         base_penalty_msat: 0,
1252                         failure_penalty_msat: 0,
1253                         failure_penalty_half_life: Duration::from_secs(0),
1254                         overuse_penalty_start_1024th: 256,
1255                         overuse_penalty_msat_per_1024th: 100,
1256                 });
1257                 let source = source_node_id();
1258                 let target = target_node_id();
1259
1260                 assert_eq!(scorer.channel_penalty_msat(42, 1_000, 1_024_000, &source, &target), 0);
1261                 assert_eq!(scorer.channel_penalty_msat(42, 256_999, 1_024_000, &source, &target), 0);
1262                 assert_eq!(scorer.channel_penalty_msat(42, 257_000, 1_024_000, &source, &target), 100);
1263                 assert_eq!(scorer.channel_penalty_msat(42, 258_000, 1_024_000, &source, &target), 200);
1264                 assert_eq!(scorer.channel_penalty_msat(42, 512_000, 1_024_000, &source, &target), 256 * 100);
1265         }
1266
1267         // `ProbabilisticScorer` tests
1268
1269         /// A probabilistic scorer for testing with time that can be manually advanced.
1270         type ProbabilisticScorer<'a> = ProbabilisticScorerUsingTime::<&'a NetworkGraph, SinceEpoch>;
1271
1272         fn sender_privkey() -> SecretKey {
1273                 SecretKey::from_slice(&[41; 32]).unwrap()
1274         }
1275
1276         fn recipient_privkey() -> SecretKey {
1277                 SecretKey::from_slice(&[45; 32]).unwrap()
1278         }
1279
1280         fn sender_pubkey() -> PublicKey {
1281                 let secp_ctx = Secp256k1::new();
1282                 PublicKey::from_secret_key(&secp_ctx, &sender_privkey())
1283         }
1284
1285         fn recipient_pubkey() -> PublicKey {
1286                 let secp_ctx = Secp256k1::new();
1287                 PublicKey::from_secret_key(&secp_ctx, &recipient_privkey())
1288         }
1289
1290         fn sender_node_id() -> NodeId {
1291                 NodeId::from_pubkey(&sender_pubkey())
1292         }
1293
1294         fn recipient_node_id() -> NodeId {
1295                 NodeId::from_pubkey(&recipient_pubkey())
1296         }
1297
1298         fn network_graph() -> NetworkGraph {
1299                 let genesis_hash = genesis_block(Network::Testnet).header.block_hash();
1300                 let mut network_graph = NetworkGraph::new(genesis_hash);
1301                 add_channel(&mut network_graph, 42, source_privkey(), target_privkey());
1302                 add_channel(&mut network_graph, 43, target_privkey(), recipient_privkey());
1303
1304                 network_graph
1305         }
1306
1307         fn add_channel(
1308                 network_graph: &mut NetworkGraph, short_channel_id: u64, node_1_key: SecretKey,
1309                 node_2_key: SecretKey
1310         ) {
1311                 let genesis_hash = genesis_block(Network::Testnet).header.block_hash();
1312                 let node_1_secret = &SecretKey::from_slice(&[39; 32]).unwrap();
1313                 let node_2_secret = &SecretKey::from_slice(&[40; 32]).unwrap();
1314                 let secp_ctx = Secp256k1::new();
1315                 let unsigned_announcement = UnsignedChannelAnnouncement {
1316                         features: ChannelFeatures::known(),
1317                         chain_hash: genesis_hash,
1318                         short_channel_id,
1319                         node_id_1: PublicKey::from_secret_key(&secp_ctx, &node_1_key),
1320                         node_id_2: PublicKey::from_secret_key(&secp_ctx, &node_2_key),
1321                         bitcoin_key_1: PublicKey::from_secret_key(&secp_ctx, &node_1_secret),
1322                         bitcoin_key_2: PublicKey::from_secret_key(&secp_ctx, &node_2_secret),
1323                         excess_data: Vec::new(),
1324                 };
1325                 let msghash = hash_to_message!(&Sha256dHash::hash(&unsigned_announcement.encode()[..])[..]);
1326                 let signed_announcement = ChannelAnnouncement {
1327                         node_signature_1: secp_ctx.sign(&msghash, &node_1_key),
1328                         node_signature_2: secp_ctx.sign(&msghash, &node_2_key),
1329                         bitcoin_signature_1: secp_ctx.sign(&msghash, &node_1_secret),
1330                         bitcoin_signature_2: secp_ctx.sign(&msghash, &node_2_secret),
1331                         contents: unsigned_announcement,
1332                 };
1333                 let chain_source: Option<&::util::test_utils::TestChainSource> = None;
1334                 network_graph.update_channel_from_announcement(
1335                         &signed_announcement, &chain_source, &secp_ctx).unwrap();
1336                 update_channel(network_graph, short_channel_id, node_1_key, 0);
1337                 update_channel(network_graph, short_channel_id, node_2_key, 1);
1338         }
1339
1340         fn update_channel(
1341                 network_graph: &mut NetworkGraph, short_channel_id: u64, node_key: SecretKey, flags: u8
1342         ) {
1343                 let genesis_hash = genesis_block(Network::Testnet).header.block_hash();
1344                 let secp_ctx = Secp256k1::new();
1345                 let unsigned_update = UnsignedChannelUpdate {
1346                         chain_hash: genesis_hash,
1347                         short_channel_id,
1348                         timestamp: 100,
1349                         flags,
1350                         cltv_expiry_delta: 18,
1351                         htlc_minimum_msat: 0,
1352                         htlc_maximum_msat: OptionalField::Present(1_000),
1353                         fee_base_msat: 1,
1354                         fee_proportional_millionths: 0,
1355                         excess_data: Vec::new(),
1356                 };
1357                 let msghash = hash_to_message!(&Sha256dHash::hash(&unsigned_update.encode()[..])[..]);
1358                 let signed_update = ChannelUpdate {
1359                         signature: secp_ctx.sign(&msghash, &node_key),
1360                         contents: unsigned_update,
1361                 };
1362                 network_graph.update_channel(&signed_update, &secp_ctx).unwrap();
1363         }
1364
1365         fn payment_path_for_amount(amount_msat: u64) -> Vec<RouteHop> {
1366                 vec![
1367                         RouteHop {
1368                                 pubkey: source_pubkey(),
1369                                 node_features: NodeFeatures::known(),
1370                                 short_channel_id: 41,
1371                                 channel_features: ChannelFeatures::known(),
1372                                 fee_msat: 1,
1373                                 cltv_expiry_delta: 18,
1374                         },
1375                         RouteHop {
1376                                 pubkey: target_pubkey(),
1377                                 node_features: NodeFeatures::known(),
1378                                 short_channel_id: 42,
1379                                 channel_features: ChannelFeatures::known(),
1380                                 fee_msat: 2,
1381                                 cltv_expiry_delta: 18,
1382                         },
1383                         RouteHop {
1384                                 pubkey: recipient_pubkey(),
1385                                 node_features: NodeFeatures::known(),
1386                                 short_channel_id: 43,
1387                                 channel_features: ChannelFeatures::known(),
1388                                 fee_msat: amount_msat,
1389                                 cltv_expiry_delta: 18,
1390                         },
1391                 ]
1392         }
1393
1394         #[test]
1395         fn liquidity_bounds_directed_from_lowest_node_id() {
1396                 let last_updated = SinceEpoch::now();
1397                 let network_graph = network_graph();
1398                 let params = ProbabilisticScoringParameters::default();
1399                 let mut scorer = ProbabilisticScorer::new(params, &network_graph)
1400                         .with_channel(42,
1401                                 ChannelLiquidity {
1402                                         min_liquidity_offset_msat: 700, max_liquidity_offset_msat: 100, last_updated
1403                                 })
1404                         .with_channel(43,
1405                                 ChannelLiquidity {
1406                                         min_liquidity_offset_msat: 700, max_liquidity_offset_msat: 100, last_updated
1407                                 });
1408                 let source = source_node_id();
1409                 let target = target_node_id();
1410                 let recipient = recipient_node_id();
1411                 assert!(source > target);
1412                 assert!(target < recipient);
1413
1414                 // Update minimum liquidity.
1415
1416                 let liquidity_offset_half_life = scorer.params.liquidity_offset_half_life;
1417                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
1418                         .as_directed(&source, &target, 1_000, liquidity_offset_half_life);
1419                 assert_eq!(liquidity.min_liquidity_msat(), 100);
1420                 assert_eq!(liquidity.max_liquidity_msat(), 300);
1421
1422                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
1423                         .as_directed(&target, &source, 1_000, liquidity_offset_half_life);
1424                 assert_eq!(liquidity.min_liquidity_msat(), 700);
1425                 assert_eq!(liquidity.max_liquidity_msat(), 900);
1426
1427                 scorer.channel_liquidities.get_mut(&42).unwrap()
1428                         .as_directed_mut(&source, &target, 1_000, liquidity_offset_half_life)
1429                         .set_min_liquidity_msat(200);
1430
1431                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
1432                         .as_directed(&source, &target, 1_000, liquidity_offset_half_life);
1433                 assert_eq!(liquidity.min_liquidity_msat(), 200);
1434                 assert_eq!(liquidity.max_liquidity_msat(), 300);
1435
1436                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
1437                         .as_directed(&target, &source, 1_000, liquidity_offset_half_life);
1438                 assert_eq!(liquidity.min_liquidity_msat(), 700);
1439                 assert_eq!(liquidity.max_liquidity_msat(), 800);
1440
1441                 // Update maximum liquidity.
1442
1443                 let liquidity = scorer.channel_liquidities.get(&43).unwrap()
1444                         .as_directed(&target, &recipient, 1_000, liquidity_offset_half_life);
1445                 assert_eq!(liquidity.min_liquidity_msat(), 700);
1446                 assert_eq!(liquidity.max_liquidity_msat(), 900);
1447
1448                 let liquidity = scorer.channel_liquidities.get(&43).unwrap()
1449                         .as_directed(&recipient, &target, 1_000, liquidity_offset_half_life);
1450                 assert_eq!(liquidity.min_liquidity_msat(), 100);
1451                 assert_eq!(liquidity.max_liquidity_msat(), 300);
1452
1453                 scorer.channel_liquidities.get_mut(&43).unwrap()
1454                         .as_directed_mut(&target, &recipient, 1_000, liquidity_offset_half_life)
1455                         .set_max_liquidity_msat(200);
1456
1457                 let liquidity = scorer.channel_liquidities.get(&43).unwrap()
1458                         .as_directed(&target, &recipient, 1_000, liquidity_offset_half_life);
1459                 assert_eq!(liquidity.min_liquidity_msat(), 0);
1460                 assert_eq!(liquidity.max_liquidity_msat(), 200);
1461
1462                 let liquidity = scorer.channel_liquidities.get(&43).unwrap()
1463                         .as_directed(&recipient, &target, 1_000, liquidity_offset_half_life);
1464                 assert_eq!(liquidity.min_liquidity_msat(), 800);
1465                 assert_eq!(liquidity.max_liquidity_msat(), 1000);
1466         }
1467
1468         #[test]
1469         fn resets_liquidity_upper_bound_when_crossed_by_lower_bound() {
1470                 let last_updated = SinceEpoch::now();
1471                 let network_graph = network_graph();
1472                 let params = ProbabilisticScoringParameters::default();
1473                 let mut scorer = ProbabilisticScorer::new(params, &network_graph)
1474                         .with_channel(42,
1475                                 ChannelLiquidity {
1476                                         min_liquidity_offset_msat: 200, max_liquidity_offset_msat: 400, last_updated
1477                                 });
1478                 let source = source_node_id();
1479                 let target = target_node_id();
1480                 assert!(source > target);
1481
1482                 // Check initial bounds.
1483                 let liquidity_offset_half_life = scorer.params.liquidity_offset_half_life;
1484                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
1485                         .as_directed(&source, &target, 1_000, liquidity_offset_half_life);
1486                 assert_eq!(liquidity.min_liquidity_msat(), 400);
1487                 assert_eq!(liquidity.max_liquidity_msat(), 800);
1488
1489                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
1490                         .as_directed(&target, &source, 1_000, liquidity_offset_half_life);
1491                 assert_eq!(liquidity.min_liquidity_msat(), 200);
1492                 assert_eq!(liquidity.max_liquidity_msat(), 600);
1493
1494                 // Reset from source to target.
1495                 scorer.channel_liquidities.get_mut(&42).unwrap()
1496                         .as_directed_mut(&source, &target, 1_000, liquidity_offset_half_life)
1497                         .set_min_liquidity_msat(900);
1498
1499                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
1500                         .as_directed(&source, &target, 1_000, liquidity_offset_half_life);
1501                 assert_eq!(liquidity.min_liquidity_msat(), 900);
1502                 assert_eq!(liquidity.max_liquidity_msat(), 1_000);
1503
1504                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
1505                         .as_directed(&target, &source, 1_000, liquidity_offset_half_life);
1506                 assert_eq!(liquidity.min_liquidity_msat(), 0);
1507                 assert_eq!(liquidity.max_liquidity_msat(), 100);
1508
1509                 // Reset from target to source.
1510                 scorer.channel_liquidities.get_mut(&42).unwrap()
1511                         .as_directed_mut(&target, &source, 1_000, liquidity_offset_half_life)
1512                         .set_min_liquidity_msat(400);
1513
1514                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
1515                         .as_directed(&source, &target, 1_000, liquidity_offset_half_life);
1516                 assert_eq!(liquidity.min_liquidity_msat(), 0);
1517                 assert_eq!(liquidity.max_liquidity_msat(), 600);
1518
1519                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
1520                         .as_directed(&target, &source, 1_000, liquidity_offset_half_life);
1521                 assert_eq!(liquidity.min_liquidity_msat(), 400);
1522                 assert_eq!(liquidity.max_liquidity_msat(), 1_000);
1523         }
1524
1525         #[test]
1526         fn resets_liquidity_lower_bound_when_crossed_by_upper_bound() {
1527                 let last_updated = SinceEpoch::now();
1528                 let network_graph = network_graph();
1529                 let params = ProbabilisticScoringParameters::default();
1530                 let mut scorer = ProbabilisticScorer::new(params, &network_graph)
1531                         .with_channel(42,
1532                                 ChannelLiquidity {
1533                                         min_liquidity_offset_msat: 200, max_liquidity_offset_msat: 400, last_updated
1534                                 });
1535                 let source = source_node_id();
1536                 let target = target_node_id();
1537                 assert!(source > target);
1538
1539                 // Check initial bounds.
1540                 let liquidity_offset_half_life = scorer.params.liquidity_offset_half_life;
1541                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
1542                         .as_directed(&source, &target, 1_000, liquidity_offset_half_life);
1543                 assert_eq!(liquidity.min_liquidity_msat(), 400);
1544                 assert_eq!(liquidity.max_liquidity_msat(), 800);
1545
1546                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
1547                         .as_directed(&target, &source, 1_000, liquidity_offset_half_life);
1548                 assert_eq!(liquidity.min_liquidity_msat(), 200);
1549                 assert_eq!(liquidity.max_liquidity_msat(), 600);
1550
1551                 // Reset from source to target.
1552                 scorer.channel_liquidities.get_mut(&42).unwrap()
1553                         .as_directed_mut(&source, &target, 1_000, liquidity_offset_half_life)
1554                         .set_max_liquidity_msat(300);
1555
1556                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
1557                         .as_directed(&source, &target, 1_000, liquidity_offset_half_life);
1558                 assert_eq!(liquidity.min_liquidity_msat(), 0);
1559                 assert_eq!(liquidity.max_liquidity_msat(), 300);
1560
1561                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
1562                         .as_directed(&target, &source, 1_000, liquidity_offset_half_life);
1563                 assert_eq!(liquidity.min_liquidity_msat(), 700);
1564                 assert_eq!(liquidity.max_liquidity_msat(), 1_000);
1565
1566                 // Reset from target to source.
1567                 scorer.channel_liquidities.get_mut(&42).unwrap()
1568                         .as_directed_mut(&target, &source, 1_000, liquidity_offset_half_life)
1569                         .set_max_liquidity_msat(600);
1570
1571                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
1572                         .as_directed(&source, &target, 1_000, liquidity_offset_half_life);
1573                 assert_eq!(liquidity.min_liquidity_msat(), 400);
1574                 assert_eq!(liquidity.max_liquidity_msat(), 1_000);
1575
1576                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
1577                         .as_directed(&target, &source, 1_000, liquidity_offset_half_life);
1578                 assert_eq!(liquidity.min_liquidity_msat(), 0);
1579                 assert_eq!(liquidity.max_liquidity_msat(), 600);
1580         }
1581
1582         #[test]
1583         fn increased_penalty_nearing_liquidity_upper_bound() {
1584                 let network_graph = network_graph();
1585                 let params = ProbabilisticScoringParameters {
1586                         liquidity_penalty_multiplier_msat: 1_000, ..Default::default()
1587                 };
1588                 let scorer = ProbabilisticScorer::new(params, &network_graph);
1589                 let source = source_node_id();
1590                 let target = target_node_id();
1591
1592                 assert_eq!(scorer.channel_penalty_msat(42, 100, 100_000, &source, &target), 0);
1593                 assert_eq!(scorer.channel_penalty_msat(42, 1_000, 100_000, &source, &target), 4);
1594                 assert_eq!(scorer.channel_penalty_msat(42, 10_000, 100_000, &source, &target), 45);
1595                 assert_eq!(scorer.channel_penalty_msat(42, 100_000, 100_000, &source, &target), 2_000);
1596
1597                 assert_eq!(scorer.channel_penalty_msat(42, 125, 1_000, &source, &target), 57);
1598                 assert_eq!(scorer.channel_penalty_msat(42, 250, 1_000, &source, &target), 124);
1599                 assert_eq!(scorer.channel_penalty_msat(42, 375, 1_000, &source, &target), 203);
1600                 assert_eq!(scorer.channel_penalty_msat(42, 500, 1_000, &source, &target), 300);
1601                 assert_eq!(scorer.channel_penalty_msat(42, 625, 1_000, &source, &target), 425);
1602                 assert_eq!(scorer.channel_penalty_msat(42, 750, 1_000, &source, &target), 600);
1603                 assert_eq!(scorer.channel_penalty_msat(42, 875, 1_000, &source, &target), 900);
1604         }
1605
1606         #[test]
1607         fn constant_penalty_outside_liquidity_bounds() {
1608                 let last_updated = SinceEpoch::now();
1609                 let network_graph = network_graph();
1610                 let params = ProbabilisticScoringParameters {
1611                         liquidity_penalty_multiplier_msat: 1_000, ..Default::default()
1612                 };
1613                 let scorer = ProbabilisticScorer::new(params, &network_graph)
1614                         .with_channel(42,
1615                                 ChannelLiquidity {
1616                                         min_liquidity_offset_msat: 40, max_liquidity_offset_msat: 40, last_updated
1617                                 });
1618                 let source = source_node_id();
1619                 let target = target_node_id();
1620
1621                 assert_eq!(scorer.channel_penalty_msat(42, 39, 100, &source, &target), 0);
1622                 assert_ne!(scorer.channel_penalty_msat(42, 50, 100, &source, &target), 0);
1623                 assert_ne!(scorer.channel_penalty_msat(42, 50, 100, &source, &target), 2_000);
1624                 assert_eq!(scorer.channel_penalty_msat(42, 61, 100, &source, &target), 2_000);
1625         }
1626
1627         #[test]
1628         fn does_not_further_penalize_own_channel() {
1629                 let network_graph = network_graph();
1630                 let params = ProbabilisticScoringParameters {
1631                         liquidity_penalty_multiplier_msat: 1_000, ..Default::default()
1632                 };
1633                 let mut scorer = ProbabilisticScorer::new(params, &network_graph);
1634                 let sender = sender_node_id();
1635                 let source = source_node_id();
1636                 let failed_path = payment_path_for_amount(500);
1637                 let successful_path = payment_path_for_amount(200);
1638
1639                 assert_eq!(scorer.channel_penalty_msat(41, 500, 1_000, &sender, &source), 300);
1640
1641                 scorer.payment_path_failed(&failed_path.iter().collect::<Vec<_>>(), 41);
1642                 assert_eq!(scorer.channel_penalty_msat(41, 500, 1_000, &sender, &source), 300);
1643
1644                 scorer.payment_path_successful(&successful_path.iter().collect::<Vec<_>>());
1645                 assert_eq!(scorer.channel_penalty_msat(41, 500, 1_000, &sender, &source), 300);
1646         }
1647
1648         #[test]
1649         fn sets_liquidity_lower_bound_on_downstream_failure() {
1650                 let network_graph = network_graph();
1651                 let params = ProbabilisticScoringParameters {
1652                         liquidity_penalty_multiplier_msat: 1_000, ..Default::default()
1653                 };
1654                 let mut scorer = ProbabilisticScorer::new(params, &network_graph);
1655                 let source = source_node_id();
1656                 let target = target_node_id();
1657                 let path = payment_path_for_amount(500);
1658
1659                 assert_eq!(scorer.channel_penalty_msat(42, 250, 1_000, &source, &target), 124);
1660                 assert_eq!(scorer.channel_penalty_msat(42, 500, 1_000, &source, &target), 300);
1661                 assert_eq!(scorer.channel_penalty_msat(42, 750, 1_000, &source, &target), 600);
1662
1663                 scorer.payment_path_failed(&path.iter().collect::<Vec<_>>(), 43);
1664
1665                 assert_eq!(scorer.channel_penalty_msat(42, 250, 1_000, &source, &target), 0);
1666                 assert_eq!(scorer.channel_penalty_msat(42, 500, 1_000, &source, &target), 0);
1667                 assert_eq!(scorer.channel_penalty_msat(42, 750, 1_000, &source, &target), 300);
1668         }
1669
1670         #[test]
1671         fn sets_liquidity_upper_bound_on_failure() {
1672                 let network_graph = network_graph();
1673                 let params = ProbabilisticScoringParameters {
1674                         liquidity_penalty_multiplier_msat: 1_000, ..Default::default()
1675                 };
1676                 let mut scorer = ProbabilisticScorer::new(params, &network_graph);
1677                 let source = source_node_id();
1678                 let target = target_node_id();
1679                 let path = payment_path_for_amount(500);
1680
1681                 assert_eq!(scorer.channel_penalty_msat(42, 250, 1_000, &source, &target), 124);
1682                 assert_eq!(scorer.channel_penalty_msat(42, 500, 1_000, &source, &target), 300);
1683                 assert_eq!(scorer.channel_penalty_msat(42, 750, 1_000, &source, &target), 600);
1684
1685                 scorer.payment_path_failed(&path.iter().collect::<Vec<_>>(), 42);
1686
1687                 assert_eq!(scorer.channel_penalty_msat(42, 250, 1_000, &source, &target), 300);
1688                 assert_eq!(scorer.channel_penalty_msat(42, 500, 1_000, &source, &target), 2_000);
1689                 assert_eq!(scorer.channel_penalty_msat(42, 750, 1_000, &source, &target), 2_000);
1690         }
1691
1692         #[test]
1693         fn reduces_liquidity_upper_bound_along_path_on_success() {
1694                 let network_graph = network_graph();
1695                 let params = ProbabilisticScoringParameters {
1696                         liquidity_penalty_multiplier_msat: 1_000, ..Default::default()
1697                 };
1698                 let mut scorer = ProbabilisticScorer::new(params, &network_graph);
1699                 let sender = sender_node_id();
1700                 let source = source_node_id();
1701                 let target = target_node_id();
1702                 let recipient = recipient_node_id();
1703                 let path = payment_path_for_amount(500);
1704
1705                 assert_eq!(scorer.channel_penalty_msat(41, 250, 1_000, &sender, &source), 124);
1706                 assert_eq!(scorer.channel_penalty_msat(42, 250, 1_000, &source, &target), 124);
1707                 assert_eq!(scorer.channel_penalty_msat(43, 250, 1_000, &target, &recipient), 124);
1708
1709                 scorer.payment_path_successful(&path.iter().collect::<Vec<_>>());
1710
1711                 assert_eq!(scorer.channel_penalty_msat(41, 250, 1_000, &sender, &source), 124);
1712                 assert_eq!(scorer.channel_penalty_msat(42, 250, 1_000, &source, &target), 300);
1713                 assert_eq!(scorer.channel_penalty_msat(43, 250, 1_000, &target, &recipient), 300);
1714         }
1715
1716         #[test]
1717         fn decays_liquidity_bounds_over_time() {
1718                 let network_graph = network_graph();
1719                 let params = ProbabilisticScoringParameters {
1720                         liquidity_penalty_multiplier_msat: 1_000,
1721                         liquidity_offset_half_life: Duration::from_secs(10),
1722                 };
1723                 let mut scorer = ProbabilisticScorer::new(params, &network_graph);
1724                 let source = source_node_id();
1725                 let target = target_node_id();
1726
1727                 assert_eq!(scorer.channel_penalty_msat(42, 0, 1_024, &source, &target), 0);
1728                 assert_eq!(scorer.channel_penalty_msat(42, 1_024, 1_024, &source, &target), 2_000);
1729
1730                 scorer.payment_path_failed(&payment_path_for_amount(768).iter().collect::<Vec<_>>(), 42);
1731                 scorer.payment_path_failed(&payment_path_for_amount(128).iter().collect::<Vec<_>>(), 43);
1732
1733                 assert_eq!(scorer.channel_penalty_msat(42, 128, 1_024, &source, &target), 0);
1734                 assert_eq!(scorer.channel_penalty_msat(42, 256, 1_024, &source, &target), 92);
1735                 assert_eq!(scorer.channel_penalty_msat(42, 768, 1_024, &source, &target), 1_424);
1736                 assert_eq!(scorer.channel_penalty_msat(42, 896, 1_024, &source, &target), 2_000);
1737
1738                 SinceEpoch::advance(Duration::from_secs(9));
1739                 assert_eq!(scorer.channel_penalty_msat(42, 128, 1_024, &source, &target), 0);
1740                 assert_eq!(scorer.channel_penalty_msat(42, 256, 1_024, &source, &target), 92);
1741                 assert_eq!(scorer.channel_penalty_msat(42, 768, 1_024, &source, &target), 1_424);
1742                 assert_eq!(scorer.channel_penalty_msat(42, 896, 1_024, &source, &target), 2_000);
1743
1744                 SinceEpoch::advance(Duration::from_secs(1));
1745                 assert_eq!(scorer.channel_penalty_msat(42, 64, 1_024, &source, &target), 0);
1746                 assert_eq!(scorer.channel_penalty_msat(42, 128, 1_024, &source, &target), 34);
1747                 assert_eq!(scorer.channel_penalty_msat(42, 896, 1_024, &source, &target), 1_812);
1748                 assert_eq!(scorer.channel_penalty_msat(42, 960, 1_024, &source, &target), 2_000);
1749
1750                 // Fully decay liquidity lower bound.
1751                 SinceEpoch::advance(Duration::from_secs(10 * 7));
1752                 assert_eq!(scorer.channel_penalty_msat(42, 0, 1_024, &source, &target), 0);
1753                 assert_eq!(scorer.channel_penalty_msat(42, 1, 1_024, &source, &target), 0);
1754                 assert_eq!(scorer.channel_penalty_msat(42, 1_023, 1_024, &source, &target), 2_000);
1755                 assert_eq!(scorer.channel_penalty_msat(42, 1_024, 1_024, &source, &target), 2_000);
1756
1757                 // Fully decay liquidity upper bound.
1758                 SinceEpoch::advance(Duration::from_secs(10));
1759                 assert_eq!(scorer.channel_penalty_msat(42, 0, 1_024, &source, &target), 0);
1760                 assert_eq!(scorer.channel_penalty_msat(42, 1_024, 1_024, &source, &target), 2_000);
1761
1762                 SinceEpoch::advance(Duration::from_secs(10));
1763                 assert_eq!(scorer.channel_penalty_msat(42, 0, 1_024, &source, &target), 0);
1764                 assert_eq!(scorer.channel_penalty_msat(42, 1_024, 1_024, &source, &target), 2_000);
1765         }
1766
1767         #[test]
1768         fn decays_liquidity_bounds_without_shift_overflow() {
1769                 let network_graph = network_graph();
1770                 let params = ProbabilisticScoringParameters {
1771                         liquidity_penalty_multiplier_msat: 1_000,
1772                         liquidity_offset_half_life: Duration::from_secs(10),
1773                 };
1774                 let mut scorer = ProbabilisticScorer::new(params, &network_graph);
1775                 let source = source_node_id();
1776                 let target = target_node_id();
1777                 assert_eq!(scorer.channel_penalty_msat(42, 256, 1_024, &source, &target), 124);
1778
1779                 scorer.payment_path_failed(&payment_path_for_amount(512).iter().collect::<Vec<_>>(), 42);
1780                 assert_eq!(scorer.channel_penalty_msat(42, 256, 1_024, &source, &target), 281);
1781
1782                 // An unchecked right shift 64 bits or more in DirectedChannelLiquidity::decayed_offset_msat
1783                 // would cause an overflow.
1784                 SinceEpoch::advance(Duration::from_secs(10 * 64));
1785                 assert_eq!(scorer.channel_penalty_msat(42, 256, 1_024, &source, &target), 124);
1786
1787                 SinceEpoch::advance(Duration::from_secs(10));
1788                 assert_eq!(scorer.channel_penalty_msat(42, 256, 1_024, &source, &target), 124);
1789         }
1790
1791         #[test]
1792         fn restricts_liquidity_bounds_after_decay() {
1793                 let network_graph = network_graph();
1794                 let params = ProbabilisticScoringParameters {
1795                         liquidity_penalty_multiplier_msat: 1_000,
1796                         liquidity_offset_half_life: Duration::from_secs(10),
1797                 };
1798                 let mut scorer = ProbabilisticScorer::new(params, &network_graph);
1799                 let source = source_node_id();
1800                 let target = target_node_id();
1801
1802                 assert_eq!(scorer.channel_penalty_msat(42, 512, 1_024, &source, &target), 300);
1803
1804                 // More knowledge gives higher confidence (256, 768), meaning a lower penalty.
1805                 scorer.payment_path_failed(&payment_path_for_amount(768).iter().collect::<Vec<_>>(), 42);
1806                 scorer.payment_path_failed(&payment_path_for_amount(256).iter().collect::<Vec<_>>(), 43);
1807                 assert_eq!(scorer.channel_penalty_msat(42, 512, 1_024, &source, &target), 281);
1808
1809                 // Decaying knowledge gives less confidence (128, 896), meaning a higher penalty.
1810                 SinceEpoch::advance(Duration::from_secs(10));
1811                 assert_eq!(scorer.channel_penalty_msat(42, 512, 1_024, &source, &target), 293);
1812
1813                 // Reducing the upper bound gives more confidence (128, 832) that the payment amount (512)
1814                 // is closer to the upper bound, meaning a higher penalty.
1815                 scorer.payment_path_successful(&payment_path_for_amount(64).iter().collect::<Vec<_>>());
1816                 assert_eq!(scorer.channel_penalty_msat(42, 512, 1_024, &source, &target), 333);
1817
1818                 // Increasing the lower bound gives more confidence (256, 832) that the payment amount (512)
1819                 // is closer to the lower bound, meaning a lower penalty.
1820                 scorer.payment_path_failed(&payment_path_for_amount(256).iter().collect::<Vec<_>>(), 43);
1821                 assert_eq!(scorer.channel_penalty_msat(42, 512, 1_024, &source, &target), 247);
1822
1823                 // Further decaying affects the lower bound more than the upper bound (128, 928).
1824                 SinceEpoch::advance(Duration::from_secs(10));
1825                 assert_eq!(scorer.channel_penalty_msat(42, 512, 1_024, &source, &target), 280);
1826         }
1827
1828         #[test]
1829         fn restores_persisted_liquidity_bounds() {
1830                 let network_graph = network_graph();
1831                 let params = ProbabilisticScoringParameters {
1832                         liquidity_penalty_multiplier_msat: 1_000,
1833                         liquidity_offset_half_life: Duration::from_secs(10),
1834                 };
1835                 let mut scorer = ProbabilisticScorer::new(params, &network_graph);
1836                 let source = source_node_id();
1837                 let target = target_node_id();
1838
1839                 scorer.payment_path_failed(&payment_path_for_amount(500).iter().collect::<Vec<_>>(), 42);
1840                 assert_eq!(scorer.channel_penalty_msat(42, 500, 1_000, &source, &target), 2_000);
1841
1842                 SinceEpoch::advance(Duration::from_secs(10));
1843                 assert_eq!(scorer.channel_penalty_msat(42, 500, 1_000, &source, &target), 475);
1844
1845                 scorer.payment_path_failed(&payment_path_for_amount(250).iter().collect::<Vec<_>>(), 43);
1846                 assert_eq!(scorer.channel_penalty_msat(42, 500, 1_000, &source, &target), 300);
1847
1848                 let mut serialized_scorer = Vec::new();
1849                 scorer.write(&mut serialized_scorer).unwrap();
1850
1851                 let mut serialized_scorer = io::Cursor::new(&serialized_scorer);
1852                 let deserialized_scorer =
1853                         <ProbabilisticScorer>::read(&mut serialized_scorer, (params, &network_graph)).unwrap();
1854                 assert_eq!(deserialized_scorer.channel_penalty_msat(42, 500, 1_000, &source, &target), 300);
1855         }
1856
1857         #[test]
1858         fn decays_persisted_liquidity_bounds() {
1859                 let network_graph = network_graph();
1860                 let params = ProbabilisticScoringParameters {
1861                         liquidity_penalty_multiplier_msat: 1_000,
1862                         liquidity_offset_half_life: Duration::from_secs(10),
1863                 };
1864                 let mut scorer = ProbabilisticScorer::new(params, &network_graph);
1865                 let source = source_node_id();
1866                 let target = target_node_id();
1867
1868                 scorer.payment_path_failed(&payment_path_for_amount(500).iter().collect::<Vec<_>>(), 42);
1869                 assert_eq!(scorer.channel_penalty_msat(42, 500, 1_000, &source, &target), 2_000);
1870
1871                 let mut serialized_scorer = Vec::new();
1872                 scorer.write(&mut serialized_scorer).unwrap();
1873
1874                 SinceEpoch::advance(Duration::from_secs(10));
1875
1876                 let mut serialized_scorer = io::Cursor::new(&serialized_scorer);
1877                 let deserialized_scorer =
1878                         <ProbabilisticScorer>::read(&mut serialized_scorer, (params, &network_graph)).unwrap();
1879                 assert_eq!(deserialized_scorer.channel_penalty_msat(42, 500, 1_000, &source, &target), 475);
1880
1881                 scorer.payment_path_failed(&payment_path_for_amount(250).iter().collect::<Vec<_>>(), 43);
1882                 assert_eq!(scorer.channel_penalty_msat(42, 500, 1_000, &source, &target), 300);
1883
1884                 SinceEpoch::advance(Duration::from_secs(10));
1885                 assert_eq!(deserialized_scorer.channel_penalty_msat(42, 500, 1_000, &source, &target), 367);
1886         }
1887 }