Drop Deref indirection for Router
What changed, and why it matters
This commit is a straightforward internal code cleanup in the Lightning Dev Kit's Rust library. It removes an extra layer of pointer-like indirection (the `Deref` trait) around the `Router` type, replacing it with a blanket implementation that makes smart pointers automatically satisfy the `Router` trait. The commit message explicitly states the goal is to reduce generics and verbosity while preserving equivalent behavior. There is no indication of a security fix, behavior change, or vulnerability.
No security action required. Treat as a normal refactoring commit. Reviewers may optionally verify that the new blanket `Router` impl does not introduce ambiguity with other blanket impls in downstream code, but this is a standard Rust pattern and not a security concern.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The patch refactors generic bounds across ChannelManager, OutboundPayments, OffersFlow, and test utilities so that R: Router is used directly instead of R: Deref<Target: Router>. To preserve compatibility with existing callers that pass &Router or Arc<Router> style references, a blanket impl impl<T: Router + ?Sized, R: Deref<Target = T>> Router for R is added in router.rs. This is a type-system simplification; all call sites that previously used &*router now use &router, which resolves to the same trait method call through the blanket impl. No functional logic, serialization, or wire protocol behavior is changed.
Changed components
lightning/src/ln/channelmanager.rslightning/src/ln/functional_test_utils.rslightning/src/ln/outbound_payment.rslightning/src/offers/flow.rslightning/src/routing/router.rsInspect captured patch +94 / −111
diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs
index d7c6d86..096942d 100644
--- a/lightning/src/ln/channelmanager.rs
+++ b/lightning/src/ln/channelmanager.rs
@@ -1803,9 +1803,7 @@ pub trait AChannelManager {
/// A type implementing [`FeeEstimator`].
type FeeEstimator: FeeEstimator;
/// A type implementing [`Router`].
- type Router: Router + ?Sized;
- /// A type that may be dereferenced to [`Self::Router`].
- type R: Deref<Target = Self::Router>;
+ type Router: Router;
/// A type implementing [`MessageRouter`].
type MessageRouter: MessageRouter + ?Sized;
/// A type that may be dereferenced to [`Self::MessageRouter`].
@@ -1824,7 +1822,7 @@ pub trait AChannelManager {
Self::NodeSigner,
Self::SP,
Self::FeeEstimator,
- Self::R,
+ Self::Router,
Self::MR,
Self::L,
>;
@@ -1837,14 +1835,13 @@ impl<
NS: NodeSigner,
SP: Deref,
F: FeeEstimator,
- R: Deref,
+ R: Router,
MR: Deref,
L: Deref,
> AChannelManager for ChannelManager<M, T, ES, NS, SP, F, R, MR, L>
where
M::Target: chain::Watch<<SP::Target as SignerProvider>::EcdsaSigner>,
SP::Target: SignerProvider,
- R::Target: Router,
MR::Target: MessageRouter,
L::Target: Logger,
{
@@ -1857,8 +1854,7 @@ where
type SignerProvider = SP::Target;
type SP = SP;
type FeeEstimator = F;
- type Router = R::Target;
- type R = R;
+ type Router = R;
type MessageRouter = MR::Target;
type MR = MR;
type Logger = L::Target;
@@ -2614,13 +2610,12 @@ pub struct ChannelManager<
NS: NodeSigner,
SP: Deref,
F: FeeEstimator,
- R: Deref,
+ R: Router,
MR: Deref,
L: Deref,
> where
M::Target: chain::Watch<<SP::Target as SignerProvider>::EcdsaSigner>,
SP::Target: SignerProvider,
- R::Target: Router,
MR::Target: MessageRouter,
L::Target: Logger,
{
@@ -3400,14 +3395,13 @@ impl<
NS: NodeSigner,
SP: Deref,
F: FeeEstimator,
- R: Deref,
+ R: Router,
MR: Deref,
L: Deref,
> ChannelManager<M, T, ES, NS, SP, F, R, MR, L>
where
M::Target: chain::Watch<<SP::Target as SignerProvider>::EcdsaSigner>,
SP::Target: SignerProvider,
- R::Target: Router,
MR::Target: MessageRouter,
L::Target: Logger,
{
@@ -5550,7 +5544,7 @@ where
fn check_refresh_async_receive_offer_cache(&self, timer_tick_occurred: bool) {
let peers = self.get_peers_for_blinded_path();
let channels = self.list_usable_channels();
- let router = &*self.router;
+ let router = &self.router;
let refresh_res = self.flow.check_refresh_async_receive_offer_cache(
peers,
channels,
@@ -13537,14 +13531,13 @@ impl<
NS: NodeSigner,
SP: Deref,
F: FeeEstimator,
- R: Deref,
+ R: Router,
MR: Deref,
L: Deref,
> ChannelManager<M, T, ES, NS, SP, F, R, MR, L>
where
M::Target: chain::Watch<<SP::Target as SignerProvider>::EcdsaSigner>,
SP::Target: SignerProvider,
- R::Target: Router,
MR::Target: MessageRouter,
L::Target: Logger,
{
@@ -14410,14 +14403,13 @@ impl<
NS: NodeSigner,
SP: Deref,
F: FeeEstimator,
- R: Deref,
+ R: Router,
MR: Deref,
L: Deref,
> BaseMessageHandler for ChannelManager<M, T, ES, NS, SP, F, R, MR, L>
where
M::Target: chain::Watch<<SP::Target as SignerProvider>::EcdsaSigner>,
SP::Target: SignerProvider,
- R::Target: Router,
MR::Target: MessageRouter,
L::Target: Logger,
{
@@ -14777,14 +14769,13 @@ impl<
NS: NodeSigner,
SP: Deref,
F: FeeEstimator,
- R: Deref,
+ R: Router,
MR: Deref,
L: Deref,
> EventsProvider for ChannelManager<M, T, ES, NS, SP, F, R, MR, L>
where
M::Target: chain::Watch<<SP::Target as SignerProvider>::EcdsaSigner>,
SP::Target: SignerProvider,
- R::Target: Router,
MR::Target: MessageRouter,
L::Target: Logger,
{
@@ -14808,14 +14799,13 @@ impl<
NS: NodeSigner,
SP: Deref,
F: FeeEstimator,
- R: Deref,
+ R: Router,
MR: Deref,
L: Deref,
> chain::Listen for ChannelManager<M, T, ES, NS, SP, F, R, MR, L>
where
M::Target: chain::Watch<<SP::Target as SignerProvider>::EcdsaSigner>,
SP::Target: SignerProvider,
- R::Target: Router,
MR::Target: MessageRouter,
L::Target: Logger,
{
@@ -14865,14 +14855,13 @@ impl<
NS: NodeSigner,
SP: Deref,
F: FeeEstimator,
- R: Deref,
+ R: Router,
MR: Deref,
L: Deref,
> chain::Confirm for ChannelManager<M, T, ES, NS, SP, F, R, MR, L>
where
M::Target: chain::Watch<<SP::Target as SignerProvider>::EcdsaSigner>,
SP::Target: SignerProvider,
- R::Target: Router,
MR::Target: MessageRouter,
L::Target: Logger,
{
@@ -15034,14 +15023,13 @@ impl<
NS: NodeSigner,
SP: Deref,
F: FeeEstimator,
- R: Deref,
+ R: Router,
MR: Deref,
L: Deref,
> ChannelManager<M, T, ES, NS, SP, F, R, MR, L>
where
M::Target: chain::Watch<<SP::Target as SignerProvider>::EcdsaSigner>,
SP::Target: SignerProvider,
- R::Target: Router,
MR::Target: MessageRouter,
L::Target: Logger,
{
@@ -15392,14 +15380,13 @@ impl<
NS: NodeSigner,
SP: Deref,
F: FeeEstimator,
- R: Deref,
+ R: Router,
MR: Deref,
L: Deref,
> ChannelMessageHandler for ChannelManager<M, T, ES, NS, SP, F, R, MR, L>
where
M::Target: chain::Watch<<SP::Target as SignerProvider>::EcdsaSigner>,
SP::Target: SignerProvider,
- R::Target: Router,
MR::Target: MessageRouter,
L::Target: Logger,
{
@@ -15963,14 +15950,13 @@ impl<
NS: NodeSigner,
SP: Deref,
F: FeeEstimator,
- R: Deref,
+ R: Router,
MR: Deref,
L: Deref,
> OffersMessageHandler for ChannelManager<M, T, ES, NS, SP, F, R, MR, L>
where
M::Target: chain::Watch<<SP::Target as SignerProvider>::EcdsaSigner>,
SP::Target: SignerProvider,
- R::Target: Router,
MR::Target: MessageRouter,
L::Target: Logger,
{
@@ -16177,14 +16163,13 @@ impl<
NS: NodeSigner,
SP: Deref,
F: FeeEstimator,
- R: Deref,
+ R: Router,
MR: Deref,
L: Deref,
> AsyncPaymentsMessageHandler for ChannelManager<M, T, ES, NS, SP, F, R, MR, L>
where
M::Target: chain::Watch<<SP::Target as SignerProvider>::EcdsaSigner>,
SP::Target: SignerProvider,
- R::Target: Router,
MR::Target: MessageRouter,
L::Target: Logger,
{
@@ -16215,7 +16200,7 @@ where
self.get_peers_for_blinded_path(),
self.list_usable_channels(),
&self.entropy_source,
- &*self.router,
+ &self.router,
) {
Some((msg, ctx)) => (msg, ctx),
None => return None,
@@ -16418,14 +16403,13 @@ impl<
NS: NodeSigner,
SP: Deref,
F: FeeEstimator,
- R: Deref,
+ R: Router,
MR: Deref,
L: Deref,
> DNSResolverMessageHandler for ChannelManager<M, T, ES, NS, SP, F, R, MR, L>
where
M::Target: chain::Watch<<SP::Target as SignerProvider>::EcdsaSigner>,
SP::Target: SignerProvider,
- R::Target: Router,
MR::Target: MessageRouter,
L::Target: Logger,
{
@@ -16482,14 +16466,13 @@ impl<
NS: NodeSigner,
SP: Deref,
F: FeeEstimator,
- R: Deref,
+ R: Router,
MR: Deref,
L: Deref,
> NodeIdLookUp for ChannelManager<M, T, ES, NS, SP, F, R, MR, L>
where
M::Target: chain::Watch<<SP::Target as SignerProvider>::EcdsaSigner>,
SP::Target: SignerProvider,
- R::Target: Router,
MR::Target: MessageRouter,
L::Target: Logger,
{
@@ -16994,14 +16977,13 @@ impl<
NS: NodeSigner,
SP: Deref,
F: FeeEstimator,
- R: Deref,
+ R: Router,
MR: Deref,
L: Deref,
> Writeable for ChannelManager<M, T, ES, NS, SP, F, R, MR, L>
where
M::Target: chain::Watch<<SP::Target as SignerProvider>::EcdsaSigner>,
SP::Target: SignerProvider,
- R::Target: Router,
MR::Target: MessageRouter,
L::Target: Logger,
{
@@ -17357,13 +17339,12 @@ pub struct ChannelManagerReadArgs<
NS: NodeSigner,
SP: Deref,
F: FeeEstimator,
- R: Deref,
+ R: Router,
MR: Deref,
L: Deref + Clone,
> where
M::Target: chain::Watch<<SP::Target as SignerProvider>::EcdsaSigner>,
SP::Target: SignerProvider,
- R::Target: Router,
MR::Target: MessageRouter,
L::Target: Logger,
{
@@ -17433,14 +17414,13 @@ impl<
NS: NodeSigner,
SP: Deref,
F: FeeEstimator,
- R: Deref,
+ R: Router,
MR: Deref,
L: Deref + Clone,
> ChannelManagerReadArgs<'a, M, T, ES, NS, SP, F, R, MR, L>
where
M::Target: chain::Watch<<SP::Target as SignerProvider>::EcdsaSigner>,
SP::Target: SignerProvider,
- R::Target: Router,
MR::Target: MessageRouter,
L::Target: Logger,
{
@@ -17517,7 +17497,7 @@ impl<
NS: NodeSigner,
SP: Deref,
F: FeeEstimator,
- R: Deref,
+ R: Router,
MR: Deref,
L: Deref + Clone,
> ReadableArgs<ChannelManagerReadArgs<'a, M, T, ES, NS, SP, F, R, MR, L>>
@@ -17525,7 +17505,6 @@ impl<
where
M::Target: chain::Watch<<SP::Target as SignerProvider>::EcdsaSigner>,
SP::Target: SignerProvider,
- R::Target: Router,
MR::Target: MessageRouter,
L::Target: Logger,
{
@@ -17546,7 +17525,7 @@ impl<
NS: NodeSigner,
SP: Deref,
F: FeeEstimator,
- R: Deref,
+ R: Router,
MR: Deref,
L: Deref + Clone,
> ReadableArgs<ChannelManagerReadArgs<'a, M, T, ES, NS, SP, F, R, MR, L>>
@@ -17554,7 +17533,6 @@ impl<
where
M::Target: chain::Watch<<SP::Target as SignerProvider>::EcdsaSigner>,
SP::Target: SignerProvider,
- R::Target: Router,
MR::Target: MessageRouter,
L::Target: Logger,
{
diff --git a/lightning/src/ln/functional_test_utils.rs b/lightning/src/ln/functional_test_utils.rs
index 46af2b1..8b3932a 100644
--- a/lightning/src/ln/functional_test_utils.rs
+++ b/lightning/src/ln/functional_test_utils.rs
@@ -738,7 +738,7 @@ pub trait NodeHolder {
<Self::CM as AChannelManager>::NodeSigner,
<Self::CM as AChannelManager>::SP,
<Self::CM as AChannelManager>::FeeEstimator,
- <Self::CM as AChannelManager>::R,
+ <Self::CM as AChannelManager>::Router,
<Self::CM as AChannelManager>::MR,
<Self::CM as AChannelManager>::L,
>;
@@ -755,7 +755,7 @@ impl<H: NodeHolder> NodeHolder for &H {
<Self::CM as AChannelManager>::NodeSigner,
<Self::CM as AChannelManager>::SP,
<Self::CM as AChannelManager>::FeeEstimator,
- <Self::CM as AChannelManager>::R,
+ <Self::CM as AChannelManager>::Router,
<Self::CM as AChannelManager>::MR,
<Self::CM as AChannelManager>::L,
> {
diff --git a/lightning/src/ln/outbound_payment.rs b/lightning/src/ln/outbound_payment.rs
index e2fc21c..0bc6103 100644
--- a/lightning/src/ln/outbound_payment.rs
+++ b/lightning/src/ln/outbound_payment.rs
@@ -866,7 +866,7 @@ impl OutboundPayments {
impl OutboundPayments {
#[rustfmt::skip]
- pub(super) fn send_payment<R: Deref, ES: EntropySource, NS: NodeSigner, IH, SP, L: Deref>(
+ pub(super) fn send_payment<R: Router, ES: EntropySource, NS: NodeSigner, IH, SP, L: Deref>(
&self, payment_hash: PaymentHash, recipient_onion: RecipientOnionFields, payment_id: PaymentId,
retry_strategy: Retry, route_params: RouteParameters, router: &R,
first_hops: Vec<ChannelDetails>, compute_inflight_htlcs: IH, entropy_source: &ES,
@@ -875,7 +875,6 @@ impl OutboundPayments {
logger: &WithContext<L>,
) -> Result<(), RetryableSendFailure>
where
- R::Target: Router,
IH: Fn() -> InFlightHtlcs,
SP: Fn(SendAlongPathArgs) -> Result<(), APIError>,
L::Target: Logger,
@@ -886,7 +885,7 @@ impl OutboundPayments {
}
#[rustfmt::skip]
- pub(super) fn send_spontaneous_payment<R: Deref, ES: EntropySource, NS: NodeSigner, IH, SP, L: Deref>(
+ pub(super) fn send_spontaneous_payment<R: Router, ES: EntropySource, NS: NodeSigner, IH, SP, L: Deref>(
&self, payment_preimage: Option<PaymentPreimage>, recipient_onion: RecipientOnionFields,
payment_id: PaymentId, retry_strategy: Retry, route_params: RouteParameters, router: &R,
first_hops: Vec<ChannelDetails>, inflight_htlcs: IH, entropy_source: &ES,
@@ -895,7 +894,6 @@ impl OutboundPayments {
logger: &WithContext<L>,
) -> Result<PaymentHash, RetryableSendFailure>
where
- R::Target: Router,
IH: Fn() -> InFlightHtlcs,
SP: Fn(SendAlongPathArgs) -> Result<(), APIError>,
L::Target: Logger,
@@ -911,7 +909,7 @@ impl OutboundPayments {
}
#[rustfmt::skip]
- pub(super) fn pay_for_bolt11_invoice<R: Deref, ES: EntropySource, NS: NodeSigner, IH, SP, L: Deref>(
+ pub(super) fn pay_for_bolt11_invoice<R: Router, ES: EntropySource, NS: NodeSigner, IH, SP, L: Deref>(
&self, invoice: &Bolt11Invoice, payment_id: PaymentId,
amount_msats: Option<u64>,
route_params_config: RouteParametersConfig,
@@ -923,7 +921,6 @@ impl OutboundPayments {
logger: &WithContext<L>,
) -> Result<(), Bolt11PaymentError>
where
- R::Target: Router,
IH: Fn() -> InFlightHtlcs,
SP: Fn(SendAlongPathArgs) -> Result<(), APIError>,
L::Target: Logger,
@@ -958,7 +955,7 @@ impl OutboundPayments {
#[rustfmt::skip]
pub(super) fn send_payment_for_bolt12_invoice<
- R: Deref, ES: EntropySource, NS: NodeSigner, NL: Deref, IH, SP, L: Deref,
+ R: Router, ES: EntropySource, NS: NodeSigner, NL: Deref, IH, SP, L: Deref,
>(
&self, invoice: &Bolt12Invoice, payment_id: PaymentId, router: &R,
first_hops: Vec<ChannelDetails>, features: Bolt12InvoiceFeatures, inflight_htlcs: IH,
@@ -968,7 +965,6 @@ impl OutboundPayments {
send_payment_along_path: SP, logger: &WithContext<L>,
) -> Result<(), Bolt12PaymentError>
where
- R::Target: Router,
NL::Target: NodeIdLookUp,
IH: Fn() -> InFlightHtlcs,
SP: Fn(SendAlongPathArgs) -> Result<(), APIError>,
@@ -1002,7 +998,7 @@ impl OutboundPayments {
#[rustfmt::skip]
fn send_payment_for_bolt12_invoice_internal<
- R: Deref, ES: EntropySource, NS: NodeSigner, NL: Deref, IH, SP, L: Deref,
+ R: Router, ES: EntropySource, NS: NodeSigner, NL: Deref, IH, SP, L: Deref,
>(
&self, payment_id: PaymentId, payment_hash: PaymentHash,
keysend_preimage: Option<PaymentPreimage>, invoice_request: Option<&InvoiceRequest>,
@@ -1014,7 +1010,6 @@ impl OutboundPayments {
send_payment_along_path: SP, logger: &WithContext<L>,
) -> Result<(), Bolt12PaymentError>
where
- R::Target: Router,
NL::Target: NodeIdLookUp,
IH: Fn() -> InFlightHtlcs,
SP: Fn(SendAlongPathArgs) -> Result<(), APIError>,
@@ -1216,7 +1211,7 @@ impl OutboundPayments {
}
pub(super) fn send_payment_for_static_invoice<
- R: Deref,
+ R: Router,
ES: EntropySource,
NS: NodeSigner,
NL: Deref,
@@ -1231,7 +1226,6 @@ impl OutboundPayments {
send_payment_along_path: SP, logger: &WithContext<L>,
) -> Result<(), Bolt12PaymentError>
where
- R::Target: Router,
NL::Target: NodeIdLookUp,
IH: Fn() -> InFlightHtlcs,
SP: Fn(SendAlongPathArgs) -> Result<(), APIError>,
@@ -1300,7 +1294,7 @@ impl OutboundPayments {
// Returns whether the data changed and needs to be repersisted.
pub(super) fn check_retry_payments<
- R: Deref,
+ R: Router,
ES: EntropySource,
NS: NodeSigner,
SP,
@@ -1314,7 +1308,6 @@ impl OutboundPayments {
send_payment_along_path: SP, logger: &WithContext<L>,
) -> bool
where
- R::Target: Router,
SP: Fn(SendAlongPathArgs) -> Result<(), APIError>,
IH: Fn() -> InFlightHtlcs,
FH: Fn() -> Vec<ChannelDetails>,
@@ -1417,14 +1410,13 @@ impl OutboundPayments {
}
#[rustfmt::skip]
- fn find_initial_route<R: Deref, NS: NodeSigner, IH, L: Deref>(
+ fn find_initial_route<R: Router, NS: NodeSigner, IH, L: Deref>(
&self, payment_id: PaymentId, payment_hash: PaymentHash, recipient_onion: &RecipientOnionFields,
keysend_preimage: Option<PaymentPreimage>, invoice_request: Option<&InvoiceRequest>,
route_params: &mut RouteParameters, router: &R, first_hops: &Vec<ChannelDetails>,
inflight_htlcs: &IH, node_signer: &NS, best_block_height: u32, logger: &WithContext<L>,
) -> Result<Route, RetryableSendFailure>
where
- R::Target: Router,
L::Target: Logger,
IH: Fn() -> InFlightHtlcs,
{
@@ -1471,7 +1463,7 @@ impl OutboundPayments {
/// [`Event::PaymentPathFailed`]: crate::events::Event::PaymentPathFailed
/// [`Event::PaymentFailed`]: crate::events::Event::PaymentFailed
#[rustfmt::skip]
- fn send_payment_for_non_bolt12_invoice<R: Deref, NS: NodeSigner, ES: EntropySource, IH, SP, L: Deref>(
+ fn send_payment_for_non_bolt12_invoice<R: Router, NS: NodeSigner, ES: EntropySource, IH, SP, L: Deref>(
&self, payment_id: PaymentId, payment_hash: PaymentHash, recipient_onion: RecipientOnionFields,
keysend_preimage: Option<PaymentPreimage>, retry_strategy: Retry, mut route_params: RouteParameters,
router: &R, first_hops: Vec<ChannelDetails>, inflight_htlcs: IH, entropy_source: &ES,
@@ -1480,7 +1472,6 @@ impl OutboundPayments {
logger: &WithContext<L>,
) -> Result<(), RetryableSendFailure>
where
- R::Target: Router,
L::Target: Logger,
IH: Fn() -> InFlightHtlcs,
SP: Fn(SendAlongPathArgs) -> Result<(), APIError>,
@@ -1515,7 +1506,7 @@ impl OutboundPayments {
}
#[rustfmt::skip]
- fn find_route_and_send_payment<R: Deref, NS: NodeSigner, ES: EntropySource, IH, SP, L: Deref>(
+ fn find_route_and_send_payment<R: Router, NS: NodeSigner, ES: EntropySource, IH, SP, L: Deref>(
&self, payment_hash: PaymentHash, payment_id: PaymentId, route_params: RouteParameters,
router: &R, first_hops: Vec<ChannelDetails>, inflight_htlcs: &IH, entropy_source: &ES,
node_signer: &NS, best_block_height: u32,
@@ -1523,7 +1514,6 @@ impl OutboundPayments {
send_payment_along_path: &SP, logger: &WithContext<L>,
)
where
- R::Target: Router,
L::Target: Logger,
IH: Fn() -> InFlightHtlcs,
SP: Fn(SendAlongPathArgs) -> Result<(), APIError>,
@@ -1675,7 +1665,7 @@ impl OutboundPayments {
}
#[rustfmt::skip]
- fn handle_pay_route_err<R: Deref, NS: NodeSigner, ES: EntropySource, IH, SP, L: Deref>(
+ fn handle_pay_route_err<R: Router, NS: NodeSigner, ES: EntropySource, IH, SP, L: Deref>(
&self, err: PaymentSendFailure, payment_id: PaymentId, payment_hash: PaymentHash, route: Route,
mut route_params: RouteParameters, onion_session_privs: Vec<[u8; 32]>, router: &R,
first_hops: Vec<ChannelDetails>, inflight_htlcs: &IH, entropy_source: &ES, node_signer: &NS,
@@ -1684,7 +1674,6 @@ impl OutboundPayments {
send_payment_along_path: &SP, logger: &WithContext<L>,
)
where
- R::Target: Router,
IH: Fn() -> InFlightHtlcs,
SP: Fn(SendAlongPathArgs) -> Result<(), APIError>,
L::Target: Logger,
diff --git a/lightning/src/offers/flow.rs b/lightning/src/offers/flow.rs
index 97e92fd..e22f97c 100644
--- a/lightning/src/offers/flow.rs
+++ b/lightning/src/offers/flow.rs
@@ -317,14 +317,11 @@ where
/// Creates multi-hop blinded payment paths for the given `amount_msats` by delegating to
/// [`Router::create_blinded_payment_paths`].
- fn create_blinded_payment_paths<R: Deref>(
+ fn create_blinded_payment_paths<R: Router>(
&self, router: &R, usable_channels: Vec<ChannelDetails>, amount_msats: Option<u64>,
payment_secret: PaymentSecret, payment_context: PaymentContext,
relative_expiry_seconds: u32,
- ) -> Result<Vec<BlindedPaymentPath>, ()>
- where
- R::Target: Router,
- {
+ ) -> Result<Vec<BlindedPaymentPath>, ()> {
let secp_ctx = &self.secp_ctx;
let receive_auth_key = self.receive_auth_key;
@@ -356,14 +353,11 @@ where
#[cfg(test)]
/// Creates multi-hop blinded payment paths for the given `amount_msats` by delegating to
/// [`Router::create_blinded_payment_paths`].
- pub(crate) fn test_create_blinded_payment_paths<R: Deref>(
+ pub(crate) fn test_create_blinded_payment_paths<R: Router>(
&self, router: &R, usable_channels: Vec<ChannelDetails>, amount_msats: Option<u64>,
payment_secret: PaymentSecret, payment_context: PaymentContext,
relative_expiry_seconds: u32,
- ) -> Result<Vec<BlindedPaymentPath>, ()>
- where
- R::Target: Router,
- {
+ ) -> Result<Vec<BlindedPaymentPath>, ()> {
self.create_blinded_payment_paths(
router,
usable_channels,
@@ -821,14 +815,11 @@ where
/// created via [`Self::create_async_receive_offer_builder`].
///
/// This is not exported to bindings users as builder patterns don't map outside of move semantics.
- pub fn create_static_invoice_builder<'a, R: Deref>(
+ pub fn create_static_invoice_builder<'a, R: Router>(
&self, router: &R, offer: &'a Offer, offer_nonce: Nonce, payment_secret: PaymentSecret,
relative_expiry_secs: u32, usable_channels: Vec<ChannelDetails>,
peers: Vec<MessageForwardNode>,
- ) -> Result<StaticInvoiceBuilder<'a>, Bolt12SemanticError>
- where
- R::Target: Router,
- {
+ ) -> Result<StaticInvoiceBuilder<'a>, Bolt12SemanticError> {
let expanded_key = &self.inbound_payment_key;
let secp_ctx = &self.secp_ctx;
@@ -892,12 +883,11 @@ where
/// blinded path can be constructed.
///
/// This is not exported to bindings users as builder patterns don't map outside of move semantics.
- pub fn create_invoice_builder_from_refund<'a, ES: EntropySource, R: Deref, F>(
+ pub fn create_invoice_builder_from_refund<'a, ES: EntropySource, R: Router, F>(
&'a self, router: &R, entropy_source: ES, refund: &'a Refund,
usable_channels: Vec<ChannelDetails>, get_payment_info: F,
) -> Result<InvoiceBuilder<'a, DerivedSigningPubkey>, Bolt12SemanticError>
where
- R::Target: Router,
F: Fn(u64, u32) -> Result<(PaymentHash, PaymentSecret), Bolt12SemanticError>,
{
if refund.chain() != self.chain_hash {
@@ -960,12 +950,11 @@ where
/// Returns a [`Bolt12SemanticError`] if:
/// - Valid blinded payment paths could not be generated for the [`Bolt12Invoice`].
/// - The [`InvoiceBuilder`] could not be created from the [`InvoiceRequest`].
- pub fn create_invoice_builder_from_invoice_request_with_keys<'a, R: Deref, F>(
+ pub fn create_invoice_builder_from_invoice_request_with_keys<'a, R: Router, F>(
&self, router: &R, invoice_request: &'a VerifiedInvoiceRequest<DerivedSigningPubkey>,
usable_channels: Vec<ChannelDetails>, get_payment_info: F,
) -> Result<(InvoiceBuilder<'a, DerivedSigningPubkey>, MessageContext), Bolt12SemanticError>
where
- R::Target: Router,
F: Fn(u64, u32) -> Result<(PaymentHash, PaymentSecret), Bolt12SemanticError>,
{
let relative_expiry = DEFAULT_RELATIVE_EXPIRY.as_secs() as u32;
@@ -1020,12 +1009,11 @@ where
/// Returns a [`Bolt12SemanticError`] if:
/// - Valid blinded payment paths could not be generated for the [`Bolt12Invoice`].
/// - The [`InvoiceBuilder`] could not be created from the [`InvoiceRequest`].
- pub fn create_invoice_builder_from_invoice_request_without_keys<'a, R: Deref, F>(
+ pub fn create_invoice_builder_from_invoice_request_without_keys<'a, R: Router, F>(
&self, router: &R, invoice_request: &'a VerifiedInvoiceRequest<ExplicitSigningPubkey>,
usable_channels: Vec<ChannelDetails>, get_payment_info: F,
) -> Result<(InvoiceBuilder<'a, ExplicitSigningPubkey>, MessageContext), Bolt12SemanticError>
where
- R::Target: Router,
F: Fn(u64, u32) -> Result<(PaymentHash, PaymentSecret), Bolt12SemanticError>,
{
let relative_expiry = DEFAULT_RELATIVE_EXPIRY.as_secs() as u32;
@@ -1372,13 +1360,10 @@ where
/// the cache can self-regulate the number of messages sent out.
///
/// Errors if we failed to create blinded reply paths when sending an [`OfferPathsRequest`] message.
- pub fn check_refresh_async_receive_offer_cache<R: Deref>(
+ pub fn check_refresh_async_receive_offer_cache<R: Router>(
&self, peers: Vec<MessageForwardNode>, usable_channels: Vec<ChannelDetails>, router: R,
timer_tick_occurred: bool,
- ) -> Result<(), ()>
- where
- R::Target: Router,
- {
+ ) -> Result<(), ()> {
// Terminate early if this node does not intend to receive async payments.
{
let cache = self.async_receive_offer_cache.lock().unwrap();
@@ -1447,11 +1432,9 @@ where
/// Enqueue onion messages that will used to request invoice refresh from the static invoice
/// server, based on the offers provided by the cache.
- fn check_refresh_static_invoices<R: Deref>(
+ fn check_refresh_static_invoices<R: Router>(
&self, peers: Vec<MessageForwardNode>, usable_channels: Vec<ChannelDetails>, router: R,
- ) where
- R::Target: Router,
- {
+ ) {
let mut serve_static_invoice_msgs = Vec::new();
{
let duration_since_epoch = self.duration_since_epoch();
@@ -1464,7 +1447,7 @@ where
offer_nonce,
peers.clone(),
usable_channels.clone(),
- &*router,
+ &router,
) {
Ok((invoice, path)) => (invoice, path),
Err(()) => continue,
@@ -1572,14 +1555,11 @@ where
///
/// Returns `None` if we have enough offers cached already, verification of `message` fails, or we
/// fail to create blinded paths.
- pub fn handle_offer_paths<ES: EntropySource, R: Deref>(
+ pub fn handle_offer_paths<ES: EntropySource, R: Router>(
&self, message: OfferPaths, context: AsyncPaymentsContext, responder: Responder,
peers: Vec<MessageForwardNode>, usable_channels: Vec<ChannelDetails>, entropy: ES,
router: R,
- ) -> Option<(ServeStaticInvoice, MessageContext)>
- where
- R::Target: Router,
- {
+ ) -> Option<(ServeStaticInvoice, MessageContext)> {
let duration_since_epoch = self.duration_since_epoch();
let invoice_slot = match context {
AsyncPaymentsContext::OfferPaths { invoice_slot, path_absolute_expiry } => {
@@ -1662,13 +1642,10 @@ where
/// Creates a [`StaticInvoice`] and a blinded path for the server to forward invoice requests from
/// payers to our node.
- fn create_static_invoice_for_server<R: Deref>(
+ fn create_static_invoice_for_server<R: Router>(
&self, offer: &Offer, offer_nonce: Nonce, peers: Vec<MessageForwardNode>,
usable_channels: Vec<ChannelDetails>, router: R,
- ) -> Result<(StaticInvoice, BlindedMessagePath), ()>
- where
- R::Target: Router,
- {
+ ) -> Result<(StaticInvoice, BlindedMessagePath), ()> {
let expanded_key = &self.inbound_payment_key;
let duration_since_epoch = self.duration_since_epoch();
let secp_ctx = &self.secp_ctx;
diff --git a/lightning/src/routing/router.rs b/lightning/src/routing/router.rs
index 494860f..0a23588 100644
--- a/lightning/src/routing/router.rs
+++ b/lightning/src/routing/router.rs
@@ -292,6 +292,45 @@ pub trait Router {
) -> Result<Vec<BlindedPaymentPath>, ()>;
}
+impl<T: Router + ?Sized, R: Deref<Target = T>> Router for R {
+ fn find_route(
+ &self, payer: &PublicKey, route_params: &RouteParameters,
+ first_hops: Option<&[&ChannelDetails]>, inflight_htlcs: InFlightHtlcs,
+ ) -> Result<Route, &'static str> {
+ self.deref().find_route(payer, route_params, first_hops, inflight_htlcs)
+ }
+
+ fn find_route_with_id(
+ &self, payer: &PublicKey, route_params: &RouteParameters,
+ first_hops: Option<&[&ChannelDetails]>, inflight_htlcs: InFlightHtlcs,
+ payment_hash: PaymentHash, payment_id: PaymentId,
+ ) -> Result<Route, &'static str> {
+ self.deref().find_route_with_id(
+ payer,
+ route_params,
+ first_hops,
+ inflight_htlcs,
+ payment_hash,
+ payment_id,
+ )
+ }
+
+ fn create_blinded_payment_paths<S: secp256k1::Signing + secp256k1::Verification>(
+ &self, recipient: PublicKey, local_node_receive_key: ReceiveAuthKey,
+ first_hops: Vec<ChannelDetails>, tlvs: ReceiveTlvs, amount_msats: Option<u64>,
+ secp_ctx: &Secp256k1<S>,
+ ) -> Result<Vec<BlindedPaymentPath>, ()> {
+ self.deref().create_blinded_payment_paths(
+ recipient,
+ local_node_receive_key,
+ first_hops,
+ tlvs,
+ amount_msats,
+ secp_ctx,
+ )
+ }
+}
+
/// [`ScoreLookUp`] implementation that factors in in-flight HTLC liquidity.
///
/// Useful for custom [`Router`] implementations to wrap their [`ScoreLookUp`] on-the-fly when calling
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.