@@ -49,7 +49,7 @@ use lightning::util::logger::Logger;
49
49
use std:: cell:: RefCell ;
50
50
use std:: collections:: hash_map:: { self , HashMap } ;
51
51
use std:: ops:: Deref ;
52
- use std:: sync:: { Arc , Mutex } ;
52
+ use std:: sync:: Mutex ;
53
53
54
54
/// The maximum number of payment attempts before forwarding the [`Event::PaymentFailed`] to be
55
55
/// handled.
@@ -107,40 +107,31 @@ pub enum PaymentError {
107
107
}
108
108
109
109
/// An [`EventHandler`] decorator for retrying failed payments.
110
- pub struct PaymentRetryHandler < P : Deref , R , G , L : Deref , E >
110
+ pub struct PaymentRetryHandler < I , P : Deref , R , G , L : Deref , E >
111
111
where
112
+ I : Deref < Target = InvoicePayer < P , R , G > > ,
112
113
P :: Target : Payer ,
113
114
R : Router ,
114
115
G : Deref < Target = NetworkGraph > ,
115
116
L :: Target : Logger ,
116
117
E : EventHandler ,
117
118
{
118
- invoice_payer : Arc < InvoicePayer < P , R , G > > ,
119
+ invoice_payer : I ,
119
120
payment_attempts : RefCell < HashMap < PaymentHash , usize > > ,
120
121
logger : L ,
121
122
event_handler : E ,
122
123
}
123
124
124
125
impl < P : Deref , R , G > InvoicePayer < P , R , G >
125
126
where P :: Target : Payer , R : Router , G : Deref < Target = NetworkGraph > {
126
- /// Creates a payer and a connected retry handler.
127
- pub fn new < L : Deref , E : EventHandler > (
128
- payer : P , router : R , network_graph : G , logger : L , event_handler : E
129
- ) -> ( Arc < Self > , PaymentRetryHandler < P , R , G , L , E > )
130
- where L :: Target : Logger {
131
- let invoice_payer = Arc :: new ( Self {
127
+ /// Creates an invoice payer.
128
+ pub fn new ( payer : P , router : R , network_graph : G ) -> Self {
129
+ Self {
132
130
payer,
133
131
router,
134
132
network_graph,
135
133
invoice_cache : Mutex :: new ( HashMap :: new ( ) ) ,
136
- } ) ;
137
- let retry_handler = PaymentRetryHandler {
138
- invoice_payer : Arc :: clone ( & invoice_payer) ,
139
- payment_attempts : RefCell :: new ( HashMap :: new ( ) ) ,
140
- logger,
141
- event_handler,
142
- } ;
143
- ( invoice_payer, retry_handler)
134
+ }
144
135
}
145
136
146
137
/// Pays the given [`Invoice`], caching it for later use if a retry is needed.
@@ -200,8 +191,35 @@ where P::Target: Payer, R: Router, G: Deref<Target = NetworkGraph> {
200
191
}
201
192
}
202
193
203
- impl < P : Deref , R , G , L : Deref + Clone , E > EventHandler for PaymentRetryHandler < P , R , G , L , E >
204
- where P :: Target : Payer , R : Router , G : Deref < Target = NetworkGraph > , L :: Target : Logger , E : EventHandler {
194
+ impl < I , P : Deref , R , G , L : Deref , E > PaymentRetryHandler < I , P , R , G , L , E >
195
+ where
196
+ I : Deref < Target = InvoicePayer < P , R , G > > ,
197
+ P :: Target : Payer ,
198
+ R : Router ,
199
+ G : Deref < Target = NetworkGraph > ,
200
+ L :: Target : Logger ,
201
+ E : EventHandler ,
202
+ {
203
+ /// Creates a payment retry handler.
204
+ pub fn new ( invoice_payer : I , logger : L , event_handler : E ) -> Self {
205
+ Self {
206
+ invoice_payer,
207
+ payment_attempts : RefCell :: new ( HashMap :: new ( ) ) ,
208
+ logger,
209
+ event_handler,
210
+ }
211
+ }
212
+ }
213
+
214
+ impl < I , P : Deref , R , G , L : Deref , E > EventHandler for PaymentRetryHandler < I , P , R , G , L , E >
215
+ where
216
+ I : Deref < Target = InvoicePayer < P , R , G > > ,
217
+ P :: Target : Payer ,
218
+ R : Router ,
219
+ G : Deref < Target = NetworkGraph > ,
220
+ L :: Target : Logger ,
221
+ E : EventHandler ,
222
+ {
205
223
fn handle_event ( & self , event : & Event ) {
206
224
match event {
207
225
Event :: PaymentFailed { payment_hash, rejected_by_dest, .. } => {
@@ -279,16 +297,15 @@ mod tests {
279
297
280
298
#[ test]
281
299
fn pays_invoice_on_first_attempt ( ) {
282
- let event_handled = core:: cell:: RefCell :: new ( false ) ;
283
- let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
284
-
285
- let genesis_hash = genesis_block ( Network :: Testnet ) . header . block_hash ( ) ;
286
- let network_graph = NetworkGraph :: new ( genesis_hash) ;
287
- let logger = TestLogger :: new ( ) ;
288
300
let payer = TestPayer :: new ( ) ;
289
301
let router = NullRouter { } ;
290
- let ( invoice_payer, retry_handler) =
291
- InvoicePayer :: new ( & payer, router, & network_graph, & logger, event_handler) ;
302
+ let network_graph = NetworkGraph :: new ( genesis_block ( Network :: Testnet ) . header . block_hash ( ) ) ;
303
+ let invoice_payer = InvoicePayer :: new ( & payer, router, & network_graph) ;
304
+
305
+ let logger = TestLogger :: new ( ) ;
306
+ let event_handled = core:: cell:: RefCell :: new ( false ) ;
307
+ let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
308
+ let retry_handler = PaymentRetryHandler :: new ( & invoice_payer, & logger, event_handler) ;
292
309
293
310
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
294
311
let invoice = invoice ( payment_preimage) ;
@@ -302,16 +319,15 @@ mod tests {
302
319
303
320
#[ test]
304
321
fn pays_invoice_on_retry ( ) {
305
- let event_handled = core:: cell:: RefCell :: new ( false ) ;
306
- let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
307
-
308
- let genesis_hash = genesis_block ( Network :: Testnet ) . header . block_hash ( ) ;
309
- let network_graph = NetworkGraph :: new ( genesis_hash) ;
310
- let logger = TestLogger :: new ( ) ;
311
322
let payer = TestPayer :: new ( ) ;
312
323
let router = NullRouter { } ;
313
- let ( invoice_payer, retry_handler) =
314
- InvoicePayer :: new ( & payer, router, & network_graph, & logger, event_handler) ;
324
+ let network_graph = NetworkGraph :: new ( genesis_block ( Network :: Testnet ) . header . block_hash ( ) ) ;
325
+ let invoice_payer = InvoicePayer :: new ( & payer, router, & network_graph) ;
326
+
327
+ let logger = TestLogger :: new ( ) ;
328
+ let event_handled = core:: cell:: RefCell :: new ( false ) ;
329
+ let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
330
+ let retry_handler = PaymentRetryHandler :: new ( & invoice_payer, & logger, event_handler) ;
315
331
316
332
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
317
333
let invoice = invoice ( payment_preimage) ;
@@ -330,16 +346,15 @@ mod tests {
330
346
331
347
#[ test]
332
348
fn fails_paying_invoice_after_max_retries ( ) {
333
- let event_handled = core:: cell:: RefCell :: new ( false ) ;
334
- let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
335
-
336
- let genesis_hash = genesis_block ( Network :: Testnet ) . header . block_hash ( ) ;
337
- let network_graph = NetworkGraph :: new ( genesis_hash) ;
338
- let logger = TestLogger :: new ( ) ;
339
349
let payer = TestPayer :: new ( ) ;
340
350
let router = NullRouter { } ;
341
- let ( invoice_payer, retry_handler) =
342
- InvoicePayer :: new ( & payer, router, & network_graph, & logger, event_handler) ;
351
+ let network_graph = NetworkGraph :: new ( genesis_block ( Network :: Testnet ) . header . block_hash ( ) ) ;
352
+ let invoice_payer = InvoicePayer :: new ( & payer, router, & network_graph) ;
353
+
354
+ let logger = TestLogger :: new ( ) ;
355
+ let event_handled = core:: cell:: RefCell :: new ( false ) ;
356
+ let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
357
+ let retry_handler = PaymentRetryHandler :: new ( & invoice_payer, & logger, event_handler) ;
343
358
344
359
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
345
360
let invoice = invoice ( payment_preimage) ;
@@ -362,16 +377,15 @@ mod tests {
362
377
363
378
#[ test]
364
379
fn fails_paying_invoice_after_retry_error ( ) {
365
- let event_handled = core:: cell:: RefCell :: new ( false ) ;
366
- let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
367
-
368
- let genesis_hash = genesis_block ( Network :: Testnet ) . header . block_hash ( ) ;
369
- let network_graph = NetworkGraph :: new ( genesis_hash) ;
370
- let logger = TestLogger :: new ( ) ;
371
380
let payer = TestPayer :: new ( ) . fails_on_attempt ( 2 ) ;
372
381
let router = NullRouter { } ;
373
- let ( invoice_payer, retry_handler) =
374
- InvoicePayer :: new ( & payer, router, & network_graph, & logger, event_handler) ;
382
+ let network_graph = NetworkGraph :: new ( genesis_block ( Network :: Testnet ) . header . block_hash ( ) ) ;
383
+ let invoice_payer = InvoicePayer :: new ( & payer, router, & network_graph) ;
384
+
385
+ let logger = TestLogger :: new ( ) ;
386
+ let event_handled = core:: cell:: RefCell :: new ( false ) ;
387
+ let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
388
+ let retry_handler = PaymentRetryHandler :: new ( & invoice_payer, & logger, event_handler) ;
375
389
376
390
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
377
391
let invoice = invoice ( payment_preimage) ;
@@ -386,16 +400,15 @@ mod tests {
386
400
387
401
#[ test]
388
402
fn fails_paying_invoice_after_rejected_by_payee ( ) {
389
- let event_handled = core:: cell:: RefCell :: new ( false ) ;
390
- let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
391
-
392
- let genesis_hash = genesis_block ( Network :: Testnet ) . header . block_hash ( ) ;
393
- let network_graph = NetworkGraph :: new ( genesis_hash) ;
394
- let logger = TestLogger :: new ( ) ;
395
403
let payer = TestPayer :: new ( ) ;
396
404
let router = NullRouter { } ;
397
- let ( invoice_payer, retry_handler) =
398
- InvoicePayer :: new ( & payer, router, & network_graph, & logger, event_handler) ;
405
+ let network_graph = NetworkGraph :: new ( genesis_block ( Network :: Testnet ) . header . block_hash ( ) ) ;
406
+ let invoice_payer = InvoicePayer :: new ( & payer, router, & network_graph) ;
407
+
408
+ let logger = TestLogger :: new ( ) ;
409
+ let event_handled = core:: cell:: RefCell :: new ( false ) ;
410
+ let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
411
+ let retry_handler = PaymentRetryHandler :: new ( & invoice_payer, & logger, event_handler) ;
399
412
400
413
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
401
414
let invoice = invoice ( payment_preimage) ;
@@ -410,16 +423,15 @@ mod tests {
410
423
411
424
#[ test]
412
425
fn fails_repaying_invoice_with_pending_payment ( ) {
413
- let event_handled = core:: cell:: RefCell :: new ( false ) ;
414
- let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
415
-
416
- let genesis_hash = genesis_block ( Network :: Testnet ) . header . block_hash ( ) ;
417
- let network_graph = NetworkGraph :: new ( genesis_hash) ;
418
- let logger = TestLogger :: new ( ) ;
419
426
let payer = TestPayer :: new ( ) ;
420
427
let router = NullRouter { } ;
421
- let ( invoice_payer, retry_handler) =
422
- InvoicePayer :: new ( & payer, router, & network_graph, & logger, event_handler) ;
428
+ let network_graph = NetworkGraph :: new ( genesis_block ( Network :: Testnet ) . header . block_hash ( ) ) ;
429
+ let invoice_payer = InvoicePayer :: new ( & payer, router, & network_graph) ;
430
+
431
+ let logger = TestLogger :: new ( ) ;
432
+ let event_handled = core:: cell:: RefCell :: new ( false ) ;
433
+ let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
434
+ let retry_handler = PaymentRetryHandler :: new ( & invoice_payer, & logger, event_handler) ;
423
435
424
436
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
425
437
let invoice = invoice ( payment_preimage) ;
@@ -445,15 +457,10 @@ mod tests {
445
457
446
458
#[ test]
447
459
fn fails_paying_invoice_with_routing_errors ( ) {
448
- let event_handler = |_: & _ | { } ;
449
-
450
- let genesis_hash = genesis_block ( Network :: Testnet ) . header . block_hash ( ) ;
451
- let network_graph = NetworkGraph :: new ( genesis_hash) ;
452
- let logger = TestLogger :: new ( ) ;
453
460
let payer = TestPayer :: new ( ) ;
454
461
let router = FailingRouter { } ;
455
- let ( invoice_payer , _ ) =
456
- InvoicePayer :: new ( & payer, router, & network_graph, & logger , event_handler ) ;
462
+ let network_graph = NetworkGraph :: new ( genesis_block ( Network :: Testnet ) . header . block_hash ( ) ) ;
463
+ let invoice_payer = InvoicePayer :: new ( & payer, router, & network_graph) ;
457
464
458
465
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
459
466
let invoice = invoice ( payment_preimage) ;
@@ -466,15 +473,10 @@ mod tests {
466
473
467
474
#[ test]
468
475
fn fails_paying_invoice_with_sending_errors ( ) {
469
- let event_handler = |_: & _ | { } ;
470
-
471
- let genesis_hash = genesis_block ( Network :: Testnet ) . header . block_hash ( ) ;
472
- let network_graph = NetworkGraph :: new ( genesis_hash) ;
473
- let logger = TestLogger :: new ( ) ;
474
476
let payer = TestPayer :: new ( ) . fails_on_attempt ( 1 ) ;
475
477
let router = NullRouter { } ;
476
- let ( invoice_payer , _ ) =
477
- InvoicePayer :: new ( & payer, router, & network_graph, & logger , event_handler ) ;
478
+ let network_graph = NetworkGraph :: new ( genesis_block ( Network :: Testnet ) . header . block_hash ( ) ) ;
479
+ let invoice_payer = InvoicePayer :: new ( & payer, router, & network_graph) ;
478
480
479
481
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
480
482
let invoice = invoice ( payment_preimage) ;
0 commit comments