38
38
//! # use lightning::ln::channelmanager::{ChannelDetails, PaymentId, PaymentSendFailure};
39
39
//! # use lightning::ln::msgs::LightningError;
40
40
//! # use lightning::routing::gossip::NodeId;
41
- //! # use lightning::routing::router::{InFlightHtlcs, Route, RouteHop, RouteParameters};
41
+ //! # use lightning::routing::router::{InFlightHtlcs, Route, RouteHop, RouteParameters, Router };
42
42
//! # use lightning::routing::scoring::{ChannelUsage, Score};
43
43
//! # use lightning::util::events::{Event, EventHandler, EventsProvider};
44
44
//! # use lightning::util::logger::{Logger, Record};
45
45
//! # use lightning::util::ser::{Writeable, Writer};
46
46
//! # use lightning_invoice::Invoice;
47
- //! # use lightning_invoice::payment::{InvoicePayer, Payer, Retry, Router };
47
+ //! # use lightning_invoice::payment::{InvoicePayer, Payer, Retry, ScoringRouter };
48
48
//! # use secp256k1::PublicKey;
49
49
//! # use std::cell::RefCell;
50
50
//! # use std::ops::Deref;
76
76
//! # &self, payer: &PublicKey, params: &RouteParameters,
77
77
//! # first_hops: Option<&[&ChannelDetails]>, _inflight_htlcs: InFlightHtlcs
78
78
//! # ) -> Result<Route, LightningError> { unimplemented!() }
79
- //! #
79
+ //! # }
80
+ //! # impl ScoringRouter for FakeRouter {
80
81
//! # fn notify_payment_path_failed(&self, path: &[&RouteHop], short_channel_id: u64) { unimplemented!() }
81
82
//! # fn notify_payment_path_successful(&self, path: &[&RouteHop]) { unimplemented!() }
82
83
//! # fn notify_payment_probe_successful(&self, path: &[&RouteHop]) { unimplemented!() }
@@ -144,7 +145,7 @@ use lightning::ln::{PaymentHash, PaymentPreimage, PaymentSecret};
144
145
use lightning:: ln:: channelmanager:: { ChannelDetails , PaymentId , PaymentSendFailure } ;
145
146
use lightning:: ln:: msgs:: LightningError ;
146
147
use lightning:: routing:: gossip:: NodeId ;
147
- use lightning:: routing:: router:: { InFlightHtlcs , PaymentParameters , Route , RouteHop , RouteParameters } ;
148
+ use lightning:: routing:: router:: { InFlightHtlcs , PaymentParameters , Route , RouteHop , RouteParameters , Router } ;
148
149
use lightning:: util:: errors:: APIError ;
149
150
use lightning:: util:: events:: { Event , EventHandler } ;
150
151
use lightning:: util:: logger:: Logger ;
@@ -175,7 +176,7 @@ use crate::time_utils;
175
176
type ConfiguredTime = time_utils:: Eternity ;
176
177
177
178
/// (C-not exported) generally all users should use the [`InvoicePayer`] type alias.
178
- pub struct InvoicePayerUsingTime < P : Deref , R : Router , L : Deref , E : EventHandler , T : Time >
179
+ pub struct InvoicePayerUsingTime < P : Deref , R : ScoringRouter , L : Deref , E : EventHandler , T : Time >
179
180
where
180
181
P :: Target : Payer ,
181
182
L :: Target : Logger ,
@@ -264,13 +265,20 @@ pub trait Payer {
264
265
fn abandon_payment ( & self , payment_id : PaymentId ) ;
265
266
}
266
267
267
- /// A trait defining behavior for routing an [`Invoice`] payment.
268
- pub trait Router {
269
- /// Finds a [`Route`] between `payer` and `payee` for a payment with the given values.
270
- fn find_route (
268
+ /// A trait defining behavior for a [`Router`] implementation that also supports scoring channels
269
+ /// based on payment and probe success/failure.
270
+ ///
271
+ /// [`Router`]: lightning::routing::router::Router
272
+ pub trait ScoringRouter : Router {
273
+ /// Finds a [`Route`] between `payer` and `payee` for a payment with the given values. Includes
274
+ /// `PaymentHash` and `PaymentId` to be able to correlate the request with a specific payment.
275
+ fn find_route_with_id (
271
276
& self , payer : & PublicKey , route_params : & RouteParameters ,
272
- first_hops : Option < & [ & ChannelDetails ] > , inflight_htlcs : InFlightHtlcs
273
- ) -> Result < Route , LightningError > ;
277
+ first_hops : Option < & [ & ChannelDetails ] > , inflight_htlcs : InFlightHtlcs ,
278
+ _payment_hash : PaymentHash , _payment_id : PaymentId
279
+ ) -> Result < Route , LightningError > {
280
+ self . find_route ( payer, route_params, first_hops, inflight_htlcs)
281
+ }
274
282
/// Lets the router know that payment through a specific path has failed.
275
283
fn notify_payment_path_failed ( & self , path : & [ & RouteHop ] , short_channel_id : u64 ) ;
276
284
/// Lets the router know that payment through a specific path was successful.
@@ -320,7 +328,7 @@ pub enum PaymentError {
320
328
Sending ( PaymentSendFailure ) ,
321
329
}
322
330
323
- impl < P : Deref , R : Router , L : Deref , E : EventHandler , T : Time > InvoicePayerUsingTime < P , R , L , E , T >
331
+ impl < P : Deref , R : ScoringRouter , L : Deref , E : EventHandler , T : Time > InvoicePayerUsingTime < P , R , L , E , T >
324
332
where
325
333
P :: Target : Payer ,
326
334
L :: Target : Logger ,
@@ -654,7 +662,7 @@ fn has_expired(route_params: &RouteParameters) -> bool {
654
662
} else { false }
655
663
}
656
664
657
- impl < P : Deref , R : Router , L : Deref , E : EventHandler , T : Time > EventHandler for InvoicePayerUsingTime < P , R , L , E , T >
665
+ impl < P : Deref , R : ScoringRouter , L : Deref , E : EventHandler , T : Time > EventHandler for InvoicePayerUsingTime < P , R , L , E , T >
658
666
where
659
667
P :: Target : Payer ,
660
668
L :: Target : Logger ,
@@ -740,7 +748,7 @@ mod tests {
740
748
use lightning:: ln:: functional_test_utils:: * ;
741
749
use lightning:: ln:: msgs:: { ChannelMessageHandler , ErrorAction , LightningError } ;
742
750
use lightning:: routing:: gossip:: { EffectiveCapacity , NodeId } ;
743
- use lightning:: routing:: router:: { InFlightHtlcs , PaymentParameters , Route , RouteHop } ;
751
+ use lightning:: routing:: router:: { InFlightHtlcs , PaymentParameters , Route , RouteHop , Router } ;
744
752
use lightning:: routing:: scoring:: { ChannelUsage , LockableScore , Score } ;
745
753
use lightning:: util:: test_utils:: TestLogger ;
746
754
use lightning:: util:: errors:: APIError ;
@@ -1814,7 +1822,9 @@ mod tests {
1814
1822
payment_params : Some ( route_params. payment_params . clone ( ) ) , ..Self :: route_for_value ( route_params. final_value_msat )
1815
1823
} )
1816
1824
}
1825
+ }
1817
1826
1827
+ impl ScoringRouter for TestRouter {
1818
1828
fn notify_payment_path_failed ( & self , path : & [ & RouteHop ] , short_channel_id : u64 ) {
1819
1829
self . scorer . lock ( ) . payment_path_failed ( path, short_channel_id) ;
1820
1830
}
@@ -1841,7 +1851,9 @@ mod tests {
1841
1851
) -> Result < Route , LightningError > {
1842
1852
Err ( LightningError { err : String :: new ( ) , action : ErrorAction :: IgnoreError } )
1843
1853
}
1854
+ }
1844
1855
1856
+ impl ScoringRouter for FailingRouter {
1845
1857
fn notify_payment_path_failed ( & self , _path : & [ & RouteHop ] , _short_channel_id : u64 ) { }
1846
1858
1847
1859
fn notify_payment_path_successful ( & self , _path : & [ & RouteHop ] ) { }
@@ -2103,7 +2115,8 @@ mod tests {
2103
2115
) -> Result < Route , LightningError > {
2104
2116
self . 0 . borrow_mut ( ) . pop_front ( ) . unwrap ( )
2105
2117
}
2106
-
2118
+ }
2119
+ impl ScoringRouter for ManualRouter {
2107
2120
fn notify_payment_path_failed ( & self , _path : & [ & RouteHop ] , _short_channel_id : u64 ) { }
2108
2121
2109
2122
fn notify_payment_path_successful ( & self , _path : & [ & RouteHop ] ) { }
0 commit comments