Skip to content

Commit 2aca5b1

Browse files
committed
Implement Payer and Router for lightning crate
Implements Payer for ChannelManager and Rotuer for get_route, which can be used to parameterize InvoicePayer when needing payment retries.
1 parent ad61ec5 commit 2aca5b1

File tree

1 file changed

+62
-3
lines changed

1 file changed

+62
-3
lines changed

lightning-invoice/src/utils.rs

+62-3
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
11
//! Convenient utilities to create an invoice.
2+
23
use {Currency, DEFAULT_EXPIRY_TIME, Invoice, InvoiceBuilder, SignOrCreationError, RawInvoice};
4+
use payment::{Payer, Router};
5+
36
use bech32::ToBase32;
47
use bitcoin_hashes::Hash;
58
use lightning::chain;
69
use lightning::chain::chaininterface::{BroadcasterInterface, FeeEstimator};
710
use lightning::chain::keysinterface::{Sign, KeysInterface};
8-
use lightning::ln::channelmanager::{ChannelManager, MIN_FINAL_CLTV_EXPIRY};
9-
use lightning::routing::network_graph::RoutingFees;
10-
use lightning::routing::router::{RouteHint, RouteHintHop};
11+
use lightning::ln::{PaymentHash, PaymentSecret};
12+
use lightning::ln::channelmanager::{ChannelDetails, ChannelManager, PaymentId, PaymentSendFailure, MIN_FINAL_CLTV_EXPIRY};
13+
use lightning::ln::msgs::LightningError;
14+
use lightning::routing::network_graph::{NetworkGraph, RoutingFees};
15+
use lightning::routing::router::{Route, RouteHint, RouteHintHop, RouteParameters, find_route};
16+
use lightning::routing::scorer::Scorer;
1117
use lightning::util::logger::Logger;
18+
use secp256k1::key::PublicKey;
1219
use std::convert::TryInto;
1320
use std::ops::Deref;
1421

@@ -89,6 +96,58 @@ where
8996
}
9097
}
9198

99+
/// A [`Router`] implemented using [`get_route`].
100+
pub struct DefaultRouter<G, L: Deref> where G: Deref<Target = NetworkGraph>, L::Target: Logger {
101+
network_graph: G,
102+
logger: L,
103+
}
104+
105+
impl<G, L: Deref> DefaultRouter<G, L> where G: Deref<Target = NetworkGraph>, L::Target: Logger {
106+
/// Creates a new router using the given [`NetworkGraph`] and [`Logger`].
107+
pub fn new(network_graph: G, logger: L) -> Self {
108+
Self { network_graph, logger }
109+
}
110+
}
111+
112+
impl<G, L: Deref> Router for DefaultRouter<G, L>
113+
where G: Deref<Target = NetworkGraph>, L::Target: Logger {
114+
fn find_route(
115+
&self, payer: &PublicKey, params: &RouteParameters, first_hops: Option<&[&ChannelDetails]>,
116+
) -> Result<Route, LightningError> {
117+
let scorer = Scorer::default();
118+
find_route(payer, params, &*self.network_graph, first_hops, &*self.logger, &scorer)
119+
}
120+
}
121+
122+
impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> Payer for ChannelManager<Signer, M, T, K, F, L>
123+
where
124+
M::Target: chain::Watch<Signer>,
125+
T::Target: BroadcasterInterface,
126+
K::Target: KeysInterface<Signer = Signer>,
127+
F::Target: FeeEstimator,
128+
L::Target: Logger,
129+
{
130+
fn node_id(&self) -> PublicKey {
131+
self.get_our_node_id()
132+
}
133+
134+
fn first_hops(&self) -> Vec<ChannelDetails> {
135+
self.list_usable_channels()
136+
}
137+
138+
fn send_payment(
139+
&self, route: &Route, payment_hash: PaymentHash, payment_secret: &Option<PaymentSecret>
140+
) -> Result<PaymentId, PaymentSendFailure> {
141+
self.send_payment(route, payment_hash, payment_secret)
142+
}
143+
144+
fn retry_payment(
145+
&self, route: &Route, payment_id: PaymentId
146+
) -> Result<(), PaymentSendFailure> {
147+
self.retry_payment(route, payment_id)
148+
}
149+
}
150+
92151
#[cfg(test)]
93152
mod test {
94153
use {Currency, Description, InvoiceDescription};

0 commit comments

Comments
 (0)