Skip to content

Commit 592bfd7

Browse files
committed
Add PaymentHash parameter to Router::find_route
Implementations of Router may need the payment hash in order to look up pre-computed routes from a probe for a given payment. Add a PaymentHash parameter to Router::find_route to allow for this.
1 parent 756b305 commit 592bfd7

File tree

2 files changed

+19
-22
lines changed

2 files changed

+19
-22
lines changed

lightning-invoice/src/payment.rs

+17-20
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
//! # struct FakeRouter {};
6666
//! # impl<S: routing::Score> Router<S> for FakeRouter {
6767
//! # fn find_route(
68-
//! # &self, payer: &PublicKey, params: &RouteParameters,
68+
//! # &self, payer: &PublicKey, params: &RouteParameters, payment_hash: &PaymentHash,
6969
//! # first_hops: Option<&[&ChannelDetails]>, scorer: &S
7070
//! # ) -> Result<Route, LightningError> { unimplemented!() }
7171
//! # }
@@ -180,8 +180,8 @@ pub trait Payer {
180180
pub trait Router<S: routing::Score> {
181181
/// Finds a [`Route`] between `payer` and `payee` for a payment with the given values.
182182
fn find_route(
183-
&self, payer: &PublicKey, params: &RouteParameters, first_hops: Option<&[&ChannelDetails]>,
184-
scorer: &S
183+
&self, payer: &PublicKey, params: &RouteParameters, payment_hash: &PaymentHash,
184+
first_hops: Option<&[&ChannelDetails]>, scorer: &S
185185
) -> Result<Route, LightningError>;
186186
}
187187

@@ -329,10 +329,8 @@ where
329329
let payer = self.payer.node_id();
330330
let first_hops = self.payer.first_hops();
331331
let route = self.router.find_route(
332-
&payer,
333-
params,
334-
Some(&first_hops.iter().collect::<Vec<_>>()),
335-
&self.scorer.lock(),
332+
&payer, params, &payment_hash, Some(&first_hops.iter().collect::<Vec<_>>()),
333+
&self.scorer.lock()
336334
).map_err(|e| PaymentError::Routing(e))?;
337335

338336
match send_payment(&route) {
@@ -392,7 +390,10 @@ where
392390

393391
let payer = self.payer.node_id();
394392
let first_hops = self.payer.first_hops();
395-
let route = self.router.find_route(&payer, &params, Some(&first_hops.iter().collect::<Vec<_>>()), &self.scorer.lock());
393+
let route = self.router.find_route(
394+
&payer, &params, &payment_hash, Some(&first_hops.iter().collect::<Vec<_>>()),
395+
&self.scorer.lock()
396+
);
396397
if route.is_err() {
397398
log_trace!(self.logger, "Failed to find a route for payment {}; not retrying (attempts: {})", log_bytes!(payment_hash.0), attempts);
398399
return Err(());
@@ -1187,11 +1188,8 @@ mod tests {
11871188

11881189
impl<S: routing::Score> Router<S> for TestRouter {
11891190
fn find_route(
1190-
&self,
1191-
_payer: &PublicKey,
1192-
params: &RouteParameters,
1193-
_first_hops: Option<&[&ChannelDetails]>,
1194-
_scorer: &S,
1191+
&self, _payer: &PublicKey, params: &RouteParameters, _payment_hash: &PaymentHash,
1192+
_first_hops: Option<&[&ChannelDetails]>, _scorer: &S
11951193
) -> Result<Route, LightningError> {
11961194
Ok(Route {
11971195
payee: Some(params.payee.clone()), ..Self::route_for_value(params.final_value_msat)
@@ -1203,11 +1201,8 @@ mod tests {
12031201

12041202
impl<S: routing::Score> Router<S> for FailingRouter {
12051203
fn find_route(
1206-
&self,
1207-
_payer: &PublicKey,
1208-
_params: &RouteParameters,
1209-
_first_hops: Option<&[&ChannelDetails]>,
1210-
_scorer: &S,
1204+
&self, _payer: &PublicKey, _params: &RouteParameters, _payment_hash: &PaymentHash,
1205+
_first_hops: Option<&[&ChannelDetails]>, _scorer: &S
12111206
) -> Result<Route, LightningError> {
12121207
Err(LightningError { err: String::new(), action: ErrorAction::IgnoreError })
12131208
}
@@ -1370,8 +1365,10 @@ mod tests {
13701365
struct ManualRouter(RefCell<VecDeque<Result<Route, LightningError>>>);
13711366

13721367
impl<S: routing::Score> Router<S> for ManualRouter {
1373-
fn find_route(&self, _payer: &PublicKey, _params: &RouteParameters, _first_hops: Option<&[&ChannelDetails]>, _scorer: &S)
1374-
-> Result<Route, LightningError> {
1368+
fn find_route(
1369+
&self, _payer: &PublicKey, _params: &RouteParameters, _payment_hash: &PaymentHash,
1370+
_first_hops: Option<&[&ChannelDetails]>, _scorer: &S
1371+
) -> Result<Route, LightningError> {
13751372
self.0.borrow_mut().pop_front().unwrap()
13761373
}
13771374
}

lightning-invoice/src/utils.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,8 @@ impl<G, L: Deref> DefaultRouter<G, L> where G: Deref<Target = NetworkGraph>, L::
112112
impl<G, L: Deref, S: routing::Score> Router<S> for DefaultRouter<G, L>
113113
where G: Deref<Target = NetworkGraph>, L::Target: Logger {
114114
fn find_route(
115-
&self, payer: &PublicKey, params: &RouteParameters, first_hops: Option<&[&ChannelDetails]>,
116-
scorer: &S
115+
&self, payer: &PublicKey, params: &RouteParameters, _payment_hash: &PaymentHash,
116+
first_hops: Option<&[&ChannelDetails]>, scorer: &S
117117
) -> Result<Route, LightningError> {
118118
find_route(payer, params, &*self.network_graph, first_hops, &*self.logger, scorer)
119119
}

0 commit comments

Comments
 (0)