Merge pull request #1144 from jkczyz/2021-10-invoice-payer-scoring
[rust-lightning] / lightning-invoice / src / payment.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 //! A module for paying Lightning invoices.
11 //!
12 //! Defines an [`InvoicePayer`] utility for paying invoices, parameterized by [`Payer`] and
13 //! [`Router`] traits. Implementations of [`Payer`] provide the payer's node id, channels, and means
14 //! to send a payment over a [`Route`]. Implementations of [`Router`] find a [`Route`] between payer
15 //! and payee using information provided by the payer and from the payee's [`Invoice`].
16 //!
17 //! [`InvoicePayer`] is capable of retrying failed payments. It accomplishes this by implementing
18 //! [`EventHandler`] which decorates a user-provided handler. It will intercept any
19 //! [`Event::PaymentPathFailed`] events and retry the failed paths for a fixed number of total
20 //! attempts or until retry is no longer possible. In such a situation, [`InvoicePayer`] will pass
21 //! along the events to the user-provided handler.
22 //!
23 //! # Example
24 //!
25 //! ```
26 //! # extern crate lightning;
27 //! # extern crate lightning_invoice;
28 //! # extern crate secp256k1;
29 //! #
30 //! # use lightning::ln::{PaymentHash, PaymentSecret};
31 //! # use lightning::ln::channelmanager::{ChannelDetails, PaymentId, PaymentSendFailure};
32 //! # use lightning::ln::msgs::LightningError;
33 //! # use lightning::routing;
34 //! # use lightning::routing::network_graph::NodeId;
35 //! # use lightning::routing::router::{Route, RouteHop, RouteParameters};
36 //! # use lightning::util::events::{Event, EventHandler, EventsProvider};
37 //! # use lightning::util::logger::{Logger, Record};
38 //! # use lightning_invoice::Invoice;
39 //! # use lightning_invoice::payment::{InvoicePayer, Payer, RetryAttempts, Router};
40 //! # use secp256k1::key::PublicKey;
41 //! # use std::cell::RefCell;
42 //! # use std::ops::Deref;
43 //! #
44 //! # struct FakeEventProvider {}
45 //! # impl EventsProvider for FakeEventProvider {
46 //! #     fn process_pending_events<H: Deref>(&self, handler: H) where H::Target: EventHandler {}
47 //! # }
48 //! #
49 //! # struct FakePayer {}
50 //! # impl Payer for FakePayer {
51 //! #     fn node_id(&self) -> PublicKey { unimplemented!() }
52 //! #     fn first_hops(&self) -> Vec<ChannelDetails> { unimplemented!() }
53 //! #     fn send_payment(
54 //! #         &self, route: &Route, payment_hash: PaymentHash, payment_secret: &Option<PaymentSecret>
55 //! #     ) -> Result<PaymentId, PaymentSendFailure> { unimplemented!() }
56 //! #     fn retry_payment(
57 //! #         &self, route: &Route, payment_id: PaymentId
58 //! #     ) -> Result<(), PaymentSendFailure> { unimplemented!() }
59 //! # }
60 //! #
61 //! # struct FakeRouter {};
62 //! # impl<S: routing::Score> Router<S> for FakeRouter {
63 //! #     fn find_route(
64 //! #         &self, payer: &PublicKey, params: &RouteParameters,
65 //! #         first_hops: Option<&[&ChannelDetails]>, scorer: &S
66 //! #     ) -> Result<Route, LightningError> { unimplemented!() }
67 //! # }
68 //! #
69 //! # struct FakeScorer {};
70 //! # impl routing::Score for FakeScorer {
71 //! #     fn channel_penalty_msat(
72 //! #         &self, _short_channel_id: u64, _source: &NodeId, _target: &NodeId
73 //! #     ) -> u64 { 0 }
74 //! #     fn payment_path_failed(&mut self, _path: &Vec<RouteHop>, _short_channel_id: u64) {}
75 //! # }
76 //! #
77 //! # struct FakeLogger {};
78 //! # impl Logger for FakeLogger {
79 //! #     fn log(&self, record: &Record) { unimplemented!() }
80 //! # }
81 //! #
82 //! # fn main() {
83 //! let event_handler = |event: &Event| {
84 //!     match event {
85 //!         Event::PaymentPathFailed { .. } => println!("payment failed after retries"),
86 //!         Event::PaymentSent { .. } => println!("payment successful"),
87 //!         _ => {},
88 //!     }
89 //! };
90 //! # let payer = FakePayer {};
91 //! # let router = FakeRouter {};
92 //! # let scorer = RefCell::new(FakeScorer {});
93 //! # let logger = FakeLogger {};
94 //! let invoice_payer = InvoicePayer::new(&payer, router, &scorer, &logger, event_handler, RetryAttempts(2));
95 //!
96 //! let invoice = "...";
97 //! let invoice = invoice.parse::<Invoice>().unwrap();
98 //! invoice_payer.pay_invoice(&invoice).unwrap();
99 //!
100 //! # let event_provider = FakeEventProvider {};
101 //! loop {
102 //!     event_provider.process_pending_events(&invoice_payer);
103 //! }
104 //! # }
105 //! ```
106 //!
107 //! # Note
108 //!
109 //! The [`Route`] is computed before each payment attempt. Any updates affecting path finding such
110 //! as updates to the network graph or changes to channel scores should be applied prior to
111 //! retries, typically by way of composing [`EventHandler`]s accordingly.
112
113 use crate::Invoice;
114
115 use bitcoin_hashes::Hash;
116
117 use lightning::ln::{PaymentHash, PaymentSecret};
118 use lightning::ln::channelmanager::{ChannelDetails, PaymentId, PaymentSendFailure};
119 use lightning::ln::msgs::LightningError;
120 use lightning::routing;
121 use lightning::routing::{LockableScore, Score};
122 use lightning::routing::router::{Payee, Route, RouteParameters};
123 use lightning::util::events::{Event, EventHandler};
124 use lightning::util::logger::Logger;
125
126 use secp256k1::key::PublicKey;
127
128 use std::collections::hash_map::{self, HashMap};
129 use std::ops::Deref;
130 use std::sync::Mutex;
131 use std::time::{Duration, SystemTime};
132
133 /// A utility for paying [`Invoice]`s.
134 pub struct InvoicePayer<P: Deref, R, S: Deref, L: Deref, E>
135 where
136         P::Target: Payer,
137         R: for <'a> Router<<<S as Deref>::Target as routing::LockableScore<'a>>::Locked>,
138         S::Target: for <'a> routing::LockableScore<'a>,
139         L::Target: Logger,
140         E: EventHandler,
141 {
142         payer: P,
143         router: R,
144         scorer: S,
145         logger: L,
146         event_handler: E,
147         payment_cache: Mutex<HashMap<PaymentHash, usize>>,
148         retry_attempts: RetryAttempts,
149 }
150
151 /// A trait defining behavior of an [`Invoice`] payer.
152 pub trait Payer {
153         /// Returns the payer's node id.
154         fn node_id(&self) -> PublicKey;
155
156         /// Returns the payer's channels.
157         fn first_hops(&self) -> Vec<ChannelDetails>;
158
159         /// Sends a payment over the Lightning Network using the given [`Route`].
160         fn send_payment(
161                 &self, route: &Route, payment_hash: PaymentHash, payment_secret: &Option<PaymentSecret>
162         ) -> Result<PaymentId, PaymentSendFailure>;
163
164         /// Retries a failed payment path for the [`PaymentId`] using the given [`Route`].
165         fn retry_payment(&self, route: &Route, payment_id: PaymentId) -> Result<(), PaymentSendFailure>;
166 }
167
168 /// A trait defining behavior for routing an [`Invoice`] payment.
169 pub trait Router<S: routing::Score> {
170         /// Finds a [`Route`] between `payer` and `payee` for a payment with the given values.
171         fn find_route(
172                 &self, payer: &PublicKey, params: &RouteParameters, first_hops: Option<&[&ChannelDetails]>,
173                 scorer: &S
174         ) -> Result<Route, LightningError>;
175 }
176
177 /// Number of attempts to retry payment path failures for an [`Invoice`].
178 #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
179 pub struct RetryAttempts(pub usize);
180
181 /// An error that may occur when making a payment.
182 #[derive(Clone, Debug)]
183 pub enum PaymentError {
184         /// An error resulting from the provided [`Invoice`] or payment hash.
185         Invoice(&'static str),
186         /// An error occurring when finding a route.
187         Routing(LightningError),
188         /// An error occurring when sending a payment.
189         Sending(PaymentSendFailure),
190 }
191
192 impl<P: Deref, R, S: Deref, L: Deref, E> InvoicePayer<P, R, S, L, E>
193 where
194         P::Target: Payer,
195         R: for <'a> Router<<<S as Deref>::Target as routing::LockableScore<'a>>::Locked>,
196         S::Target: for <'a> routing::LockableScore<'a>,
197         L::Target: Logger,
198         E: EventHandler,
199 {
200         /// Creates an invoice payer that retries failed payment paths.
201         ///
202         /// Will forward any [`Event::PaymentPathFailed`] events to the decorated `event_handler` once
203         /// `retry_attempts` has been exceeded for a given [`Invoice`].
204         pub fn new(
205                 payer: P, router: R, scorer: S, logger: L, event_handler: E, retry_attempts: RetryAttempts
206         ) -> Self {
207                 Self {
208                         payer,
209                         router,
210                         scorer,
211                         logger,
212                         event_handler,
213                         payment_cache: Mutex::new(HashMap::new()),
214                         retry_attempts,
215                 }
216         }
217
218         /// Pays the given [`Invoice`], caching it for later use in case a retry is needed.
219         pub fn pay_invoice(&self, invoice: &Invoice) -> Result<PaymentId, PaymentError> {
220                 if invoice.amount_milli_satoshis().is_none() {
221                         Err(PaymentError::Invoice("amount missing"))
222                 } else {
223                         self.pay_invoice_internal(invoice, None)
224                 }
225         }
226
227         /// Pays the given zero-value [`Invoice`] using the given amount, caching it for later use in
228         /// case a retry is needed.
229         pub fn pay_zero_value_invoice(
230                 &self, invoice: &Invoice, amount_msats: u64
231         ) -> Result<PaymentId, PaymentError> {
232                 if invoice.amount_milli_satoshis().is_some() {
233                         Err(PaymentError::Invoice("amount unexpected"))
234                 } else {
235                         self.pay_invoice_internal(invoice, Some(amount_msats))
236                 }
237         }
238
239         fn pay_invoice_internal(
240                 &self, invoice: &Invoice, amount_msats: Option<u64>
241         ) -> Result<PaymentId, PaymentError> {
242                 debug_assert!(invoice.amount_milli_satoshis().is_some() ^ amount_msats.is_some());
243                 let payment_hash = PaymentHash(invoice.payment_hash().clone().into_inner());
244                 let mut payment_cache = self.payment_cache.lock().unwrap();
245                 match payment_cache.entry(payment_hash) {
246                         hash_map::Entry::Vacant(entry) => {
247                                 let payer = self.payer.node_id();
248                                 let mut payee = Payee::new(invoice.recover_payee_pub_key())
249                                         .with_expiry_time(expiry_time_from_unix_epoch(&invoice).as_secs())
250                                         .with_route_hints(invoice.route_hints());
251                                 if let Some(features) = invoice.features() {
252                                         payee = payee.with_features(features.clone());
253                                 }
254                                 let params = RouteParameters {
255                                         payee,
256                                         final_value_msat: invoice.amount_milli_satoshis().or(amount_msats).unwrap(),
257                                         final_cltv_expiry_delta: invoice.min_final_cltv_expiry() as u32,
258                                 };
259                                 let first_hops = self.payer.first_hops();
260                                 let route = self.router.find_route(
261                                         &payer,
262                                         &params,
263                                         Some(&first_hops.iter().collect::<Vec<_>>()),
264                                         &self.scorer.lock(),
265                                 ).map_err(|e| PaymentError::Routing(e))?;
266
267                                 let payment_hash = PaymentHash(invoice.payment_hash().clone().into_inner());
268                                 let payment_secret = Some(invoice.payment_secret().clone());
269                                 let payment_id = self.payer.send_payment(&route, payment_hash, &payment_secret)
270                                         .map_err(|e| PaymentError::Sending(e))?;
271                                 entry.insert(0);
272                                 Ok(payment_id)
273                         },
274                         hash_map::Entry::Occupied(_) => Err(PaymentError::Invoice("payment pending")),
275                 }
276         }
277
278         fn retry_payment(
279                 &self, payment_id: PaymentId, params: &RouteParameters
280         ) -> Result<(), PaymentError> {
281                 let payer = self.payer.node_id();
282                 let first_hops = self.payer.first_hops();
283                 let route = self.router.find_route(
284                         &payer, &params, Some(&first_hops.iter().collect::<Vec<_>>()),
285                         &self.scorer.lock()
286                 ).map_err(|e| PaymentError::Routing(e))?;
287                 self.payer.retry_payment(&route, payment_id).map_err(|e| PaymentError::Sending(e))
288         }
289
290         /// Removes the payment cached by the given payment hash.
291         ///
292         /// Should be called once a payment has failed or succeeded if not using [`InvoicePayer`] as an
293         /// [`EventHandler`]. Otherwise, calling this method is unnecessary.
294         pub fn remove_cached_payment(&self, payment_hash: &PaymentHash) {
295                 self.payment_cache.lock().unwrap().remove(payment_hash);
296         }
297 }
298
299 fn expiry_time_from_unix_epoch(invoice: &Invoice) -> Duration {
300         invoice.timestamp().duration_since(SystemTime::UNIX_EPOCH).unwrap() + invoice.expiry_time()
301 }
302
303 fn has_expired(params: &RouteParameters) -> bool {
304         let expiry_time = Duration::from_secs(params.payee.expiry_time.unwrap());
305         Invoice::is_expired_from_epoch(&SystemTime::UNIX_EPOCH, expiry_time)
306 }
307
308 impl<P: Deref, R, S: Deref, L: Deref, E> EventHandler for InvoicePayer<P, R, S, L, E>
309 where
310         P::Target: Payer,
311         R: for <'a> Router<<<S as Deref>::Target as routing::LockableScore<'a>>::Locked>,
312         S::Target: for <'a> routing::LockableScore<'a>,
313         L::Target: Logger,
314         E: EventHandler,
315 {
316         fn handle_event(&self, event: &Event) {
317                 match event {
318                         Event::PaymentPathFailed {
319                                 payment_id, payment_hash, rejected_by_dest, path, short_channel_id, retry, ..
320                         } => {
321                                 if let Some(short_channel_id) = short_channel_id {
322                                         self.scorer.lock().payment_path_failed(path, *short_channel_id);
323                                 }
324
325                                 let mut payment_cache = self.payment_cache.lock().unwrap();
326                                 let entry = loop {
327                                         let entry = payment_cache.entry(*payment_hash);
328                                         match entry {
329                                                 hash_map::Entry::Occupied(_) => break entry,
330                                                 hash_map::Entry::Vacant(entry) => entry.insert(0),
331                                         };
332                                 };
333                                 if let hash_map::Entry::Occupied(mut entry) = entry {
334                                         let max_payment_attempts = self.retry_attempts.0 + 1;
335                                         let attempts = entry.get_mut();
336                                         *attempts += 1;
337
338                                         if *rejected_by_dest {
339                                                 log_trace!(self.logger, "Payment {} rejected by destination; not retrying (attempts: {})", log_bytes!(payment_hash.0), attempts);
340                                         } else if payment_id.is_none() {
341                                                 log_trace!(self.logger, "Payment {} has no id; not retrying (attempts: {})", log_bytes!(payment_hash.0), attempts);
342                                         } else if *attempts >= max_payment_attempts {
343                                                 log_trace!(self.logger, "Payment {} exceeded maximum attempts; not retrying (attempts: {})", log_bytes!(payment_hash.0), attempts);
344                                         } else if retry.is_none() {
345                                                 log_trace!(self.logger, "Payment {} missing retry params; not retrying (attempts: {})", log_bytes!(payment_hash.0), attempts);
346                                         } else if has_expired(retry.as_ref().unwrap()) {
347                                                 log_trace!(self.logger, "Invoice expired for payment {}; not retrying (attempts: {})", log_bytes!(payment_hash.0), attempts);
348                                         } else if self.retry_payment(*payment_id.as_ref().unwrap(), retry.as_ref().unwrap()).is_err() {
349                                                 log_trace!(self.logger, "Error retrying payment {}; not retrying (attempts: {})", log_bytes!(payment_hash.0), attempts);
350                                         } else {
351                                                 log_trace!(self.logger, "Payment {} failed; retrying (attempts: {})", log_bytes!(payment_hash.0), attempts);
352                                                 return;
353                                         }
354
355                                         // Either the payment was rejected, the maximum attempts were exceeded, or an
356                                         // error occurred when attempting to retry.
357                                         entry.remove();
358                                 } else {
359                                         unreachable!();
360                                 }
361                         },
362                         Event::PaymentSent { payment_hash, .. } => {
363                                 let mut payment_cache = self.payment_cache.lock().unwrap();
364                                 let attempts = payment_cache
365                                         .remove(payment_hash)
366                                         .map_or(1, |attempts| attempts + 1);
367                                 log_trace!(self.logger, "Payment {} succeeded (attempts: {})", log_bytes!(payment_hash.0), attempts);
368                         },
369                         _ => {},
370                 }
371
372                 // Delegate to the decorated event handler unless the payment is retried.
373                 self.event_handler.handle_event(event)
374         }
375 }
376
377 #[cfg(test)]
378 mod tests {
379         use super::*;
380         use crate::{DEFAULT_EXPIRY_TIME, InvoiceBuilder, Currency};
381         use bitcoin_hashes::sha256::Hash as Sha256;
382         use lightning::ln::PaymentPreimage;
383         use lightning::ln::features::{ChannelFeatures, NodeFeatures};
384         use lightning::ln::msgs::{ErrorAction, LightningError};
385         use lightning::routing::network_graph::NodeId;
386         use lightning::routing::router::{Payee, Route, RouteHop};
387         use lightning::util::test_utils::TestLogger;
388         use lightning::util::errors::APIError;
389         use lightning::util::events::Event;
390         use secp256k1::{SecretKey, PublicKey, Secp256k1};
391         use std::cell::RefCell;
392         use std::time::{SystemTime, Duration};
393
394         fn invoice(payment_preimage: PaymentPreimage) -> Invoice {
395                 let payment_hash = Sha256::hash(&payment_preimage.0);
396                 let private_key = SecretKey::from_slice(&[42; 32]).unwrap();
397                 InvoiceBuilder::new(Currency::Bitcoin)
398                         .description("test".into())
399                         .payment_hash(payment_hash)
400                         .payment_secret(PaymentSecret([0; 32]))
401                         .current_timestamp()
402                         .min_final_cltv_expiry(144)
403                         .amount_milli_satoshis(128)
404                         .build_signed(|hash| {
405                                 Secp256k1::new().sign_recoverable(hash, &private_key)
406                         })
407                         .unwrap()
408         }
409
410         fn zero_value_invoice(payment_preimage: PaymentPreimage) -> Invoice {
411                 let payment_hash = Sha256::hash(&payment_preimage.0);
412                 let private_key = SecretKey::from_slice(&[42; 32]).unwrap();
413                 InvoiceBuilder::new(Currency::Bitcoin)
414                         .description("test".into())
415                         .payment_hash(payment_hash)
416                         .payment_secret(PaymentSecret([0; 32]))
417                         .current_timestamp()
418                         .min_final_cltv_expiry(144)
419                         .build_signed(|hash| {
420                                 Secp256k1::new().sign_recoverable(hash, &private_key)
421                         })
422                         .unwrap()
423         }
424
425         fn expired_invoice(payment_preimage: PaymentPreimage) -> Invoice {
426                 let payment_hash = Sha256::hash(&payment_preimage.0);
427                 let private_key = SecretKey::from_slice(&[42; 32]).unwrap();
428                 let timestamp = SystemTime::now()
429                         .checked_sub(Duration::from_secs(DEFAULT_EXPIRY_TIME * 2))
430                         .unwrap();
431                 InvoiceBuilder::new(Currency::Bitcoin)
432                         .description("test".into())
433                         .payment_hash(payment_hash)
434                         .payment_secret(PaymentSecret([0; 32]))
435                         .timestamp(timestamp)
436                         .min_final_cltv_expiry(144)
437                         .amount_milli_satoshis(128)
438                         .build_signed(|hash| {
439                                 Secp256k1::new().sign_recoverable(hash, &private_key)
440                         })
441                         .unwrap()
442         }
443
444         #[test]
445         fn pays_invoice_on_first_attempt() {
446                 let event_handled = core::cell::RefCell::new(false);
447                 let event_handler = |_: &_| { *event_handled.borrow_mut() = true; };
448
449                 let payment_preimage = PaymentPreimage([1; 32]);
450                 let invoice = invoice(payment_preimage);
451                 let payment_hash = PaymentHash(invoice.payment_hash().clone().into_inner());
452
453                 let payer = TestPayer::new();
454                 let router = TestRouter {};
455                 let scorer = RefCell::new(TestScorer::new());
456                 let logger = TestLogger::new();
457                 let invoice_payer =
458                         InvoicePayer::new(&payer, router, &scorer, &logger, event_handler, RetryAttempts(0));
459
460                 let payment_id = Some(invoice_payer.pay_invoice(&invoice).unwrap());
461                 assert_eq!(*payer.attempts.borrow(), 1);
462
463                 invoice_payer.handle_event(&Event::PaymentSent {
464                         payment_id, payment_preimage, payment_hash, fee_paid_msat: None
465                 });
466                 assert_eq!(*event_handled.borrow(), true);
467                 assert_eq!(*payer.attempts.borrow(), 1);
468         }
469
470         #[test]
471         fn pays_invoice_on_retry() {
472                 let event_handled = core::cell::RefCell::new(false);
473                 let event_handler = |_: &_| { *event_handled.borrow_mut() = true; };
474
475                 let payment_preimage = PaymentPreimage([1; 32]);
476                 let invoice = invoice(payment_preimage);
477                 let payment_hash = PaymentHash(invoice.payment_hash().clone().into_inner());
478                 let final_value_msat = invoice.amount_milli_satoshis().unwrap();
479
480                 let payer = TestPayer::new()
481                         .expect_value_msat(final_value_msat)
482                         .expect_value_msat(final_value_msat / 2);
483                 let router = TestRouter {};
484                 let scorer = RefCell::new(TestScorer::new());
485                 let logger = TestLogger::new();
486                 let invoice_payer =
487                         InvoicePayer::new(&payer, router, &scorer, &logger, event_handler, RetryAttempts(2));
488
489                 let payment_id = Some(invoice_payer.pay_invoice(&invoice).unwrap());
490                 assert_eq!(*payer.attempts.borrow(), 1);
491
492                 let event = Event::PaymentPathFailed {
493                         payment_id,
494                         payment_hash,
495                         network_update: None,
496                         rejected_by_dest: false,
497                         all_paths_failed: false,
498                         path: TestRouter::path_for_value(final_value_msat),
499                         short_channel_id: None,
500                         retry: Some(TestRouter::retry_for_invoice(&invoice)),
501                 };
502                 invoice_payer.handle_event(&event);
503                 assert_eq!(*event_handled.borrow(), false);
504                 assert_eq!(*payer.attempts.borrow(), 2);
505
506                 invoice_payer.handle_event(&Event::PaymentSent {
507                         payment_id, payment_preimage, payment_hash, fee_paid_msat: None
508                 });
509                 assert_eq!(*event_handled.borrow(), true);
510                 assert_eq!(*payer.attempts.borrow(), 2);
511         }
512
513         #[test]
514         fn retries_payment_path_for_unknown_payment() {
515                 let event_handled = core::cell::RefCell::new(false);
516                 let event_handler = |_: &_| { *event_handled.borrow_mut() = true; };
517
518                 let payment_preimage = PaymentPreimage([1; 32]);
519                 let invoice = invoice(payment_preimage);
520                 let payment_hash = PaymentHash(invoice.payment_hash().clone().into_inner());
521                 let final_value_msat = invoice.amount_milli_satoshis().unwrap();
522
523                 let payer = TestPayer::new();
524                 let router = TestRouter {};
525                 let scorer = RefCell::new(TestScorer::new());
526                 let logger = TestLogger::new();
527                 let invoice_payer =
528                         InvoicePayer::new(&payer, router, &scorer, &logger, event_handler, RetryAttempts(2));
529
530                 let payment_id = Some(PaymentId([1; 32]));
531                 let event = Event::PaymentPathFailed {
532                         payment_id,
533                         payment_hash,
534                         network_update: None,
535                         rejected_by_dest: false,
536                         all_paths_failed: false,
537                         path: TestRouter::path_for_value(final_value_msat),
538                         short_channel_id: None,
539                         retry: Some(TestRouter::retry_for_invoice(&invoice)),
540                 };
541                 invoice_payer.handle_event(&event);
542                 assert_eq!(*event_handled.borrow(), false);
543                 assert_eq!(*payer.attempts.borrow(), 1);
544
545                 invoice_payer.handle_event(&event);
546                 assert_eq!(*event_handled.borrow(), false);
547                 assert_eq!(*payer.attempts.borrow(), 2);
548
549                 invoice_payer.handle_event(&Event::PaymentSent {
550                         payment_id, payment_preimage, payment_hash, fee_paid_msat: None
551                 });
552                 assert_eq!(*event_handled.borrow(), true);
553                 assert_eq!(*payer.attempts.borrow(), 2);
554         }
555
556         #[test]
557         fn fails_paying_invoice_after_max_retries() {
558                 let event_handled = core::cell::RefCell::new(false);
559                 let event_handler = |_: &_| { *event_handled.borrow_mut() = true; };
560
561                 let payment_preimage = PaymentPreimage([1; 32]);
562                 let invoice = invoice(payment_preimage);
563                 let final_value_msat = invoice.amount_milli_satoshis().unwrap();
564
565                 let payer = TestPayer::new()
566                         .expect_value_msat(final_value_msat)
567                         .expect_value_msat(final_value_msat / 2)
568                         .expect_value_msat(final_value_msat / 2);
569                 let router = TestRouter {};
570                 let scorer = RefCell::new(TestScorer::new());
571                 let logger = TestLogger::new();
572                 let invoice_payer =
573                         InvoicePayer::new(&payer, router, &scorer, &logger, event_handler, RetryAttempts(2));
574
575                 let payment_id = Some(invoice_payer.pay_invoice(&invoice).unwrap());
576                 assert_eq!(*payer.attempts.borrow(), 1);
577
578                 let event = Event::PaymentPathFailed {
579                         payment_id,
580                         payment_hash: PaymentHash(invoice.payment_hash().clone().into_inner()),
581                         network_update: None,
582                         rejected_by_dest: false,
583                         all_paths_failed: true,
584                         path: TestRouter::path_for_value(final_value_msat),
585                         short_channel_id: None,
586                         retry: Some(TestRouter::retry_for_invoice(&invoice)),
587                 };
588                 invoice_payer.handle_event(&event);
589                 assert_eq!(*event_handled.borrow(), false);
590                 assert_eq!(*payer.attempts.borrow(), 2);
591
592                 let event = Event::PaymentPathFailed {
593                         payment_id,
594                         payment_hash: PaymentHash(invoice.payment_hash().clone().into_inner()),
595                         network_update: None,
596                         rejected_by_dest: false,
597                         all_paths_failed: false,
598                         path: TestRouter::path_for_value(final_value_msat / 2),
599                         short_channel_id: None,
600                         retry: Some(RouteParameters {
601                                 final_value_msat: final_value_msat / 2, ..TestRouter::retry_for_invoice(&invoice)
602                         }),
603                 };
604                 invoice_payer.handle_event(&event);
605                 assert_eq!(*event_handled.borrow(), false);
606                 assert_eq!(*payer.attempts.borrow(), 3);
607
608                 invoice_payer.handle_event(&event);
609                 assert_eq!(*event_handled.borrow(), true);
610                 assert_eq!(*payer.attempts.borrow(), 3);
611         }
612
613         #[test]
614         fn fails_paying_invoice_with_missing_retry_params() {
615                 let event_handled = core::cell::RefCell::new(false);
616                 let event_handler = |_: &_| { *event_handled.borrow_mut() = true; };
617
618                 let payer = TestPayer::new();
619                 let router = TestRouter {};
620                 let scorer = RefCell::new(TestScorer::new());
621                 let logger = TestLogger::new();
622                 let invoice_payer =
623                         InvoicePayer::new(&payer, router, &scorer, &logger, event_handler, RetryAttempts(2));
624
625                 let payment_preimage = PaymentPreimage([1; 32]);
626                 let invoice = invoice(payment_preimage);
627                 let payment_id = Some(invoice_payer.pay_invoice(&invoice).unwrap());
628                 assert_eq!(*payer.attempts.borrow(), 1);
629
630                 let event = Event::PaymentPathFailed {
631                         payment_id,
632                         payment_hash: PaymentHash(invoice.payment_hash().clone().into_inner()),
633                         network_update: None,
634                         rejected_by_dest: false,
635                         all_paths_failed: false,
636                         path: vec![],
637                         short_channel_id: None,
638                         retry: None,
639                 };
640                 invoice_payer.handle_event(&event);
641                 assert_eq!(*event_handled.borrow(), true);
642                 assert_eq!(*payer.attempts.borrow(), 1);
643         }
644
645         #[test]
646         fn fails_paying_invoice_after_expiration() {
647                 let event_handled = core::cell::RefCell::new(false);
648                 let event_handler = |_: &_| { *event_handled.borrow_mut() = true; };
649
650                 let payer = TestPayer::new();
651                 let router = TestRouter {};
652                 let scorer = RefCell::new(TestScorer::new());
653                 let logger = TestLogger::new();
654                 let invoice_payer =
655                         InvoicePayer::new(&payer, router, &scorer, &logger, event_handler, RetryAttempts(2));
656
657                 let payment_preimage = PaymentPreimage([1; 32]);
658                 let invoice = expired_invoice(payment_preimage);
659                 let payment_id = Some(invoice_payer.pay_invoice(&invoice).unwrap());
660                 assert_eq!(*payer.attempts.borrow(), 1);
661
662                 let event = Event::PaymentPathFailed {
663                         payment_id,
664                         payment_hash: PaymentHash(invoice.payment_hash().clone().into_inner()),
665                         network_update: None,
666                         rejected_by_dest: false,
667                         all_paths_failed: false,
668                         path: vec![],
669                         short_channel_id: None,
670                         retry: Some(TestRouter::retry_for_invoice(&invoice)),
671                 };
672                 invoice_payer.handle_event(&event);
673                 assert_eq!(*event_handled.borrow(), true);
674                 assert_eq!(*payer.attempts.borrow(), 1);
675         }
676
677         #[test]
678         fn fails_paying_invoice_after_retry_error() {
679                 let event_handled = core::cell::RefCell::new(false);
680                 let event_handler = |_: &_| { *event_handled.borrow_mut() = true; };
681
682                 let payment_preimage = PaymentPreimage([1; 32]);
683                 let invoice = invoice(payment_preimage);
684                 let final_value_msat = invoice.amount_milli_satoshis().unwrap();
685
686                 let payer = TestPayer::new()
687                         .fails_on_attempt(2)
688                         .expect_value_msat(final_value_msat);
689                 let router = TestRouter {};
690                 let scorer = RefCell::new(TestScorer::new());
691                 let logger = TestLogger::new();
692                 let invoice_payer =
693                         InvoicePayer::new(&payer, router, &scorer, &logger, event_handler, RetryAttempts(2));
694
695                 let payment_id = Some(invoice_payer.pay_invoice(&invoice).unwrap());
696                 assert_eq!(*payer.attempts.borrow(), 1);
697
698                 let event = Event::PaymentPathFailed {
699                         payment_id,
700                         payment_hash: PaymentHash(invoice.payment_hash().clone().into_inner()),
701                         network_update: None,
702                         rejected_by_dest: false,
703                         all_paths_failed: false,
704                         path: TestRouter::path_for_value(final_value_msat / 2),
705                         short_channel_id: None,
706                         retry: Some(TestRouter::retry_for_invoice(&invoice)),
707                 };
708                 invoice_payer.handle_event(&event);
709                 assert_eq!(*event_handled.borrow(), true);
710                 assert_eq!(*payer.attempts.borrow(), 2);
711         }
712
713         #[test]
714         fn fails_paying_invoice_after_rejected_by_payee() {
715                 let event_handled = core::cell::RefCell::new(false);
716                 let event_handler = |_: &_| { *event_handled.borrow_mut() = true; };
717
718                 let payer = TestPayer::new();
719                 let router = TestRouter {};
720                 let scorer = RefCell::new(TestScorer::new());
721                 let logger = TestLogger::new();
722                 let invoice_payer =
723                         InvoicePayer::new(&payer, router, &scorer, &logger, event_handler, RetryAttempts(2));
724
725                 let payment_preimage = PaymentPreimage([1; 32]);
726                 let invoice = invoice(payment_preimage);
727                 let payment_id = Some(invoice_payer.pay_invoice(&invoice).unwrap());
728                 assert_eq!(*payer.attempts.borrow(), 1);
729
730                 let event = Event::PaymentPathFailed {
731                         payment_id,
732                         payment_hash: PaymentHash(invoice.payment_hash().clone().into_inner()),
733                         network_update: None,
734                         rejected_by_dest: true,
735                         all_paths_failed: false,
736                         path: vec![],
737                         short_channel_id: None,
738                         retry: Some(TestRouter::retry_for_invoice(&invoice)),
739                 };
740                 invoice_payer.handle_event(&event);
741                 assert_eq!(*event_handled.borrow(), true);
742                 assert_eq!(*payer.attempts.borrow(), 1);
743         }
744
745         #[test]
746         fn fails_repaying_invoice_with_pending_payment() {
747                 let event_handled = core::cell::RefCell::new(false);
748                 let event_handler = |_: &_| { *event_handled.borrow_mut() = true; };
749
750                 let payer = TestPayer::new();
751                 let router = TestRouter {};
752                 let scorer = RefCell::new(TestScorer::new());
753                 let logger = TestLogger::new();
754                 let invoice_payer =
755                         InvoicePayer::new(&payer, router, &scorer, &logger, event_handler, RetryAttempts(0));
756
757                 let payment_preimage = PaymentPreimage([1; 32]);
758                 let invoice = invoice(payment_preimage);
759                 let payment_id = Some(invoice_payer.pay_invoice(&invoice).unwrap());
760
761                 // Cannot repay an invoice pending payment.
762                 match invoice_payer.pay_invoice(&invoice) {
763                         Err(PaymentError::Invoice("payment pending")) => {},
764                         Err(_) => panic!("unexpected error"),
765                         Ok(_) => panic!("expected invoice error"),
766                 }
767
768                 // Can repay an invoice once cleared from cache.
769                 let payment_hash = PaymentHash(invoice.payment_hash().clone().into_inner());
770                 invoice_payer.remove_cached_payment(&payment_hash);
771                 assert!(invoice_payer.pay_invoice(&invoice).is_ok());
772
773                 // Cannot retry paying an invoice if cleared from cache.
774                 invoice_payer.remove_cached_payment(&payment_hash);
775                 let event = Event::PaymentPathFailed {
776                         payment_id,
777                         payment_hash,
778                         network_update: None,
779                         rejected_by_dest: false,
780                         all_paths_failed: false,
781                         path: vec![],
782                         short_channel_id: None,
783                         retry: Some(TestRouter::retry_for_invoice(&invoice)),
784                 };
785                 invoice_payer.handle_event(&event);
786                 assert_eq!(*event_handled.borrow(), true);
787         }
788
789         #[test]
790         fn fails_paying_invoice_with_routing_errors() {
791                 let payer = TestPayer::new();
792                 let router = FailingRouter {};
793                 let scorer = RefCell::new(TestScorer::new());
794                 let logger = TestLogger::new();
795                 let invoice_payer =
796                         InvoicePayer::new(&payer, router, &scorer, &logger, |_: &_| {}, RetryAttempts(0));
797
798                 let payment_preimage = PaymentPreimage([1; 32]);
799                 let invoice = invoice(payment_preimage);
800                 match invoice_payer.pay_invoice(&invoice) {
801                         Err(PaymentError::Routing(_)) => {},
802                         Err(_) => panic!("unexpected error"),
803                         Ok(_) => panic!("expected routing error"),
804                 }
805         }
806
807         #[test]
808         fn fails_paying_invoice_with_sending_errors() {
809                 let payer = TestPayer::new().fails_on_attempt(1);
810                 let router = TestRouter {};
811                 let scorer = RefCell::new(TestScorer::new());
812                 let logger = TestLogger::new();
813                 let invoice_payer =
814                         InvoicePayer::new(&payer, router, &scorer, &logger, |_: &_| {}, RetryAttempts(0));
815
816                 let payment_preimage = PaymentPreimage([1; 32]);
817                 let invoice = invoice(payment_preimage);
818                 match invoice_payer.pay_invoice(&invoice) {
819                         Err(PaymentError::Sending(_)) => {},
820                         Err(_) => panic!("unexpected error"),
821                         Ok(_) => panic!("expected sending error"),
822                 }
823         }
824
825         #[test]
826         fn pays_zero_value_invoice_using_amount() {
827                 let event_handled = core::cell::RefCell::new(false);
828                 let event_handler = |_: &_| { *event_handled.borrow_mut() = true; };
829
830                 let payment_preimage = PaymentPreimage([1; 32]);
831                 let invoice = zero_value_invoice(payment_preimage);
832                 let payment_hash = PaymentHash(invoice.payment_hash().clone().into_inner());
833                 let final_value_msat = 100;
834
835                 let payer = TestPayer::new().expect_value_msat(final_value_msat);
836                 let router = TestRouter {};
837                 let scorer = RefCell::new(TestScorer::new());
838                 let logger = TestLogger::new();
839                 let invoice_payer =
840                         InvoicePayer::new(&payer, router, &scorer, &logger, event_handler, RetryAttempts(0));
841
842                 let payment_id =
843                         Some(invoice_payer.pay_zero_value_invoice(&invoice, final_value_msat).unwrap());
844                 assert_eq!(*payer.attempts.borrow(), 1);
845
846                 invoice_payer.handle_event(&Event::PaymentSent {
847                         payment_id, payment_preimage, payment_hash, fee_paid_msat: None
848                 });
849                 assert_eq!(*event_handled.borrow(), true);
850                 assert_eq!(*payer.attempts.borrow(), 1);
851         }
852
853         #[test]
854         fn fails_paying_zero_value_invoice_with_amount() {
855                 let event_handled = core::cell::RefCell::new(false);
856                 let event_handler = |_: &_| { *event_handled.borrow_mut() = true; };
857
858                 let payer = TestPayer::new();
859                 let router = TestRouter {};
860                 let scorer = RefCell::new(TestScorer::new());
861                 let logger = TestLogger::new();
862                 let invoice_payer =
863                         InvoicePayer::new(&payer, router, &scorer, &logger, event_handler, RetryAttempts(0));
864
865                 let payment_preimage = PaymentPreimage([1; 32]);
866                 let invoice = invoice(payment_preimage);
867
868                 // Cannot repay an invoice pending payment.
869                 match invoice_payer.pay_zero_value_invoice(&invoice, 100) {
870                         Err(PaymentError::Invoice("amount unexpected")) => {},
871                         Err(_) => panic!("unexpected error"),
872                         Ok(_) => panic!("expected invoice error"),
873                 }
874         }
875
876         #[test]
877         fn scores_failed_channel() {
878                 let event_handled = core::cell::RefCell::new(false);
879                 let event_handler = |_: &_| { *event_handled.borrow_mut() = true; };
880
881                 let payment_preimage = PaymentPreimage([1; 32]);
882                 let invoice = invoice(payment_preimage);
883                 let payment_hash = PaymentHash(invoice.payment_hash().clone().into_inner());
884                 let final_value_msat = invoice.amount_milli_satoshis().unwrap();
885                 let path = TestRouter::path_for_value(final_value_msat);
886                 let short_channel_id = Some(path[0].short_channel_id);
887
888                 // Expect that scorer is given short_channel_id upon handling the event.
889                 let payer = TestPayer::new();
890                 let router = TestRouter {};
891                 let scorer = RefCell::new(TestScorer::new().expect_channel_failure(short_channel_id.unwrap()));
892                 let logger = TestLogger::new();
893                 let invoice_payer =
894                         InvoicePayer::new(&payer, router, &scorer, &logger, event_handler, RetryAttempts(2));
895
896                 let payment_id = Some(invoice_payer.pay_invoice(&invoice).unwrap());
897                 let event = Event::PaymentPathFailed {
898                         payment_id,
899                         payment_hash,
900                         network_update: None,
901                         rejected_by_dest: false,
902                         all_paths_failed: false,
903                         path,
904                         short_channel_id,
905                         retry: Some(TestRouter::retry_for_invoice(&invoice)),
906                 };
907                 invoice_payer.handle_event(&event);
908         }
909
910         struct TestRouter;
911
912         impl TestRouter {
913                 fn route_for_value(final_value_msat: u64) -> Route {
914                         Route {
915                                 paths: vec![
916                                         vec![RouteHop {
917                                                 pubkey: PublicKey::from_slice(&hex::decode("02eec7245d6b7d2ccb30380bfbe2a3648cd7a942653f5aa340edcea1f283686619").unwrap()[..]).unwrap(),
918                                                 channel_features: ChannelFeatures::empty(),
919                                                 node_features: NodeFeatures::empty(),
920                                                 short_channel_id: 0, fee_msat: final_value_msat / 2, cltv_expiry_delta: 144
921                                         }],
922                                         vec![RouteHop {
923                                                 pubkey: PublicKey::from_slice(&hex::decode("0324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1c").unwrap()[..]).unwrap(),
924                                                 channel_features: ChannelFeatures::empty(),
925                                                 node_features: NodeFeatures::empty(),
926                                                 short_channel_id: 1, fee_msat: final_value_msat / 2, cltv_expiry_delta: 144
927                                         }],
928                                 ],
929                                 payee: None,
930                         }
931                 }
932
933                 fn path_for_value(final_value_msat: u64) -> Vec<RouteHop> {
934                         TestRouter::route_for_value(final_value_msat).paths[0].clone()
935                 }
936
937                 fn retry_for_invoice(invoice: &Invoice) -> RouteParameters {
938                         let mut payee = Payee::new(invoice.recover_payee_pub_key())
939                                 .with_expiry_time(expiry_time_from_unix_epoch(invoice).as_secs())
940                                 .with_route_hints(invoice.route_hints());
941                         if let Some(features) = invoice.features() {
942                                 payee = payee.with_features(features.clone());
943                         }
944                         let final_value_msat = invoice.amount_milli_satoshis().unwrap() / 2;
945                         RouteParameters {
946                                 payee,
947                                 final_value_msat,
948                                 final_cltv_expiry_delta: invoice.min_final_cltv_expiry() as u32,
949                         }
950                 }
951         }
952
953         impl<S: routing::Score> Router<S> for TestRouter {
954                 fn find_route(
955                         &self,
956                         _payer: &PublicKey,
957                         params: &RouteParameters,
958                         _first_hops: Option<&[&ChannelDetails]>,
959                         _scorer: &S,
960                 ) -> Result<Route, LightningError> {
961                         Ok(Route {
962                                 payee: Some(params.payee.clone()), ..Self::route_for_value(params.final_value_msat)
963                         })
964                 }
965         }
966
967         struct FailingRouter;
968
969         impl<S: routing::Score> Router<S> for FailingRouter {
970                 fn find_route(
971                         &self,
972                         _payer: &PublicKey,
973                         _params: &RouteParameters,
974                         _first_hops: Option<&[&ChannelDetails]>,
975                         _scorer: &S,
976                 ) -> Result<Route, LightningError> {
977                         Err(LightningError { err: String::new(), action: ErrorAction::IgnoreError })
978                 }
979         }
980
981         struct TestScorer {
982                 expectations: std::collections::VecDeque<u64>,
983         }
984
985         impl TestScorer {
986                 fn new() -> Self {
987                         Self {
988                                 expectations: std::collections::VecDeque::new(),
989                         }
990                 }
991
992                 fn expect_channel_failure(mut self, short_channel_id: u64) -> Self {
993                         self.expectations.push_back(short_channel_id);
994                         self
995                 }
996         }
997
998         impl routing::Score for TestScorer {
999                 fn channel_penalty_msat(
1000                         &self, _short_channel_id: u64, _source: &NodeId, _target: &NodeId
1001                 ) -> u64 { 0 }
1002
1003                 fn payment_path_failed(&mut self, _path: &Vec<RouteHop>, short_channel_id: u64) {
1004                         if let Some(expected_short_channel_id) = self.expectations.pop_front() {
1005                                 assert_eq!(short_channel_id, expected_short_channel_id);
1006                         }
1007                 }
1008         }
1009
1010         impl Drop for TestScorer {
1011                 fn drop(&mut self) {
1012                         if std::thread::panicking() {
1013                                 return;
1014                         }
1015
1016                         if !self.expectations.is_empty() {
1017                                 panic!("Unsatisfied channel failure expectations: {:?}", self.expectations);
1018                         }
1019                 }
1020         }
1021
1022         struct TestPayer {
1023                 expectations: core::cell::RefCell<std::collections::VecDeque<u64>>,
1024                 attempts: core::cell::RefCell<usize>,
1025                 failing_on_attempt: Option<usize>,
1026         }
1027
1028         impl TestPayer {
1029                 fn new() -> Self {
1030                         Self {
1031                                 expectations: core::cell::RefCell::new(std::collections::VecDeque::new()),
1032                                 attempts: core::cell::RefCell::new(0),
1033                                 failing_on_attempt: None,
1034                         }
1035                 }
1036
1037                 fn expect_value_msat(self, value_msat: u64) -> Self {
1038                         self.expectations.borrow_mut().push_back(value_msat);
1039                         self
1040                 }
1041
1042                 fn fails_on_attempt(self, attempt: usize) -> Self {
1043                         Self {
1044                                 expectations: core::cell::RefCell::new(self.expectations.borrow().clone()),
1045                                 attempts: core::cell::RefCell::new(0),
1046                                 failing_on_attempt: Some(attempt),
1047                         }
1048                 }
1049
1050                 fn check_attempts(&self) -> bool {
1051                         let mut attempts = self.attempts.borrow_mut();
1052                         *attempts += 1;
1053                         match self.failing_on_attempt {
1054                                 None => true,
1055                                 Some(attempt) if attempt != *attempts => true,
1056                                 Some(_) => false,
1057                         }
1058                 }
1059
1060                 fn check_value_msats(&self, route: &Route) {
1061                         let expected_value_msats = self.expectations.borrow_mut().pop_front();
1062                         if let Some(expected_value_msats) = expected_value_msats {
1063                                 let actual_value_msats = route.get_total_amount();
1064                                 assert_eq!(actual_value_msats, expected_value_msats);
1065                         }
1066                 }
1067         }
1068
1069         impl Drop for TestPayer {
1070                 fn drop(&mut self) {
1071                         if std::thread::panicking() {
1072                                 return;
1073                         }
1074
1075                         if !self.expectations.borrow().is_empty() {
1076                                 panic!("Unsatisfied payment expectations: {:?}", self.expectations.borrow());
1077                         }
1078                 }
1079         }
1080
1081         impl Payer for TestPayer {
1082                 fn node_id(&self) -> PublicKey {
1083                         let secp_ctx = Secp256k1::new();
1084                         PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap())
1085                 }
1086
1087                 fn first_hops(&self) -> Vec<ChannelDetails> {
1088                         Vec::new()
1089                 }
1090
1091                 fn send_payment(
1092                         &self,
1093                         route: &Route,
1094                         _payment_hash: PaymentHash,
1095                         _payment_secret: &Option<PaymentSecret>
1096                 ) -> Result<PaymentId, PaymentSendFailure> {
1097                         if self.check_attempts() {
1098                                 self.check_value_msats(route);
1099                                 Ok(PaymentId([1; 32]))
1100                         } else {
1101                                 Err(PaymentSendFailure::ParameterError(APIError::MonitorUpdateFailed))
1102                         }
1103                 }
1104
1105                 fn retry_payment(
1106                         &self, route: &Route, _payment_id: PaymentId
1107                 ) -> Result<(), PaymentSendFailure> {
1108                         if self.check_attempts() {
1109                                 self.check_value_msats(route);
1110                                 Ok(())
1111                         } else {
1112                                 Err(PaymentSendFailure::ParameterError(APIError::MonitorUpdateFailed))
1113                         }
1114                 }
1115         }
1116 }