Skip to content

Commit

Permalink
Implement Payer and Router for lightning crate
Browse files Browse the repository at this point in the history
Implements Payer for ChannelManager and Rotuer for get_route, which can
be used to parameterize InvoicePayer when needing payment retries.
  • Loading branch information
jkczyz committed Sep 21, 2021
1 parent b46373b commit 964f5c7
Showing 1 changed file with 65 additions and 3 deletions.
68 changes: 65 additions & 3 deletions lightning-invoice/src/utils.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,21 @@
//! Convenient utilities to create an invoice.

use {Currency, DEFAULT_EXPIRY_TIME, Invoice, InvoiceBuilder, SignOrCreationError, RawInvoice};
use payment::{Payer, Router};

use bech32::ToBase32;
use bitcoin_hashes::Hash;
use lightning::chain;
use lightning::chain::chaininterface::{BroadcasterInterface, FeeEstimator};
use lightning::chain::keysinterface::{Sign, KeysInterface};
use lightning::ln::channelmanager::{ChannelManager, MIN_FINAL_CLTV_EXPIRY};
use lightning::routing::network_graph::RoutingFees;
use lightning::routing::router::{RouteHint, RouteHintHop};
use lightning::ln::{PaymentHash, PaymentSecret};
use lightning::ln::channelmanager::{ChannelDetails, ChannelManager, PaymentSendFailure, MIN_FINAL_CLTV_EXPIRY};
use lightning::ln::features::InvoiceFeatures;
use lightning::ln::msgs::LightningError;
use lightning::routing::network_graph::{NetworkGraph, RoutingFees};
use lightning::routing::router::{Route, RouteHint, RouteHintHop, get_route};
use lightning::util::logger::Logger;
use secp256k1::key::PublicKey;
use std::convert::TryInto;
use std::ops::Deref;

Expand Down Expand Up @@ -89,6 +96,61 @@ where
}
}

/// A [`Router`] implemented using [`get_route`].
pub struct DefaultRouter<G, L: Deref> where G: Deref<Target = NetworkGraph>, L::Target: Logger {
network_graph: G,
logger: L,
}

impl<G, L: Deref> DefaultRouter<G, L> where G: Deref<Target = NetworkGraph>, L::Target: Logger {
/// Creates a new router using the given [`NetworkGraph`] and [`Logger`].
pub fn new(network_graph: G, logger: L) -> Self {
Self { network_graph, logger }
}
}

impl<G, L: Deref> Router for DefaultRouter<G, L>
where G: Deref<Target = NetworkGraph>, L::Target: Logger {
fn find_route(
&self,
payer: &PublicKey,
payee: &PublicKey,
payee_features: Option<InvoiceFeatures>,
first_hops: Option<&[&ChannelDetails]>,
last_hops: &[&RouteHint],
final_value_msat: u64,
final_cltv: u32,
) -> Result<Route, LightningError> {
get_route(
payer, &*self.network_graph, payee, payee_features, first_hops, last_hops,
final_value_msat, final_cltv, &*self.logger,
)
}
}

impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> Payer for ChannelManager<Signer, M, T, K, F, L>
where
M::Target: chain::Watch<Signer>,
T::Target: BroadcasterInterface,
K::Target: KeysInterface<Signer = Signer>,
F::Target: FeeEstimator,
L::Target: Logger,
{
fn node_id(&self) -> PublicKey {
self.get_our_node_id()
}

fn first_hops(&self) -> Vec<ChannelDetails> {
self.list_usable_channels()
}

fn send_payment(
&self, route: &Route, payment_hash: PaymentHash, payment_secret: &Option<PaymentSecret>
) -> Result<(), PaymentSendFailure> {
self.send_payment(route, payment_hash, payment_secret)
}
}

#[cfg(test)]
mod test {
use {Currency, Description, InvoiceDescription};
Expand Down

0 comments on commit 964f5c7

Please sign in to comment.