30
30
//! # use lightning::ln::{PaymentHash, PaymentSecret};
31
31
//! # use lightning::ln::channelmanager::{ChannelDetails, PaymentId, PaymentSendFailure};
32
32
//! # use lightning::ln::msgs::LightningError;
33
+ //! # use lightning::routing;
34
+ //! # use lightning::routing::network_graph::NodeId;
33
35
//! # use lightning::routing::router::{Route, RouteParameters};
34
36
//! # use lightning::util::events::{Event, EventHandler, EventsProvider};
35
37
//! # use lightning::util::logger::{Logger, Record};
57
59
//! #
58
60
//! # struct FakeRouter {};
59
61
//! # impl Router for FakeRouter {
60
- //! # fn find_route(
62
+ //! # fn find_route<S: routing::Score> (
61
63
//! # &self, payer: &PublicKey, params: &RouteParameters,
62
- //! # first_hops: Option<&[&ChannelDetails]>
64
+ //! # first_hops: Option<&[&ChannelDetails]>, scorer: &S
63
65
//! # ) -> Result<Route, LightningError> { unimplemented!() }
64
66
//! # }
65
67
//! #
68
+ //! # struct FakeScorer {};
69
+ //! # impl routing::Score for FakeScorer {
70
+ //! # fn channel_penalty_msat(
71
+ //! # &self, _short_channel_id: u64, _source: &NodeId, _target: &NodeId
72
+ //! # ) -> u64 { 0 }
73
+ //! # }
74
+ //! #
66
75
//! # struct FakeLogger {};
67
76
//! # impl Logger for FakeLogger {
68
77
//! # fn log(&self, record: &Record) { unimplemented!() }
78
87
//! };
79
88
//! # let payer = FakePayer {};
80
89
//! # let router = FakeRouter {};
90
+ //! # let scorer = FakeScorer {};
81
91
//! # let logger = FakeLogger {};
82
- //! let invoice_payer = InvoicePayer::new(&payer, router, &logger, event_handler, RetryAttempts(2));
92
+ //! let invoice_payer = InvoicePayer::new(&payer, router, scorer, &logger, event_handler, RetryAttempts(2));
83
93
//!
84
94
//! let invoice = "...";
85
95
//! let invoice = invoice.parse::<Invoice>().unwrap();
@@ -105,6 +115,7 @@ use bitcoin_hashes::Hash;
105
115
use lightning:: ln:: { PaymentHash , PaymentSecret } ;
106
116
use lightning:: ln:: channelmanager:: { ChannelDetails , PaymentId , PaymentSendFailure } ;
107
117
use lightning:: ln:: msgs:: LightningError ;
118
+ use lightning:: routing;
108
119
use lightning:: routing:: router:: { Payee , Route , RouteParameters } ;
109
120
use lightning:: util:: events:: { Event , EventHandler } ;
110
121
use lightning:: util:: logger:: Logger ;
@@ -117,15 +128,17 @@ use std::sync::Mutex;
117
128
use std:: time:: { Duration , SystemTime } ;
118
129
119
130
/// A utility for paying [`Invoice]`s.
120
- pub struct InvoicePayer < P : Deref , R , L : Deref , E >
131
+ pub struct InvoicePayer < P : Deref , R , S , L : Deref , E >
121
132
where
122
133
P :: Target : Payer ,
123
134
R : Router ,
135
+ S : routing:: Score ,
124
136
L :: Target : Logger ,
125
137
E : EventHandler ,
126
138
{
127
139
payer : P ,
128
140
router : R ,
141
+ scorer : S ,
129
142
logger : L ,
130
143
event_handler : E ,
131
144
payment_cache : Mutex < HashMap < PaymentHash , usize > > ,
@@ -152,8 +165,9 @@ pub trait Payer {
152
165
/// A trait defining behavior for routing an [`Invoice`] payment.
153
166
pub trait Router {
154
167
/// Finds a [`Route`] between `payer` and `payee` for a payment with the given values.
155
- fn find_route (
156
- & self , payer : & PublicKey , params : & RouteParameters , first_hops : Option < & [ & ChannelDetails ] >
168
+ fn find_route < S : routing:: Score > (
169
+ & self , payer : & PublicKey , params : & RouteParameters , first_hops : Option < & [ & ChannelDetails ] > ,
170
+ scorer : & S
157
171
) -> Result < Route , LightningError > ;
158
172
}
159
173
@@ -172,10 +186,11 @@ pub enum PaymentError {
172
186
Sending ( PaymentSendFailure ) ,
173
187
}
174
188
175
- impl < P : Deref , R , L : Deref , E > InvoicePayer < P , R , L , E >
189
+ impl < P : Deref , R , S , L : Deref , E > InvoicePayer < P , R , S , L , E >
176
190
where
177
191
P :: Target : Payer ,
178
192
R : Router ,
193
+ S : routing:: Score ,
179
194
L :: Target : Logger ,
180
195
E : EventHandler ,
181
196
{
@@ -184,11 +199,12 @@ where
184
199
/// Will forward any [`Event::PaymentPathFailed`] events to the decorated `event_handler` once
185
200
/// `retry_attempts` has been exceeded for a given [`Invoice`].
186
201
pub fn new (
187
- payer : P , router : R , logger : L , event_handler : E , retry_attempts : RetryAttempts
202
+ payer : P , router : R , scorer : S , logger : L , event_handler : E , retry_attempts : RetryAttempts
188
203
) -> Self {
189
204
Self {
190
205
payer,
191
206
router,
207
+ scorer,
192
208
logger,
193
209
event_handler,
194
210
payment_cache : Mutex :: new ( HashMap :: new ( ) ) ,
@@ -242,6 +258,7 @@ where
242
258
& payer,
243
259
& params,
244
260
Some ( & first_hops. iter ( ) . collect :: < Vec < _ > > ( ) ) ,
261
+ & self . scorer ,
245
262
) . map_err ( |e| PaymentError :: Routing ( e) ) ?;
246
263
247
264
let payment_hash = PaymentHash ( invoice. payment_hash ( ) . clone ( ) . into_inner ( ) ) ;
@@ -261,7 +278,7 @@ where
261
278
let payer = self . payer . node_id ( ) ;
262
279
let first_hops = self . payer . first_hops ( ) ;
263
280
let route = self . router . find_route (
264
- & payer, & params, Some ( & first_hops. iter ( ) . collect :: < Vec < _ > > ( ) )
281
+ & payer, & params, Some ( & first_hops. iter ( ) . collect :: < Vec < _ > > ( ) ) , & self . scorer
265
282
) . map_err ( |e| PaymentError :: Routing ( e) ) ?;
266
283
self . payer . retry_payment ( & route, payment_id) . map_err ( |e| PaymentError :: Sending ( e) )
267
284
}
@@ -284,10 +301,11 @@ fn has_expired(params: &RouteParameters) -> bool {
284
301
Invoice :: is_expired_from_epoch ( & SystemTime :: UNIX_EPOCH , expiry_time)
285
302
}
286
303
287
- impl < P : Deref , R , L : Deref , E > EventHandler for InvoicePayer < P , R , L , E >
304
+ impl < P : Deref , R , S , L : Deref , E > EventHandler for InvoicePayer < P , R , S , L , E >
288
305
where
289
306
P :: Target : Payer ,
290
307
R : Router ,
308
+ S : routing:: Score ,
291
309
L :: Target : Logger ,
292
310
E : EventHandler ,
293
311
{
@@ -354,7 +372,8 @@ mod tests {
354
372
use lightning:: ln:: PaymentPreimage ;
355
373
use lightning:: ln:: features:: { ChannelFeatures , NodeFeatures } ;
356
374
use lightning:: ln:: msgs:: { ErrorAction , LightningError } ;
357
- use lightning:: routing:: router:: { Route , RouteHop } ;
375
+ use lightning:: routing:: network_graph:: NodeId ;
376
+ use lightning:: routing:: router:: { Payee , Route , RouteHop } ;
358
377
use lightning:: util:: test_utils:: TestLogger ;
359
378
use lightning:: util:: errors:: APIError ;
360
379
use lightning:: util:: events:: Event ;
@@ -422,9 +441,10 @@ mod tests {
422
441
423
442
let payer = TestPayer :: new ( ) ;
424
443
let router = TestRouter { } ;
444
+ let scorer = TestScorer :: new ( ) ;
425
445
let logger = TestLogger :: new ( ) ;
426
446
let invoice_payer =
427
- InvoicePayer :: new ( & payer, router, & logger, event_handler, RetryAttempts ( 0 ) ) ;
447
+ InvoicePayer :: new ( & payer, router, scorer , & logger, event_handler, RetryAttempts ( 0 ) ) ;
428
448
429
449
let payment_id = Some ( invoice_payer. pay_invoice ( & invoice) . unwrap ( ) ) ;
430
450
assert_eq ! ( * payer. attempts. borrow( ) , 1 ) ;
@@ -450,9 +470,10 @@ mod tests {
450
470
. expect_value_msat ( final_value_msat)
451
471
. expect_value_msat ( final_value_msat / 2 ) ;
452
472
let router = TestRouter { } ;
473
+ let scorer = TestScorer :: new ( ) ;
453
474
let logger = TestLogger :: new ( ) ;
454
475
let invoice_payer =
455
- InvoicePayer :: new ( & payer, router, & logger, event_handler, RetryAttempts ( 2 ) ) ;
476
+ InvoicePayer :: new ( & payer, router, scorer , & logger, event_handler, RetryAttempts ( 2 ) ) ;
456
477
457
478
let payment_id = Some ( invoice_payer. pay_invoice ( & invoice) . unwrap ( ) ) ;
458
479
assert_eq ! ( * payer. attempts. borrow( ) , 1 ) ;
@@ -490,9 +511,10 @@ mod tests {
490
511
491
512
let payer = TestPayer :: new ( ) ;
492
513
let router = TestRouter { } ;
514
+ let scorer = TestScorer :: new ( ) ;
493
515
let logger = TestLogger :: new ( ) ;
494
516
let invoice_payer =
495
- InvoicePayer :: new ( & payer, router, & logger, event_handler, RetryAttempts ( 2 ) ) ;
517
+ InvoicePayer :: new ( & payer, router, scorer , & logger, event_handler, RetryAttempts ( 2 ) ) ;
496
518
497
519
let payment_id = Some ( PaymentId ( [ 1 ; 32 ] ) ) ;
498
520
let event = Event :: PaymentPathFailed {
@@ -534,9 +556,10 @@ mod tests {
534
556
. expect_value_msat ( final_value_msat / 2 )
535
557
. expect_value_msat ( final_value_msat / 2 ) ;
536
558
let router = TestRouter { } ;
559
+ let scorer = TestScorer :: new ( ) ;
537
560
let logger = TestLogger :: new ( ) ;
538
561
let invoice_payer =
539
- InvoicePayer :: new ( & payer, router, & logger, event_handler, RetryAttempts ( 2 ) ) ;
562
+ InvoicePayer :: new ( & payer, router, scorer , & logger, event_handler, RetryAttempts ( 2 ) ) ;
540
563
541
564
let payment_id = Some ( invoice_payer. pay_invoice ( & invoice) . unwrap ( ) ) ;
542
565
assert_eq ! ( * payer. attempts. borrow( ) , 1 ) ;
@@ -583,9 +606,10 @@ mod tests {
583
606
584
607
let payer = TestPayer :: new ( ) ;
585
608
let router = TestRouter { } ;
609
+ let scorer = TestScorer :: new ( ) ;
586
610
let logger = TestLogger :: new ( ) ;
587
611
let invoice_payer =
588
- InvoicePayer :: new ( & payer, router, & logger, event_handler, RetryAttempts ( 2 ) ) ;
612
+ InvoicePayer :: new ( & payer, router, scorer , & logger, event_handler, RetryAttempts ( 2 ) ) ;
589
613
590
614
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
591
615
let invoice = invoice ( payment_preimage) ;
@@ -614,9 +638,10 @@ mod tests {
614
638
615
639
let payer = TestPayer :: new ( ) ;
616
640
let router = TestRouter { } ;
641
+ let scorer = TestScorer :: new ( ) ;
617
642
let logger = TestLogger :: new ( ) ;
618
643
let invoice_payer =
619
- InvoicePayer :: new ( & payer, router, & logger, event_handler, RetryAttempts ( 2 ) ) ;
644
+ InvoicePayer :: new ( & payer, router, scorer , & logger, event_handler, RetryAttempts ( 2 ) ) ;
620
645
621
646
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
622
647
let invoice = expired_invoice ( payment_preimage) ;
@@ -651,9 +676,10 @@ mod tests {
651
676
. fails_on_attempt ( 2 )
652
677
. expect_value_msat ( final_value_msat) ;
653
678
let router = TestRouter { } ;
679
+ let scorer = TestScorer :: new ( ) ;
654
680
let logger = TestLogger :: new ( ) ;
655
681
let invoice_payer =
656
- InvoicePayer :: new ( & payer, router, & logger, event_handler, RetryAttempts ( 2 ) ) ;
682
+ InvoicePayer :: new ( & payer, router, scorer , & logger, event_handler, RetryAttempts ( 2 ) ) ;
657
683
658
684
let payment_id = Some ( invoice_payer. pay_invoice ( & invoice) . unwrap ( ) ) ;
659
685
assert_eq ! ( * payer. attempts. borrow( ) , 1 ) ;
@@ -680,9 +706,10 @@ mod tests {
680
706
681
707
let payer = TestPayer :: new ( ) ;
682
708
let router = TestRouter { } ;
709
+ let scorer = TestScorer :: new ( ) ;
683
710
let logger = TestLogger :: new ( ) ;
684
711
let invoice_payer =
685
- InvoicePayer :: new ( & payer, router, & logger, event_handler, RetryAttempts ( 2 ) ) ;
712
+ InvoicePayer :: new ( & payer, router, scorer , & logger, event_handler, RetryAttempts ( 2 ) ) ;
686
713
687
714
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
688
715
let invoice = invoice ( payment_preimage) ;
@@ -711,9 +738,10 @@ mod tests {
711
738
712
739
let payer = TestPayer :: new ( ) ;
713
740
let router = TestRouter { } ;
741
+ let scorer = TestScorer :: new ( ) ;
714
742
let logger = TestLogger :: new ( ) ;
715
743
let invoice_payer =
716
- InvoicePayer :: new ( & payer, router, & logger, event_handler, RetryAttempts ( 0 ) ) ;
744
+ InvoicePayer :: new ( & payer, router, scorer , & logger, event_handler, RetryAttempts ( 0 ) ) ;
717
745
718
746
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
719
747
let invoice = invoice ( payment_preimage) ;
@@ -751,9 +779,10 @@ mod tests {
751
779
fn fails_paying_invoice_with_routing_errors ( ) {
752
780
let payer = TestPayer :: new ( ) ;
753
781
let router = FailingRouter { } ;
782
+ let scorer = TestScorer :: new ( ) ;
754
783
let logger = TestLogger :: new ( ) ;
755
784
let invoice_payer =
756
- InvoicePayer :: new ( & payer, router, & logger, |_: & _ | { } , RetryAttempts ( 0 ) ) ;
785
+ InvoicePayer :: new ( & payer, router, scorer , & logger, |_: & _ | { } , RetryAttempts ( 0 ) ) ;
757
786
758
787
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
759
788
let invoice = invoice ( payment_preimage) ;
@@ -768,9 +797,10 @@ mod tests {
768
797
fn fails_paying_invoice_with_sending_errors ( ) {
769
798
let payer = TestPayer :: new ( ) . fails_on_attempt ( 1 ) ;
770
799
let router = TestRouter { } ;
800
+ let scorer = TestScorer :: new ( ) ;
771
801
let logger = TestLogger :: new ( ) ;
772
802
let invoice_payer =
773
- InvoicePayer :: new ( & payer, router, & logger, |_: & _ | { } , RetryAttempts ( 0 ) ) ;
803
+ InvoicePayer :: new ( & payer, router, scorer , & logger, |_: & _ | { } , RetryAttempts ( 0 ) ) ;
774
804
775
805
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
776
806
let invoice = invoice ( payment_preimage) ;
@@ -793,9 +823,10 @@ mod tests {
793
823
794
824
let payer = TestPayer :: new ( ) . expect_value_msat ( final_value_msat) ;
795
825
let router = TestRouter { } ;
826
+ let scorer = TestScorer :: new ( ) ;
796
827
let logger = TestLogger :: new ( ) ;
797
828
let invoice_payer =
798
- InvoicePayer :: new ( & payer, router, & logger, event_handler, RetryAttempts ( 0 ) ) ;
829
+ InvoicePayer :: new ( & payer, router, scorer , & logger, event_handler, RetryAttempts ( 0 ) ) ;
799
830
800
831
let payment_id =
801
832
Some ( invoice_payer. pay_zero_value_invoice ( & invoice, final_value_msat) . unwrap ( ) ) ;
@@ -815,9 +846,10 @@ mod tests {
815
846
816
847
let payer = TestPayer :: new ( ) ;
817
848
let router = TestRouter { } ;
849
+ let scorer = TestScorer :: new ( ) ;
818
850
let logger = TestLogger :: new ( ) ;
819
851
let invoice_payer =
820
- InvoicePayer :: new ( & payer, router, & logger, event_handler, RetryAttempts ( 0 ) ) ;
852
+ InvoicePayer :: new ( & payer, router, scorer , & logger, event_handler, RetryAttempts ( 0 ) ) ;
821
853
822
854
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
823
855
let invoice = invoice ( payment_preimage) ;
@@ -874,11 +906,12 @@ mod tests {
874
906
}
875
907
876
908
impl Router for TestRouter {
877
- fn find_route (
909
+ fn find_route < S : routing :: Score > (
878
910
& self ,
879
911
_payer : & PublicKey ,
880
912
params : & RouteParameters ,
881
913
_first_hops : Option < & [ & ChannelDetails ] > ,
914
+ _scorer : & S ,
882
915
) -> Result < Route , LightningError > {
883
916
Ok ( Route {
884
917
payee : Some ( params. payee . clone ( ) ) , ..Self :: route_for_value ( params. final_value_msat )
@@ -889,16 +922,29 @@ mod tests {
889
922
struct FailingRouter ;
890
923
891
924
impl Router for FailingRouter {
892
- fn find_route (
925
+ fn find_route < S : routing :: Score > (
893
926
& self ,
894
927
_payer : & PublicKey ,
895
928
_params : & RouteParameters ,
896
929
_first_hops : Option < & [ & ChannelDetails ] > ,
930
+ _scorer : & S ,
897
931
) -> Result < Route , LightningError > {
898
932
Err ( LightningError { err : String :: new ( ) , action : ErrorAction :: IgnoreError } )
899
933
}
900
934
}
901
935
936
+ struct TestScorer ;
937
+
938
+ impl TestScorer {
939
+ fn new ( ) -> Self { Self { } }
940
+ }
941
+
942
+ impl routing:: Score for TestScorer {
943
+ fn channel_penalty_msat (
944
+ & self , _short_channel_id : u64 , _source : & NodeId , _target : & NodeId
945
+ ) -> u64 { 0 }
946
+ }
947
+
902
948
struct TestPayer {
903
949
expectations : core:: cell:: RefCell < std:: collections:: VecDeque < u64 > > ,
904
950
attempts : core:: cell:: RefCell < usize > ,
0 commit comments