Skip to content

Commit a855a20

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 b46373b commit a855a20

File tree

1 file changed

+65
-3
lines changed

1 file changed

+65
-3
lines changed

lightning-invoice/src/utils.rs

+65-3
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
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;
7+
use bitcoin::secp256k1::key::PublicKey;
48
use bitcoin_hashes::Hash;
59
use lightning::chain;
610
use lightning::chain::chaininterface::{BroadcasterInterface, FeeEstimator};
711
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};
12+
use lightning::ln::{PaymentHash, PaymentSecret};
13+
use lightning::ln::channelmanager::{ChannelDetails, ChannelManager, PaymentSendFailure, MIN_FINAL_CLTV_EXPIRY};
14+
use lightning::ln::features::InvoiceFeatures;
15+
use lightning::ln::msgs::LightningError;
16+
use lightning::routing::network_graph::{NetworkGraph, RoutingFees};
17+
use lightning::routing::router::{Route, RouteHint, RouteHintHop, get_route};
1118
use lightning::util::logger::Logger;
1219
use std::convert::TryInto;
1320
use std::ops::Deref;
@@ -89,6 +96,61 @@ 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,
116+
payer: &PublicKey,
117+
payee: &PublicKey,
118+
payee_features: Option<InvoiceFeatures>,
119+
first_hops: Option<&[&ChannelDetails]>,
120+
last_hops: &[&RouteHint],
121+
final_value_msat: u64,
122+
final_cltv: u32,
123+
) -> Result<Route, LightningError> {
124+
get_route(
125+
payer, &*self.network_graph, payee, payee_features, first_hops, last_hops,
126+
final_value_msat, final_cltv, &*self.logger,
127+
)
128+
}
129+
}
130+
131+
impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> Payer for ChannelManager<Signer, M, T, K, F, L>
132+
where
133+
M::Target: chain::Watch<Signer>,
134+
T::Target: BroadcasterInterface,
135+
K::Target: KeysInterface<Signer = Signer>,
136+
F::Target: FeeEstimator,
137+
L::Target: Logger,
138+
{
139+
fn node_id(&self) -> PublicKey {
140+
self.get_our_node_id()
141+
}
142+
143+
fn first_hops(&self) -> Vec<ChannelDetails> {
144+
self.list_usable_channels()
145+
}
146+
147+
fn send_payment(
148+
&self, route: &Route, payment_hash: PaymentHash, payment_secret: &Option<PaymentSecret>
149+
) -> Result<(), PaymentSendFailure> {
150+
self.send_payment(route, payment_hash, payment_secret)
151+
}
152+
}
153+
92154
#[cfg(test)]
93155
mod test {
94156
use {Currency, Description, InvoiceDescription};

0 commit comments

Comments
 (0)