Skip to content

Commit 9f34293

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 1aa19b9 commit 9f34293

File tree

1 file changed

+64
-3
lines changed

1 file changed

+64
-3
lines changed

lightning-invoice/src/utils.rs

+64-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,60 @@ where
8996
}
9097
}
9198

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

0 commit comments

Comments
 (0)