|
1 | 1 | //! Convenient utilities to create an invoice.
|
| 2 | +
|
2 | 3 | use {Currency, DEFAULT_EXPIRY_TIME, Invoice, InvoiceBuilder, SignOrCreationError, RawInvoice};
|
| 4 | +use payment::{Payer, Router}; |
| 5 | + |
3 | 6 | use bech32::ToBase32;
|
4 | 7 | use bitcoin_hashes::Hash;
|
5 | 8 | use lightning::chain;
|
6 | 9 | use lightning::chain::chaininterface::{BroadcasterInterface, FeeEstimator};
|
7 | 10 | 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; |
11 | 17 | use lightning::util::logger::Logger;
|
| 18 | +use secp256k1::key::PublicKey; |
12 | 19 | use std::convert::TryInto;
|
13 | 20 | use std::ops::Deref;
|
14 | 21 |
|
|
89 | 96 | }
|
90 | 97 | }
|
91 | 98 |
|
| 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 | + |
92 | 151 | #[cfg(test)]
|
93 | 152 | mod test {
|
94 | 153 | use {Currency, Description, InvoiceDescription};
|
|
0 commit comments