12
12
//! Defines an [`InvoicePayer`] utility for paying invoices, parameterized by [`Payer`] and
13
13
//! [`Router`] traits. Implementations of [`Payer`] provide the payer's node id, channels, and means
14
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`] along with a
16
- //! [`NetworkGraph`].
15
+ //! and payee using information provided by the payer and from the payee's [`Invoice`].
17
16
//!
18
17
//! [`InvoicePayer`] caches each [`Invoice`] by its `payment_hash` so that [`PaymentRetryHandler`]
19
18
//! can retry the payment if it fails. It accomplishes this by implementing [`EventHandler`] which
26
25
//!
27
26
//! # Note
28
27
//!
29
- //! The [`Route`] is compute before each payment attempt. Any updates to the [`NetworkGraph`] or
30
- //! changes to channels scores should be applied prior to retries. This typically means any
31
- //! [`EventHandler`] decorators responsible for this should decorate [`PaymentRetryHandler`] so that
32
- //! such changes take effect before retrying.
28
+ //! The [`Route`] is compute before each payment attempt. Any updates affecting path finding such as
29
+ //! updates to the network graph or changes to channels scores should be applied prior to retries.
30
+ //! This typically means any [`EventHandler`] decorators responsible for this should decorate
31
+ //! [`PaymentRetryHandler`] so that such changes take effect before retrying.
33
32
34
33
use crate :: Invoice ;
35
34
@@ -41,7 +40,6 @@ use lightning::ln::{PaymentHash, PaymentSecret};
41
40
use lightning:: ln:: channelmanager:: { ChannelDetails , PaymentSendFailure } ;
42
41
use lightning:: ln:: features:: InvoiceFeatures ;
43
42
use lightning:: ln:: msgs:: LightningError ;
44
- use lightning:: routing:: network_graph:: NetworkGraph ;
45
43
use lightning:: routing:: router:: { Route , RouteHint } ;
46
44
use lightning:: util:: events:: { Event , EventHandler } ;
47
45
use lightning:: util:: logger:: Logger ;
@@ -56,11 +54,9 @@ use std::sync::Mutex;
56
54
const MAX_PAYMENT_ATTEMPTS : usize = 3 ;
57
55
58
56
/// A utility for paying [`Invoice]`s.
59
- pub struct InvoicePayer < P : Deref , R , G >
60
- where P :: Target : Payer , R : Router , G : Deref < Target = NetworkGraph > {
57
+ pub struct InvoicePayer < P : Deref , R > where P :: Target : Payer , R : Router {
61
58
payer : P ,
62
59
router : R ,
63
- network_graph : G ,
64
60
invoice_cache : Mutex < HashMap < PaymentHash , Invoice > > ,
65
61
}
66
62
@@ -80,12 +76,11 @@ pub trait Payer {
80
76
81
77
/// A trait defining behavior for routing an [`Invoice`] payment.
82
78
pub trait Router {
83
- /// Finds a [`Route`] between `payer` and `payee` using the provided first and last hops and
84
- /// [`NetworkGraph`] for a payment with the given values.
79
+ /// Finds a [`Route`] between `payer` and `payee` using the provided first and last hops for a
80
+ /// payment with the given values.
85
81
fn find_route (
86
82
& self ,
87
83
payer : & PublicKey ,
88
- network : & NetworkGraph ,
89
84
payee : & PublicKey ,
90
85
payee_features : Option < InvoiceFeatures > ,
91
86
first_hops : Option < & [ & ChannelDetails ] > ,
@@ -107,12 +102,11 @@ pub enum PaymentError {
107
102
}
108
103
109
104
/// An [`EventHandler`] decorator for retrying failed payments.
110
- pub struct PaymentRetryHandler < I , P : Deref , R , G , L : Deref , E >
105
+ pub struct PaymentRetryHandler < I , P : Deref , R , L : Deref , E >
111
106
where
112
- I : Deref < Target = InvoicePayer < P , R , G > > ,
107
+ I : Deref < Target = InvoicePayer < P , R > > ,
113
108
P :: Target : Payer ,
114
109
R : Router ,
115
- G : Deref < Target = NetworkGraph > ,
116
110
L :: Target : Logger ,
117
111
E : EventHandler ,
118
112
{
@@ -122,14 +116,12 @@ where
122
116
event_handler : E ,
123
117
}
124
118
125
- impl < P : Deref , R , G > InvoicePayer < P , R , G >
126
- where P :: Target : Payer , R : Router , G : Deref < Target = NetworkGraph > {
119
+ impl < P : Deref , R > InvoicePayer < P , R > where P :: Target : Payer , R : Router {
127
120
/// Creates an invoice payer.
128
- pub fn new ( payer : P , router : R , network_graph : G ) -> Self {
121
+ pub fn new ( payer : P , router : R ) -> Self {
129
122
Self {
130
123
payer,
131
124
router,
132
- network_graph,
133
125
invoice_cache : Mutex :: new ( HashMap :: new ( ) ) ,
134
126
}
135
127
}
@@ -167,7 +159,6 @@ where P::Target: Payer, R: Router, G: Deref<Target = NetworkGraph> {
167
159
let final_cltv = invoice. min_final_cltv_expiry ( ) as u32 ;
168
160
let route = self . router . find_route (
169
161
& payer,
170
- & * self . network_graph ,
171
162
& payee,
172
163
payee_features,
173
164
Some ( & first_hops. iter ( ) . collect :: < Vec < _ > > ( ) ) ,
@@ -191,12 +182,11 @@ where P::Target: Payer, R: Router, G: Deref<Target = NetworkGraph> {
191
182
}
192
183
}
193
184
194
- impl < I , P : Deref , R , G , L : Deref , E > PaymentRetryHandler < I , P , R , G , L , E >
185
+ impl < I , P : Deref , R , L : Deref , E > PaymentRetryHandler < I , P , R , L , E >
195
186
where
196
- I : Deref < Target = InvoicePayer < P , R , G > > ,
187
+ I : Deref < Target = InvoicePayer < P , R > > ,
197
188
P :: Target : Payer ,
198
189
R : Router ,
199
- G : Deref < Target = NetworkGraph > ,
200
190
L :: Target : Logger ,
201
191
E : EventHandler ,
202
192
{
@@ -211,12 +201,11 @@ where
211
201
}
212
202
}
213
203
214
- impl < I , P : Deref , R , G , L : Deref , E > EventHandler for PaymentRetryHandler < I , P , R , G , L , E >
204
+ impl < I , P : Deref , R , L : Deref , E > EventHandler for PaymentRetryHandler < I , P , R , L , E >
215
205
where
216
- I : Deref < Target = InvoicePayer < P , R , G > > ,
206
+ I : Deref < Target = InvoicePayer < P , R > > ,
217
207
P :: Target : Payer ,
218
208
R : Router ,
219
- G : Deref < Target = NetworkGraph > ,
220
209
L :: Target : Logger ,
221
210
E : EventHandler ,
222
211
{
@@ -270,12 +259,9 @@ mod tests {
270
259
271
260
use super :: * ;
272
261
use crate :: { InvoiceBuilder , Currency } ;
273
- use bitcoin:: network:: constants:: Network ;
274
- use bitcoin:: blockdata:: constants:: genesis_block;
275
262
use bitcoin:: secp256k1:: { SecretKey , PublicKey , Secp256k1 } ;
276
263
use lightning:: ln:: PaymentPreimage ;
277
264
use lightning:: ln:: msgs:: { ErrorAction , LightningError } ;
278
- use lightning:: routing:: network_graph:: NetworkGraph ;
279
265
use lightning:: util:: test_utils:: TestLogger ;
280
266
use lightning:: util:: events:: Event ;
281
267
use lightning:: util:: errors:: APIError ;
@@ -300,8 +286,7 @@ mod tests {
300
286
fn pays_invoice_on_first_attempt ( ) {
301
287
let payer = TestPayer :: new ( ) ;
302
288
let router = NullRouter { } ;
303
- let network_graph = NetworkGraph :: new ( genesis_block ( Network :: Testnet ) . header . block_hash ( ) ) ;
304
- let invoice_payer = InvoicePayer :: new ( & payer, router, & network_graph) ;
289
+ let invoice_payer = InvoicePayer :: new ( & payer, router) ;
305
290
306
291
let logger = TestLogger :: new ( ) ;
307
292
let event_handled = core:: cell:: RefCell :: new ( false ) ;
@@ -322,8 +307,7 @@ mod tests {
322
307
fn pays_invoice_on_retry ( ) {
323
308
let payer = TestPayer :: new ( ) ;
324
309
let router = NullRouter { } ;
325
- let network_graph = NetworkGraph :: new ( genesis_block ( Network :: Testnet ) . header . block_hash ( ) ) ;
326
- let invoice_payer = InvoicePayer :: new ( & payer, router, & network_graph) ;
310
+ let invoice_payer = InvoicePayer :: new ( & payer, router) ;
327
311
328
312
let logger = TestLogger :: new ( ) ;
329
313
let event_handled = core:: cell:: RefCell :: new ( false ) ;
@@ -349,8 +333,7 @@ mod tests {
349
333
fn fails_paying_invoice_after_max_retries ( ) {
350
334
let payer = TestPayer :: new ( ) ;
351
335
let router = NullRouter { } ;
352
- let network_graph = NetworkGraph :: new ( genesis_block ( Network :: Testnet ) . header . block_hash ( ) ) ;
353
- let invoice_payer = InvoicePayer :: new ( & payer, router, & network_graph) ;
336
+ let invoice_payer = InvoicePayer :: new ( & payer, router) ;
354
337
355
338
let logger = TestLogger :: new ( ) ;
356
339
let event_handled = core:: cell:: RefCell :: new ( false ) ;
@@ -380,8 +363,7 @@ mod tests {
380
363
fn fails_paying_invoice_after_retry_error ( ) {
381
364
let payer = TestPayer :: new ( ) . fails_on_attempt ( 2 ) ;
382
365
let router = NullRouter { } ;
383
- let network_graph = NetworkGraph :: new ( genesis_block ( Network :: Testnet ) . header . block_hash ( ) ) ;
384
- let invoice_payer = InvoicePayer :: new ( & payer, router, & network_graph) ;
366
+ let invoice_payer = InvoicePayer :: new ( & payer, router) ;
385
367
386
368
let logger = TestLogger :: new ( ) ;
387
369
let event_handled = core:: cell:: RefCell :: new ( false ) ;
@@ -403,8 +385,7 @@ mod tests {
403
385
fn fails_paying_invoice_after_rejected_by_payee ( ) {
404
386
let payer = TestPayer :: new ( ) ;
405
387
let router = NullRouter { } ;
406
- let network_graph = NetworkGraph :: new ( genesis_block ( Network :: Testnet ) . header . block_hash ( ) ) ;
407
- let invoice_payer = InvoicePayer :: new ( & payer, router, & network_graph) ;
388
+ let invoice_payer = InvoicePayer :: new ( & payer, router) ;
408
389
409
390
let logger = TestLogger :: new ( ) ;
410
391
let event_handled = core:: cell:: RefCell :: new ( false ) ;
@@ -426,8 +407,7 @@ mod tests {
426
407
fn fails_repaying_invoice_with_pending_payment ( ) {
427
408
let payer = TestPayer :: new ( ) ;
428
409
let router = NullRouter { } ;
429
- let network_graph = NetworkGraph :: new ( genesis_block ( Network :: Testnet ) . header . block_hash ( ) ) ;
430
- let invoice_payer = InvoicePayer :: new ( & payer, router, & network_graph) ;
410
+ let invoice_payer = InvoicePayer :: new ( & payer, router) ;
431
411
432
412
let logger = TestLogger :: new ( ) ;
433
413
let event_handled = core:: cell:: RefCell :: new ( false ) ;
@@ -460,8 +440,7 @@ mod tests {
460
440
fn fails_paying_invoice_with_routing_errors ( ) {
461
441
let payer = TestPayer :: new ( ) ;
462
442
let router = FailingRouter { } ;
463
- let network_graph = NetworkGraph :: new ( genesis_block ( Network :: Testnet ) . header . block_hash ( ) ) ;
464
- let invoice_payer = InvoicePayer :: new ( & payer, router, & network_graph) ;
443
+ let invoice_payer = InvoicePayer :: new ( & payer, router) ;
465
444
466
445
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
467
446
let invoice = invoice ( payment_preimage) ;
@@ -476,8 +455,7 @@ mod tests {
476
455
fn fails_paying_invoice_with_sending_errors ( ) {
477
456
let payer = TestPayer :: new ( ) . fails_on_attempt ( 1 ) ;
478
457
let router = NullRouter { } ;
479
- let network_graph = NetworkGraph :: new ( genesis_block ( Network :: Testnet ) . header . block_hash ( ) ) ;
480
- let invoice_payer = InvoicePayer :: new ( & payer, router, & network_graph) ;
458
+ let invoice_payer = InvoicePayer :: new ( & payer, router) ;
481
459
482
460
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
483
461
let invoice = invoice ( payment_preimage) ;
@@ -494,7 +472,6 @@ mod tests {
494
472
fn find_route (
495
473
& self ,
496
474
_payer : & PublicKey ,
497
- _network : & NetworkGraph ,
498
475
_payee : & PublicKey ,
499
476
_payee_features : Option < InvoiceFeatures > ,
500
477
_first_hops : Option < & [ & ChannelDetails ] > ,
@@ -512,7 +489,6 @@ mod tests {
512
489
fn find_route (
513
490
& self ,
514
491
_payer : & PublicKey ,
515
- _network : & NetworkGraph ,
516
492
_payee : & PublicKey ,
517
493
_payee_features : Option < InvoiceFeatures > ,
518
494
_first_hops : Option < & [ & ChannelDetails ] > ,
0 commit comments