From d545e5aa8ef2d563648b177aff707018a42ca344 Mon Sep 17 00:00:00 2001 From: Valentine Wallace Date: Wed, 14 Jan 2026 12:24:29 -0500 Subject: [PATCH 01/17] Bump lightning-liquidity version Useful for upcoming commits where we otherwise break SemVer checks by changing the ALiquidityManager associated types. --- lightning-background-processor/Cargo.toml | 4 ++-- lightning-liquidity/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lightning-background-processor/Cargo.toml b/lightning-background-processor/Cargo.toml index ef0a9840613..7fe68bc1933 100644 --- a/lightning-background-processor/Cargo.toml +++ b/lightning-background-processor/Cargo.toml @@ -26,14 +26,14 @@ bitcoin_hashes = { version = "0.14.0", default-features = false } bitcoin-io = { version = "0.1.2", default-features = false } lightning = { version = "0.3.0", path = "../lightning", default-features = false } lightning-rapid-gossip-sync = { version = "0.2.0", path = "../lightning-rapid-gossip-sync", default-features = false } -lightning-liquidity = { version = "0.2.0", path = "../lightning-liquidity", default-features = false } +lightning-liquidity = { version = "0.3.0", path = "../lightning-liquidity", default-features = false } possiblyrandom = { version = "0.2", path = "../possiblyrandom", default-features = false } [dev-dependencies] tokio = { version = "1.35", features = [ "macros", "rt", "rt-multi-thread", "sync", "time" ] } lightning = { version = "0.3.0", path = "../lightning", features = ["_test_utils"] } lightning-invoice = { version = "0.34.0", path = "../lightning-invoice" } -lightning-liquidity = { version = "0.2.0", path = "../lightning-liquidity", default-features = false, features = ["_test_utils"] } +lightning-liquidity = { version = "0.3.0", path = "../lightning-liquidity", default-features = false, features = ["_test_utils"] } lightning-persister = { version = "0.2.0", path = "../lightning-persister" } [lints] diff --git a/lightning-liquidity/Cargo.toml b/lightning-liquidity/Cargo.toml index 2f83077cabc..67e82a5fbf8 100644 --- a/lightning-liquidity/Cargo.toml +++ b/lightning-liquidity/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "lightning-liquidity" -version = "0.2.0+git" +version = "0.3.0+git" authors = ["John Cantrell ", "Elias Rohrer "] homepage = "https://lightningdevkit.org/" license = "MIT OR Apache-2.0" From 93360c43b06a419f26feb121b09363f98b187f7b Mon Sep 17 00:00:00 2001 From: Valentine Wallace Date: Tue, 13 Jan 2026 14:13:57 -0500 Subject: [PATCH 02/17] Drop Deref indirection for BroadcasterInterface Reduces generics and verbosity across the codebase, should provide equivalent behavior. Co-Authored-By: Claude Opus 4.5 --- lightning-background-processor/src/lib.rs | 23 ++--- lightning-liquidity/src/lsps2/service.rs | 16 ++-- lightning-liquidity/src/manager.rs | 86 +++++++++---------- lightning/src/chain/chaininterface.rs | 6 ++ lightning/src/chain/chainmonitor.rs | 52 +++++------ lightning/src/chain/channelmonitor.rs | 82 +++++++----------- lightning/src/chain/onchaintx.rs | 23 ++--- lightning/src/events/bump_transaction/mod.rs | 7 +- lightning/src/events/bump_transaction/sync.rs | 7 +- lightning/src/ln/channelmanager.rs | 66 +++++--------- lightning/src/ln/functional_test_utils.rs | 4 +- lightning/src/util/anchor_channel_reserves.rs | 5 +- lightning/src/util/persist.rs | 51 ++++++----- lightning/src/util/sweep.rs | 48 ++++++----- 14 files changed, 208 insertions(+), 268 deletions(-) diff --git a/lightning-background-processor/src/lib.rs b/lightning-background-processor/src/lib.rs index c38d6dfe080..0cefcca7d24 100644 --- a/lightning-background-processor/src/lib.rs +++ b/lightning-background-processor/src/lib.rs @@ -492,10 +492,9 @@ pub const NO_LIQUIDITY_MANAGER: Option< K = &DummyKVStore, TimeProvider = dyn lightning_liquidity::utils::time::TimeProvider + Send + Sync, TP = &(dyn lightning_liquidity::utils::time::TimeProvider + Send + Sync), - BroadcasterInterface = dyn lightning::chain::chaininterface::BroadcasterInterface - + Send - + Sync, - T = &(dyn BroadcasterInterface + Send + Sync), + BroadcasterInterface = &(dyn lightning::chain::chaininterface::BroadcasterInterface + + Send + + Sync), > + Send + Sync, >, @@ -519,10 +518,9 @@ pub const NO_LIQUIDITY_MANAGER_SYNC: Option< KS = &(dyn lightning::util::persist::KVStoreSync + Send + Sync), TimeProvider = dyn lightning_liquidity::utils::time::TimeProvider + Send + Sync, TP = &(dyn lightning_liquidity::utils::time::TimeProvider + Send + Sync), - BroadcasterInterface = dyn lightning::chain::chaininterface::BroadcasterInterface - + Send - + Sync, - T = &(dyn BroadcasterInterface + Send + Sync), + BroadcasterInterface = &(dyn lightning::chain::chaininterface::BroadcasterInterface + + Send + + Sync), > + Send + Sync, >, @@ -956,7 +954,7 @@ pub async fn process_events_async< 'a, UL: Deref, CF: Deref, - T: Deref, + T: BroadcasterInterface, F: Deref, G: Deref>, L: Deref, @@ -989,7 +987,6 @@ pub async fn process_events_async< where UL::Target: UtxoLookup, CF::Target: chain::Filter, - T::Target: BroadcasterInterface, F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist<::Signer>, @@ -1457,7 +1454,7 @@ fn check_and_reset_sleeper< pub async fn process_events_async_with_kv_store_sync< UL: Deref, CF: Deref, - T: Deref, + T: BroadcasterInterface, F: Deref, G: Deref>, L: Deref, @@ -1490,7 +1487,6 @@ pub async fn process_events_async_with_kv_store_sync< where UL::Target: UtxoLookup, CF::Target: chain::Filter, - T::Target: BroadcasterInterface, F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist<::Signer>, @@ -1571,7 +1567,7 @@ impl BackgroundProcessor { 'a, UL: 'static + Deref, CF: 'static + Deref, - T: 'static + Deref, + T: 'static + BroadcasterInterface, F: 'static + Deref + Send, G: 'static + Deref>, L: 'static + Deref + Send, @@ -1604,7 +1600,6 @@ impl BackgroundProcessor { where UL::Target: 'static + UtxoLookup, CF::Target: 'static + chain::Filter, - T::Target: 'static + BroadcasterInterface, F::Target: 'static + FeeEstimator, L::Target: 'static + Logger, P::Target: 'static + Persist<::Signer>, diff --git a/lightning-liquidity/src/lsps2/service.rs b/lightning-liquidity/src/lsps2/service.rs index 1b5bf964996..756e8b32bc8 100644 --- a/lightning-liquidity/src/lsps2/service.rs +++ b/lightning-liquidity/src/lsps2/service.rs @@ -702,11 +702,10 @@ macro_rules! get_or_insert_peer_state_entry { } /// The main object allowing to send and receive bLIP-52 / LSPS2 messages. -pub struct LSPS2ServiceHandler +pub struct LSPS2ServiceHandler where CM::Target: AChannelManager, K::Target: KVStore, - T::Target: BroadcasterInterface, { channel_manager: CM, kv_store: K, @@ -721,11 +720,10 @@ where persistence_in_flight: AtomicUsize, } -impl LSPS2ServiceHandler +impl LSPS2ServiceHandler where CM::Target: AChannelManager, K::Target: KVStore, - T::Target: BroadcasterInterface, { /// Constructs a `LSPS2ServiceHandler`. pub(crate) fn new( @@ -2044,12 +2042,11 @@ where } } -impl LSPSProtocolMessageHandler +impl LSPSProtocolMessageHandler for LSPS2ServiceHandler where CM::Target: AChannelManager, K::Target: KVStore, - T::Target: BroadcasterInterface, { type ProtocolMessage = LSPS2Message; const PROTOCOL_NUMBER: Option = Some(2); @@ -2119,20 +2116,19 @@ fn calculate_amount_to_forward_per_htlc( /// A synchroneous wrapper around [`LSPS2ServiceHandler`] to be used in contexts where async is not /// available. -pub struct LSPS2ServiceHandlerSync<'a, CM: Deref, K: Deref + Clone, T: Deref + Clone> +pub struct LSPS2ServiceHandlerSync<'a, CM: Deref, K: Deref + Clone, T: BroadcasterInterface + Clone> where CM::Target: AChannelManager, K::Target: KVStore, - T::Target: BroadcasterInterface, { inner: &'a LSPS2ServiceHandler, } -impl<'a, CM: Deref, K: Deref + Clone, T: Deref + Clone> LSPS2ServiceHandlerSync<'a, CM, K, T> +impl<'a, CM: Deref, K: Deref + Clone, T: BroadcasterInterface + Clone> + LSPS2ServiceHandlerSync<'a, CM, K, T> where CM::Target: AChannelManager, K::Target: KVStore, - T::Target: BroadcasterInterface, { pub(crate) fn from_inner(inner: &'a LSPS2ServiceHandler) -> Self { Self { inner } diff --git a/lightning-liquidity/src/manager.rs b/lightning-liquidity/src/manager.rs index 0b4f5efaa3c..84a52e2ab13 100644 --- a/lightning-liquidity/src/manager.rs +++ b/lightning-liquidity/src/manager.rs @@ -128,13 +128,19 @@ pub trait ALiquidityManager { /// A type that may be dereferenced to [`Self::TimeProvider`]. type TP: Deref + Clone; /// A type implementing [`BroadcasterInterface`]. - type BroadcasterInterface: BroadcasterInterface + ?Sized; - /// A type that may be dereferenced to [`Self::BroadcasterInterface`]. - type T: Deref + Clone; + type BroadcasterInterface: BroadcasterInterface + Clone; /// Returns a reference to the actual [`LiquidityManager`] object. fn get_lm( &self, - ) -> &LiquidityManager; + ) -> &LiquidityManager< + Self::ES, + Self::NS, + Self::CM, + Self::C, + Self::K, + Self::TP, + Self::BroadcasterInterface, + >; } impl< @@ -144,7 +150,7 @@ impl< C: Deref + Clone, K: Deref + Clone, TP: Deref + Clone, - T: Deref + Clone, + T: BroadcasterInterface + Clone, > ALiquidityManager for LiquidityManager where ES::Target: EntropySource, @@ -153,7 +159,6 @@ where C::Target: Filter, K::Target: KVStore, TP::Target: TimeProvider, - T::Target: BroadcasterInterface, { type EntropySource = ES::Target; type ES = ES; @@ -167,8 +172,7 @@ where type K = K; type TimeProvider = TP::Target; type TP = TP; - type BroadcasterInterface = T::Target; - type T = T; + type BroadcasterInterface = T; fn get_lm(&self) -> &LiquidityManager { self } @@ -204,9 +208,7 @@ pub trait ALiquidityManagerSync { /// A type that may be dereferenced to [`Self::TimeProvider`]. type TP: Deref + Clone; /// A type implementing [`BroadcasterInterface`]. - type BroadcasterInterface: BroadcasterInterface + ?Sized; - /// A type that may be dereferenced to [`Self::BroadcasterInterface`]. - type T: Deref + Clone; + type BroadcasterInterface: BroadcasterInterface + Clone; /// Returns the inner async [`LiquidityManager`] for testing purposes. #[cfg(any(test, feature = "_test_utils"))] fn get_lm_async( @@ -218,12 +220,20 @@ pub trait ALiquidityManagerSync { Self::C, KVStoreSyncWrapper, Self::TP, - Self::T, + Self::BroadcasterInterface, >; /// Returns a reference to the actual [`LiquidityManager`] object. fn get_lm( &self, - ) -> &LiquidityManagerSync; + ) -> &LiquidityManagerSync< + Self::ES, + Self::NS, + Self::CM, + Self::C, + Self::KS, + Self::TP, + Self::BroadcasterInterface, + >; } impl< @@ -233,7 +243,7 @@ impl< C: Deref + Clone, KS: Deref + Clone, TP: Deref + Clone, - T: Deref + Clone, + T: BroadcasterInterface + Clone, > ALiquidityManagerSync for LiquidityManagerSync where ES::Target: EntropySource, @@ -242,7 +252,6 @@ where C::Target: Filter, KS::Target: KVStoreSync, TP::Target: TimeProvider, - T::Target: BroadcasterInterface, { type EntropySource = ES::Target; type ES = ES; @@ -256,8 +265,7 @@ where type KS = KS; type TimeProvider = TP::Target; type TP = TP; - type BroadcasterInterface = T::Target; - type T = T; + type BroadcasterInterface = T; /// Returns the inner async [`LiquidityManager`] for testing purposes. #[cfg(any(test, feature = "_test_utils"))] fn get_lm_async( @@ -269,7 +277,7 @@ where Self::C, KVStoreSyncWrapper, Self::TP, - Self::T, + Self::BroadcasterInterface, > { &self.inner } @@ -304,7 +312,7 @@ pub struct LiquidityManager< C: Deref + Clone, K: Deref + Clone, TP: Deref + Clone, - T: Deref + Clone, + T: BroadcasterInterface + Clone, > where ES::Target: EntropySource, NS::Target: NodeSigner, @@ -312,7 +320,6 @@ pub struct LiquidityManager< C::Target: Filter, K::Target: KVStore, TP::Target: TimeProvider, - T::Target: BroadcasterInterface, { pending_messages: Arc, pending_events: Arc>, @@ -342,7 +349,7 @@ impl< CM: Deref + Clone, C: Deref + Clone, K: Deref + Clone, - T: Deref + Clone, + T: BroadcasterInterface + Clone, > LiquidityManager where ES::Target: EntropySource, @@ -350,7 +357,6 @@ where CM::Target: AChannelManager, C::Target: Filter, K::Target: KVStore, - T::Target: BroadcasterInterface, { /// Constructor for the [`LiquidityManager`] using the default system clock /// @@ -384,7 +390,7 @@ impl< C: Deref + Clone, K: Deref + Clone, TP: Deref + Clone, - T: Deref + Clone, + T: BroadcasterInterface + Clone, > LiquidityManager where ES::Target: EntropySource, @@ -393,7 +399,6 @@ where C::Target: Filter, K::Target: KVStore, TP::Target: TimeProvider, - T::Target: BroadcasterInterface, { /// Constructor for the [`LiquidityManager`] with a custom time provider. /// @@ -811,7 +816,7 @@ impl< C: Deref + Clone, K: Deref + Clone, TP: Deref + Clone, - T: Deref + Clone, + T: BroadcasterInterface + Clone, > CustomMessageReader for LiquidityManager where ES::Target: EntropySource, @@ -820,7 +825,6 @@ where C::Target: Filter, K::Target: KVStore, TP::Target: TimeProvider, - T::Target: BroadcasterInterface, { type CustomMessage = RawLSPSMessage; @@ -843,7 +847,7 @@ impl< C: Deref + Clone, K: Deref + Clone, TP: Deref + Clone, - T: Deref + Clone, + T: BroadcasterInterface + Clone, > CustomMessageHandler for LiquidityManager where ES::Target: EntropySource, @@ -852,7 +856,6 @@ where C::Target: Filter, K::Target: KVStore, TP::Target: TimeProvider, - T::Target: BroadcasterInterface, { fn handle_custom_message( &self, msg: Self::CustomMessage, sender_node_id: PublicKey, @@ -977,7 +980,7 @@ impl< C: Deref + Clone, K: Deref + Clone, TP: Deref + Clone, - T: Deref + Clone, + T: BroadcasterInterface + Clone, > Listen for LiquidityManager where ES::Target: EntropySource, @@ -986,7 +989,6 @@ where C::Target: Filter, K::Target: KVStore, TP::Target: TimeProvider, - T::Target: BroadcasterInterface, { fn filtered_block_connected( &self, header: &bitcoin::block::Header, txdata: &chain::transaction::TransactionData, @@ -1023,7 +1025,7 @@ impl< C: Deref + Clone, K: Deref + Clone, TP: Deref + Clone, - T: Deref + Clone, + T: BroadcasterInterface + Clone, > Confirm for LiquidityManager where ES::Target: EntropySource, @@ -1032,7 +1034,6 @@ where C::Target: Filter, K::Target: KVStore, TP::Target: TimeProvider, - T::Target: BroadcasterInterface, { fn transactions_confirmed( &self, _header: &bitcoin::block::Header, _txdata: &chain::transaction::TransactionData, @@ -1069,7 +1070,7 @@ pub struct LiquidityManagerSync< C: Deref + Clone, KS: Deref + Clone, TP: Deref + Clone, - T: Deref + Clone, + T: BroadcasterInterface + Clone, > where ES::Target: EntropySource, NS::Target: NodeSigner, @@ -1077,7 +1078,6 @@ pub struct LiquidityManagerSync< C::Target: Filter, KS::Target: KVStoreSync, TP::Target: TimeProvider, - T::Target: BroadcasterInterface, { inner: LiquidityManager, TP, T>, } @@ -1089,7 +1089,7 @@ impl< CM: Deref + Clone, C: Deref + Clone, KS: Deref + Clone, - T: Deref + Clone, + T: BroadcasterInterface + Clone, > LiquidityManagerSync where ES::Target: EntropySource, @@ -1097,7 +1097,6 @@ where CM::Target: AChannelManager, KS::Target: KVStoreSync, C::Target: Filter, - T::Target: BroadcasterInterface, { /// Constructor for the [`LiquidityManagerSync`] using the default system clock /// @@ -1142,7 +1141,7 @@ impl< C: Deref + Clone, KS: Deref + Clone, TP: Deref + Clone, - T: Deref + Clone, + T: BroadcasterInterface + Clone, > LiquidityManagerSync where ES::Target: EntropySource, @@ -1151,7 +1150,6 @@ where C::Target: Filter, KS::Target: KVStoreSync, TP::Target: TimeProvider, - T::Target: BroadcasterInterface, { /// Constructor for the [`LiquidityManagerSync`] with a custom time provider. /// @@ -1312,7 +1310,7 @@ impl< C: Deref + Clone, KS: Deref + Clone, TP: Deref + Clone, - T: Deref + Clone, + T: BroadcasterInterface + Clone, > CustomMessageReader for LiquidityManagerSync where ES::Target: EntropySource, @@ -1321,7 +1319,6 @@ where C::Target: Filter, KS::Target: KVStoreSync, TP::Target: TimeProvider, - T::Target: BroadcasterInterface, { type CustomMessage = RawLSPSMessage; @@ -1339,7 +1336,7 @@ impl< C: Deref + Clone, KS: Deref + Clone, TP: Deref + Clone, - T: Deref + Clone, + T: BroadcasterInterface + Clone, > CustomMessageHandler for LiquidityManagerSync where ES::Target: EntropySource, @@ -1348,7 +1345,6 @@ where C::Target: Filter, KS::Target: KVStoreSync, TP::Target: TimeProvider, - T::Target: BroadcasterInterface, { fn handle_custom_message( &self, msg: Self::CustomMessage, sender_node_id: PublicKey, @@ -1386,7 +1382,7 @@ impl< C: Deref + Clone, KS: Deref + Clone, TP: Deref + Clone, - T: Deref + Clone, + T: BroadcasterInterface + Clone, > Listen for LiquidityManagerSync where ES::Target: EntropySource, @@ -1395,7 +1391,6 @@ where C::Target: Filter, KS::Target: KVStoreSync, TP::Target: TimeProvider, - T::Target: BroadcasterInterface, { fn filtered_block_connected( &self, header: &bitcoin::block::Header, txdata: &chain::transaction::TransactionData, @@ -1416,7 +1411,7 @@ impl< C: Deref + Clone, KS: Deref + Clone, TP: Deref + Clone, - T: Deref + Clone, + T: BroadcasterInterface + Clone, > Confirm for LiquidityManagerSync where ES::Target: EntropySource, @@ -1425,7 +1420,6 @@ where C::Target: Filter, KS::Target: KVStoreSync, TP::Target: TimeProvider, - T::Target: BroadcasterInterface, { fn transactions_confirmed( &self, header: &bitcoin::block::Header, txdata: &chain::transaction::TransactionData, diff --git a/lightning/src/chain/chaininterface.rs b/lightning/src/chain/chaininterface.rs index 117e9b3af05..d21017c25bb 100644 --- a/lightning/src/chain/chaininterface.rs +++ b/lightning/src/chain/chaininterface.rs @@ -48,6 +48,12 @@ pub trait BroadcasterInterface { fn broadcast_transactions(&self, txs: &[&Transaction]); } +impl> BroadcasterInterface for B { + fn broadcast_transactions(&self, txs: &[&Transaction]) { + self.deref().broadcast_transactions(txs) + } +} + /// An enum that represents the priority at which we want a transaction to confirm used for feerate /// estimation. #[derive(Clone, Copy, Debug, Hash, PartialEq, Eq)] diff --git a/lightning/src/chain/chainmonitor.rs b/lightning/src/chain/chainmonitor.rs index 9fd6383cf7e..678c7b6ef5b 100644 --- a/lightning/src/chain/chainmonitor.rs +++ b/lightning/src/chain/chainmonitor.rs @@ -261,14 +261,13 @@ pub struct AsyncPersister< L: Deref + MaybeSend + MaybeSync + 'static, ES: Deref + MaybeSend + MaybeSync + 'static, SP: Deref + MaybeSend + MaybeSync + 'static, - BI: Deref + MaybeSend + MaybeSync + 'static, + BI: BroadcasterInterface + MaybeSend + MaybeSync + 'static, FE: Deref + MaybeSend + MaybeSync + 'static, > where K::Target: KVStore + MaybeSync, L::Target: Logger, ES::Target: EntropySource + Sized, SP::Target: SignerProvider + Sized, - BI::Target: BroadcasterInterface, FE::Target: FeeEstimator, { persister: MonitorUpdatingPersisterAsync, @@ -281,7 +280,7 @@ impl< L: Deref + MaybeSend + MaybeSync + 'static, ES: Deref + MaybeSend + MaybeSync + 'static, SP: Deref + MaybeSend + MaybeSync + 'static, - BI: Deref + MaybeSend + MaybeSync + 'static, + BI: BroadcasterInterface + MaybeSend + MaybeSync + 'static, FE: Deref + MaybeSend + MaybeSync + 'static, > Deref for AsyncPersister where @@ -289,7 +288,6 @@ where L::Target: Logger, ES::Target: EntropySource + Sized, SP::Target: SignerProvider + Sized, - BI::Target: BroadcasterInterface, FE::Target: FeeEstimator, { type Target = Self; @@ -304,7 +302,7 @@ impl< L: Deref + MaybeSend + MaybeSync + 'static, ES: Deref + MaybeSend + MaybeSync + 'static, SP: Deref + MaybeSend + MaybeSync + 'static, - BI: Deref + MaybeSend + MaybeSync + 'static, + BI: BroadcasterInterface + MaybeSend + MaybeSync + 'static, FE: Deref + MaybeSend + MaybeSync + 'static, > Persist<::EcdsaSigner> for AsyncPersister where @@ -312,7 +310,6 @@ where L::Target: Logger, ES::Target: EntropySource + Sized, SP::Target: SignerProvider + Sized, - BI::Target: BroadcasterInterface, FE::Target: FeeEstimator, ::EcdsaSigner: MaybeSend + 'static, { @@ -362,14 +359,13 @@ where pub struct ChainMonitor< ChannelSigner: EcdsaChannelSigner, C: Deref, - T: Deref, + T: BroadcasterInterface, F: Deref, L: Deref, P: Deref, ES: Deref, > where C::Target: chain::Filter, - T::Target: BroadcasterInterface, F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist, @@ -404,7 +400,7 @@ impl< S: FutureSpawner, SP: Deref + MaybeSend + MaybeSync + 'static, C: Deref, - T: Deref + MaybeSend + MaybeSync + 'static, + T: BroadcasterInterface + MaybeSend + MaybeSync + 'static, F: Deref + MaybeSend + MaybeSync + 'static, L: Deref + MaybeSend + MaybeSync + 'static, ES: Deref + MaybeSend + MaybeSync + 'static, @@ -421,7 +417,6 @@ impl< K::Target: KVStore + MaybeSync, SP::Target: SignerProvider + Sized, C::Target: chain::Filter, - T::Target: BroadcasterInterface, F::Target: FeeEstimator, L::Target: Logger, ES::Target: EntropySource + Sized, @@ -462,7 +457,7 @@ impl< impl< ChannelSigner: EcdsaChannelSigner, C: Deref, - T: Deref, + T: BroadcasterInterface, F: Deref, L: Deref, P: Deref, @@ -470,7 +465,6 @@ impl< > ChainMonitor where C::Target: chain::Filter, - T::Target: BroadcasterInterface, F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist, @@ -895,7 +889,7 @@ where let monitors = self.monitors.read().unwrap(); for (_, monitor_holder) in &*monitors { monitor_holder.monitor.rebroadcast_pending_claims( - &*self.broadcaster, + &self.broadcaster, &*self.fee_estimator, &self.logger, ) @@ -911,7 +905,7 @@ where if let Some(channel_id) = monitor_opt { if let Some(monitor_holder) = monitors.get(&channel_id) { monitor_holder.monitor.signer_unblocked( - &*self.broadcaster, + &self.broadcaster, &*self.fee_estimator, &self.logger, ) @@ -919,7 +913,7 @@ where } else { for (_, monitor_holder) in &*monitors { monitor_holder.monitor.signer_unblocked( - &*self.broadcaster, + &self.broadcaster, &*self.fee_estimator, &self.logger, ) @@ -1109,7 +1103,7 @@ where impl< ChannelSigner: EcdsaChannelSigner, C: Deref, - T: Deref, + T: BroadcasterInterface, F: Deref, L: Deref, P: Deref, @@ -1117,7 +1111,6 @@ impl< > BaseMessageHandler for ChainMonitor where C::Target: chain::Filter, - T::Target: BroadcasterInterface, F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist, @@ -1148,7 +1141,7 @@ where impl< ChannelSigner: EcdsaChannelSigner, C: Deref, - T: Deref, + T: BroadcasterInterface, F: Deref, L: Deref, P: Deref, @@ -1156,7 +1149,6 @@ impl< > SendOnlyMessageHandler for ChainMonitor where C::Target: chain::Filter, - T::Target: BroadcasterInterface, F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist, @@ -1167,7 +1159,7 @@ where impl< ChannelSigner: EcdsaChannelSigner, C: Deref, - T: Deref, + T: BroadcasterInterface, F: Deref, L: Deref, P: Deref, @@ -1175,7 +1167,6 @@ impl< > chain::Listen for ChainMonitor where C::Target: chain::Filter, - T::Target: BroadcasterInterface, F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist, @@ -1193,7 +1184,7 @@ where header, txdata, height, - &*self.broadcaster, + &self.broadcaster, &*self.fee_estimator, &self.logger, ) @@ -1220,7 +1211,7 @@ where for monitor_state in monitor_states.values() { monitor_state.monitor.blocks_disconnected( fork_point, - &*self.broadcaster, + &self.broadcaster, &*self.fee_estimator, &self.logger, ); @@ -1231,7 +1222,7 @@ where impl< ChannelSigner: EcdsaChannelSigner, C: Deref, - T: Deref, + T: BroadcasterInterface, F: Deref, L: Deref, P: Deref, @@ -1239,7 +1230,6 @@ impl< > chain::Confirm for ChainMonitor where C::Target: chain::Filter, - T::Target: BroadcasterInterface, F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist, @@ -1258,7 +1248,7 @@ where header, txdata, height, - &*self.broadcaster, + &self.broadcaster, &*self.fee_estimator, &self.logger, ) @@ -1273,7 +1263,7 @@ where for monitor_state in monitor_states.values() { monitor_state.monitor.transaction_unconfirmed( txid, - &*self.broadcaster, + &self.broadcaster, &*self.fee_estimator, &self.logger, ); @@ -1294,7 +1284,7 @@ where monitor.best_block_updated( header, height, - &*self.broadcaster, + &self.broadcaster, &*self.fee_estimator, &self.logger, ) @@ -1326,7 +1316,7 @@ where impl< ChannelSigner: EcdsaChannelSigner, C: Deref, - T: Deref, + T: BroadcasterInterface, F: Deref, L: Deref, P: Deref, @@ -1334,7 +1324,6 @@ impl< > chain::Watch for ChainMonitor where C::Target: chain::Filter, - T::Target: BroadcasterInterface, F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist, @@ -1522,7 +1511,7 @@ where impl< ChannelSigner: EcdsaChannelSigner, C: Deref, - T: Deref, + T: BroadcasterInterface, F: Deref, L: Deref, P: Deref, @@ -1530,7 +1519,6 @@ impl< > events::EventsProvider for ChainMonitor where C::Target: chain::Filter, - T::Target: BroadcasterInterface, F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist, diff --git a/lightning/src/chain/channelmonitor.rs b/lightning/src/chain/channelmonitor.rs index 515a3dc5f1d..e91bb16e531 100644 --- a/lightning/src/chain/channelmonitor.rs +++ b/lightning/src/chain/channelmonitor.rs @@ -2076,7 +2076,7 @@ impl ChannelMonitor { /// /// [`ChannelManager`]: crate::ln::channelmanager::ChannelManager #[rustfmt::skip] - pub(crate) fn provide_payment_preimage_unsafe_legacy( + pub(crate) fn provide_payment_preimage_unsafe_legacy( &self, payment_hash: &PaymentHash, payment_preimage: &PaymentPreimage, @@ -2084,7 +2084,6 @@ impl ChannelMonitor { fee_estimator: &LowerBoundedFeeEstimator, logger: &L, ) where - B::Target: BroadcasterInterface, F::Target: FeeEstimator, L::Target: Logger, { @@ -2101,11 +2100,10 @@ impl ChannelMonitor { /// itself. /// /// panics if the given update is not the next update by update_id. - pub fn update_monitor( + pub fn update_monitor( &self, updates: &ChannelMonitorUpdate, broadcaster: &B, fee_estimator: &F, logger: &L, ) -> Result<(), ()> where - B::Target: BroadcasterInterface, F::Target: FeeEstimator, L::Target: Logger, { @@ -2356,10 +2354,9 @@ impl ChannelMonitor { /// transactions that cannot be confirmed until the funding transaction is visible. /// /// [`Event::BumpTransaction`]: crate::events::Event::BumpTransaction - pub fn broadcast_latest_holder_commitment_txn( + pub fn broadcast_latest_holder_commitment_txn( &self, broadcaster: &B, fee_estimator: &F, logger: &L, ) where - B::Target: BroadcasterInterface, F::Target: FeeEstimator, L::Target: Logger, { @@ -2400,7 +2397,7 @@ impl ChannelMonitor { /// /// [`get_outputs_to_watch`]: #method.get_outputs_to_watch #[rustfmt::skip] - pub fn block_connected( + pub fn block_connected( &self, header: &Header, txdata: &TransactionData, @@ -2410,7 +2407,6 @@ impl ChannelMonitor { logger: &L, ) -> Vec where - B::Target: BroadcasterInterface, F::Target: FeeEstimator, L::Target: Logger, { @@ -2422,10 +2418,9 @@ impl ChannelMonitor { /// Determines if the disconnected block contained any transactions of interest and updates /// appropriately. - pub fn blocks_disconnected( + pub fn blocks_disconnected( &self, fork_point: BestBlock, broadcaster: B, fee_estimator: F, logger: &L, ) where - B::Target: BroadcasterInterface, F::Target: FeeEstimator, L::Target: Logger, { @@ -2442,7 +2437,7 @@ impl ChannelMonitor { /// /// [`block_connected`]: Self::block_connected #[rustfmt::skip] - pub fn transactions_confirmed( + pub fn transactions_confirmed( &self, header: &Header, txdata: &TransactionData, @@ -2452,7 +2447,6 @@ impl ChannelMonitor { logger: &L, ) -> Vec where - B::Target: BroadcasterInterface, F::Target: FeeEstimator, L::Target: Logger, { @@ -2470,14 +2464,13 @@ impl ChannelMonitor { /// /// [`blocks_disconnected`]: Self::blocks_disconnected #[rustfmt::skip] - pub fn transaction_unconfirmed( + pub fn transaction_unconfirmed( &self, txid: &Txid, broadcaster: B, fee_estimator: F, logger: &L, ) where - B::Target: BroadcasterInterface, F::Target: FeeEstimator, L::Target: Logger, { @@ -2497,7 +2490,7 @@ impl ChannelMonitor { /// /// [`block_connected`]: Self::block_connected #[rustfmt::skip] - pub fn best_block_updated( + pub fn best_block_updated( &self, header: &Header, height: u32, @@ -2506,7 +2499,6 @@ impl ChannelMonitor { logger: &L, ) -> Vec where - B::Target: BroadcasterInterface, F::Target: FeeEstimator, L::Target: Logger, { @@ -2544,11 +2536,10 @@ impl ChannelMonitor { /// invoking this every 30 seconds, or lower if running in an environment with spotty /// connections, like on mobile. #[rustfmt::skip] - pub fn rebroadcast_pending_claims( + pub fn rebroadcast_pending_claims( &self, broadcaster: B, fee_estimator: F, logger: &L, ) where - B::Target: BroadcasterInterface, F::Target: FeeEstimator, L::Target: Logger, { @@ -2572,11 +2563,10 @@ impl ChannelMonitor { /// Triggers rebroadcasts of pending claims from a force-closed channel after a transaction /// signature generation failure. #[rustfmt::skip] - pub fn signer_unblocked( + pub fn signer_unblocked( &self, broadcaster: B, fee_estimator: F, logger: &L, ) where - B::Target: BroadcasterInterface, F::Target: FeeEstimator, L::Target: Logger, { @@ -3826,12 +3816,11 @@ impl ChannelMonitorImpl { /// /// Note that this is often called multiple times for the same payment and must be idempotent. #[rustfmt::skip] - fn provide_payment_preimage( + fn provide_payment_preimage( &mut self, payment_hash: &PaymentHash, payment_preimage: &PaymentPreimage, payment_info: &Option, broadcaster: &B, fee_estimator: &LowerBoundedFeeEstimator, logger: &WithChannelMonitor) - where B::Target: BroadcasterInterface, - F::Target: FeeEstimator, + where F::Target: FeeEstimator, L::Target: Logger, { self.payment_preimages.entry(payment_hash.clone()) @@ -4005,12 +3994,11 @@ impl ChannelMonitorImpl { /// See also [`ChannelMonitor::broadcast_latest_holder_commitment_txn`]. /// /// [`ChannelMonitor::broadcast_latest_holder_commitment_txn`]: crate::chain::channelmonitor::ChannelMonitor::broadcast_latest_holder_commitment_txn - pub(crate) fn queue_latest_holder_commitment_txn_for_broadcast( + pub(crate) fn queue_latest_holder_commitment_txn_for_broadcast( &mut self, broadcaster: &B, fee_estimator: &LowerBoundedFeeEstimator, logger: &WithChannelMonitor, require_funding_seen: bool, ) where - B::Target: BroadcasterInterface, F::Target: FeeEstimator, L::Target: Logger, { @@ -4209,11 +4197,10 @@ impl ChannelMonitorImpl { } #[rustfmt::skip] - fn update_monitor( + fn update_monitor( &mut self, updates: &ChannelMonitorUpdate, broadcaster: &B, fee_estimator: &F, logger: &WithChannelMonitor ) -> Result<(), ()> - where B::Target: BroadcasterInterface, - F::Target: FeeEstimator, + where F::Target: FeeEstimator, L::Target: Logger, { if self.latest_update_id == LEGACY_CLOSED_CHANNEL_UPDATE_ID && updates.update_id == LEGACY_CLOSED_CHANNEL_UPDATE_ID { @@ -5305,12 +5292,11 @@ impl ChannelMonitorImpl { } #[rustfmt::skip] - fn block_connected( + fn block_connected( &mut self, header: &Header, txdata: &TransactionData, height: u32, broadcaster: B, fee_estimator: F, logger: &WithChannelMonitor, ) -> Vec - where B::Target: BroadcasterInterface, - F::Target: FeeEstimator, + where F::Target: FeeEstimator, L::Target: Logger, { let block_hash = header.block_hash(); @@ -5321,7 +5307,7 @@ impl ChannelMonitorImpl { } #[rustfmt::skip] - fn best_block_updated( + fn best_block_updated( &mut self, header: &Header, height: u32, @@ -5330,7 +5316,6 @@ impl ChannelMonitorImpl { logger: &WithChannelMonitor, ) -> Vec where - B::Target: BroadcasterInterface, F::Target: FeeEstimator, L::Target: Logger, { @@ -5353,7 +5338,7 @@ impl ChannelMonitorImpl { } #[rustfmt::skip] - fn transactions_confirmed( + fn transactions_confirmed( &mut self, header: &Header, txdata: &TransactionData, @@ -5363,7 +5348,6 @@ impl ChannelMonitorImpl { logger: &WithChannelMonitor, ) -> Vec where - B::Target: BroadcasterInterface, F::Target: FeeEstimator, L::Target: Logger, { @@ -5638,7 +5622,7 @@ impl ChannelMonitorImpl { /// `conf_height` should be set to the height at which any new transaction(s)/block(s) were /// confirmed at, even if it is not the current best height. #[rustfmt::skip] - fn block_confirmed( + fn block_confirmed( &mut self, conf_height: u32, conf_hash: BlockHash, @@ -5650,7 +5634,6 @@ impl ChannelMonitorImpl { logger: &WithChannelMonitor, ) -> Vec where - B::Target: BroadcasterInterface, F::Target: FeeEstimator, L::Target: Logger, { @@ -5866,10 +5849,9 @@ impl ChannelMonitorImpl { } #[rustfmt::skip] - fn blocks_disconnected( + fn blocks_disconnected( &mut self, fork_point: BestBlock, broadcaster: B, fee_estimator: F, logger: &WithChannelMonitor - ) where B::Target: BroadcasterInterface, - F::Target: FeeEstimator, + ) where F::Target: FeeEstimator, L::Target: Logger, { let new_height = fork_point.height; @@ -5915,14 +5897,13 @@ impl ChannelMonitorImpl { } #[rustfmt::skip] - fn transaction_unconfirmed( + fn transaction_unconfirmed( &mut self, txid: &Txid, broadcaster: B, fee_estimator: &LowerBoundedFeeEstimator, logger: &WithChannelMonitor, ) where - B::Target: BroadcasterInterface, F::Target: FeeEstimator, L::Target: Logger, { @@ -6376,39 +6357,38 @@ impl ChannelMonitorImpl { } } -impl chain::Listen +impl chain::Listen for (ChannelMonitor, T, F, L) where - T::Target: BroadcasterInterface, F::Target: FeeEstimator, L::Target: Logger, { fn filtered_block_connected(&self, header: &Header, txdata: &TransactionData, height: u32) { - self.0.block_connected(header, txdata, height, &*self.1, &*self.2, &self.3); + self.0.block_connected(header, txdata, height, &self.1, &*self.2, &self.3); } fn blocks_disconnected(&self, fork_point: BestBlock) { - self.0.blocks_disconnected(fork_point, &*self.1, &*self.2, &self.3); + self.0.blocks_disconnected(fork_point, &self.1, &*self.2, &self.3); } } -impl chain::Confirm for (M, T, F, L) +impl chain::Confirm + for (M, T, F, L) where M: Deref>, - T::Target: BroadcasterInterface, F::Target: FeeEstimator, L::Target: Logger, { fn transactions_confirmed(&self, header: &Header, txdata: &TransactionData, height: u32) { - self.0.transactions_confirmed(header, txdata, height, &*self.1, &*self.2, &self.3); + self.0.transactions_confirmed(header, txdata, height, &self.1, &*self.2, &self.3); } fn transaction_unconfirmed(&self, txid: &Txid) { - self.0.transaction_unconfirmed(txid, &*self.1, &*self.2, &self.3); + self.0.transaction_unconfirmed(txid, &self.1, &*self.2, &self.3); } fn best_block_updated(&self, header: &Header, height: u32) { - self.0.best_block_updated(header, height, &*self.1, &*self.2, &self.3); + self.0.best_block_updated(header, height, &self.1, &*self.2, &self.3); } fn get_relevant_txids(&self) -> Vec<(Txid, u32, Option)> { diff --git a/lightning/src/chain/onchaintx.rs b/lightning/src/chain/onchaintx.rs index fb65aa0f157..321b6008683 100644 --- a/lightning/src/chain/onchaintx.rs +++ b/lightning/src/chain/onchaintx.rs @@ -485,13 +485,12 @@ impl OnchainTxHandler { /// invoking this every 30 seconds, or lower if running in an environment with spotty /// connections, like on mobile. #[rustfmt::skip] - pub(super) fn rebroadcast_pending_claims( + pub(super) fn rebroadcast_pending_claims( &mut self, current_height: u32, feerate_strategy: FeerateStrategy, broadcaster: &B, conf_target: ConfirmationTarget, destination_script: &Script, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, ) where - B::Target: BroadcasterInterface, F::Target: FeeEstimator, { let mut bump_requests = Vec::with_capacity(self.pending_claim_requests.len()); @@ -761,14 +760,11 @@ impl OnchainTxHandler { /// does not need to equal the current blockchain tip height, which should be provided via /// `cur_height`, however it must never be higher than `cur_height`. #[rustfmt::skip] - pub(super) fn update_claims_view_from_requests( + pub(super) fn update_claims_view_from_requests( &mut self, mut requests: Vec, conf_height: u32, cur_height: u32, broadcaster: &B, conf_target: ConfirmationTarget, destination_script: &Script, fee_estimator: &LowerBoundedFeeEstimator, logger: &L - ) where - B::Target: BroadcasterInterface, - F::Target: FeeEstimator, - { + ) where F::Target: FeeEstimator, { if !requests.is_empty() { log_debug!(logger, "Updating claims view at height {} with {} claim requests", cur_height, requests.len()); } @@ -912,12 +908,11 @@ impl OnchainTxHandler { /// confirmed. This does not need to equal the current blockchain tip height, which should be /// provided via `cur_height`, however it must never be higher than `cur_height`. #[rustfmt::skip] - pub(super) fn update_claims_view_from_matched_txn( + pub(super) fn update_claims_view_from_matched_txn( &mut self, txn_matched: &[&Transaction], conf_height: u32, conf_hash: BlockHash, cur_height: u32, broadcaster: &B, conf_target: ConfirmationTarget, destination_script: &Script, fee_estimator: &LowerBoundedFeeEstimator, logger: &L ) where - B::Target: BroadcasterInterface, F::Target: FeeEstimator, { let mut have_logged_intro = false; @@ -1110,7 +1105,7 @@ impl OnchainTxHandler { } #[rustfmt::skip] - pub(super) fn transaction_unconfirmed( + pub(super) fn transaction_unconfirmed( &mut self, txid: &Txid, broadcaster: &B, @@ -1119,7 +1114,6 @@ impl OnchainTxHandler { fee_estimator: &LowerBoundedFeeEstimator, logger: &L, ) where - B::Target: BroadcasterInterface, F::Target: FeeEstimator, { let mut height = None; @@ -1138,13 +1132,10 @@ impl OnchainTxHandler { } #[rustfmt::skip] - pub(super) fn blocks_disconnected( + pub(super) fn blocks_disconnected( &mut self, new_best_height: u32, broadcaster: &B, conf_target: ConfirmationTarget, destination_script: &Script, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, - ) - where B::Target: BroadcasterInterface, - F::Target: FeeEstimator, - { + ) where F::Target: FeeEstimator, { let mut bump_candidates = new_hash_map(); let onchain_events_awaiting_threshold_conf = self.onchain_events_awaiting_threshold_conf.drain(..).collect::>(); diff --git a/lightning/src/events/bump_transaction/mod.rs b/lightning/src/events/bump_transaction/mod.rs index e141d9b8abc..b45b65940ee 100644 --- a/lightning/src/events/bump_transaction/mod.rs +++ b/lightning/src/events/bump_transaction/mod.rs @@ -694,9 +694,8 @@ where /// /// [`Event::BumpTransaction`]: crate::events::Event::BumpTransaction // Note that updates to documentation on this struct should be copied to the synchronous version. -pub struct BumpTransactionEventHandler +pub struct BumpTransactionEventHandler where - B::Target: BroadcasterInterface, C::Target: CoinSelectionSource, SP::Target: SignerProvider, L::Target: Logger, @@ -708,9 +707,9 @@ where secp: Secp256k1, } -impl BumpTransactionEventHandler +impl + BumpTransactionEventHandler where - B::Target: BroadcasterInterface, C::Target: CoinSelectionSource, SP::Target: SignerProvider, L::Target: Logger, diff --git a/lightning/src/events/bump_transaction/sync.rs b/lightning/src/events/bump_transaction/sync.rs index 1328c2c1b3a..bf0668ccba3 100644 --- a/lightning/src/events/bump_transaction/sync.rs +++ b/lightning/src/events/bump_transaction/sync.rs @@ -267,9 +267,8 @@ where /// /// [`Event::BumpTransaction`]: crate::events::Event::BumpTransaction // Note that updates to documentation on this struct should be copied to the synchronous version. -pub struct BumpTransactionEventHandlerSync +pub struct BumpTransactionEventHandlerSync where - B::Target: BroadcasterInterface, C::Target: CoinSelectionSourceSync, SP::Target: SignerProvider, L::Target: Logger, @@ -278,9 +277,9 @@ where BumpTransactionEventHandler, SP, L>, } -impl BumpTransactionEventHandlerSync +impl + BumpTransactionEventHandlerSync where - B::Target: BroadcasterInterface, C::Target: CoinSelectionSourceSync, SP::Target: SignerProvider, L::Target: Logger, diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs index 69a2d2f19a6..fcd3bc3637c 100644 --- a/lightning/src/ln/channelmanager.rs +++ b/lightning/src/ln/channelmanager.rs @@ -1776,9 +1776,7 @@ pub trait AChannelManager { /// A type that may be dereferenced to [`Self::Watch`]. type M: Deref; /// A type implementing [`BroadcasterInterface`]. - type Broadcaster: BroadcasterInterface + ?Sized; - /// A type that may be dereferenced to [`Self::Broadcaster`]. - type T: Deref; + type Broadcaster: BroadcasterInterface; /// A type implementing [`EntropySource`]. type EntropySource: EntropySource + ?Sized; /// A type that may be dereferenced to [`Self::EntropySource`]. @@ -1814,7 +1812,7 @@ pub trait AChannelManager { &self, ) -> &ChannelManager< Self::M, - Self::T, + Self::Broadcaster, Self::ES, Self::NS, Self::SP, @@ -1827,7 +1825,7 @@ pub trait AChannelManager { impl< M: Deref, - T: Deref, + T: BroadcasterInterface, ES: Deref, NS: Deref, SP: Deref, @@ -1838,7 +1836,6 @@ impl< > AChannelManager for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - T::Target: BroadcasterInterface, ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, @@ -1849,8 +1846,7 @@ where { type Watch = M::Target; type M = M; - type Broadcaster = T::Target; - type T = T; + type Broadcaster = T; type EntropySource = ES::Target; type ES = ES; type NodeSigner = NS::Target; @@ -2652,7 +2648,7 @@ where // pub struct ChannelManager< M: Deref, - T: Deref, + T: BroadcasterInterface, ES: Deref, NS: Deref, SP: Deref, @@ -2662,7 +2658,6 @@ pub struct ChannelManager< L: Deref, > where M::Target: chain::Watch<::EcdsaSigner>, - T::Target: BroadcasterInterface, ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, @@ -3728,7 +3723,7 @@ fn create_htlc_intercepted_event( impl< M: Deref, - T: Deref, + T: BroadcasterInterface, ES: Deref, NS: Deref, SP: Deref, @@ -3739,7 +3734,6 @@ impl< > ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - T::Target: BroadcasterInterface, ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, @@ -13203,7 +13197,7 @@ macro_rules! create_refund_builder { ($self: ident, $builder: ty) => { impl< M: Deref, - T: Deref, + T: BroadcasterInterface, ES: Deref, NS: Deref, SP: Deref, @@ -13214,7 +13208,6 @@ impl< > ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - T::Target: BroadcasterInterface, ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, @@ -14055,7 +14048,7 @@ where impl< M: Deref, - T: Deref, + T: BroadcasterInterface, ES: Deref, NS: Deref, SP: Deref, @@ -14066,7 +14059,6 @@ impl< > BaseMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - T::Target: BroadcasterInterface, ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, @@ -14413,7 +14405,7 @@ where impl< M: Deref, - T: Deref, + T: BroadcasterInterface, ES: Deref, NS: Deref, SP: Deref, @@ -14424,7 +14416,6 @@ impl< > EventsProvider for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - T::Target: BroadcasterInterface, ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, @@ -14448,7 +14439,7 @@ where impl< M: Deref, - T: Deref, + T: BroadcasterInterface, ES: Deref, NS: Deref, SP: Deref, @@ -14459,7 +14450,6 @@ impl< > chain::Listen for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - T::Target: BroadcasterInterface, ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, @@ -14509,7 +14499,7 @@ where impl< M: Deref, - T: Deref, + T: BroadcasterInterface, ES: Deref, NS: Deref, SP: Deref, @@ -14520,7 +14510,6 @@ impl< > chain::Confirm for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - T::Target: BroadcasterInterface, ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, @@ -14682,7 +14671,7 @@ pub(super) enum FundingConfirmedMessage { impl< M: Deref, - T: Deref, + T: BroadcasterInterface, ES: Deref, NS: Deref, SP: Deref, @@ -14693,7 +14682,6 @@ impl< > ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - T::Target: BroadcasterInterface, ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, @@ -15044,7 +15032,7 @@ where impl< M: Deref, - T: Deref, + T: BroadcasterInterface, ES: Deref, NS: Deref, SP: Deref, @@ -15055,7 +15043,6 @@ impl< > ChannelMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - T::Target: BroadcasterInterface, ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, @@ -15619,7 +15606,7 @@ where impl< M: Deref, - T: Deref, + T: BroadcasterInterface, ES: Deref, NS: Deref, SP: Deref, @@ -15630,7 +15617,6 @@ impl< > OffersMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - T::Target: BroadcasterInterface, ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, @@ -15837,7 +15823,7 @@ where impl< M: Deref, - T: Deref, + T: BroadcasterInterface, ES: Deref, NS: Deref, SP: Deref, @@ -15848,7 +15834,6 @@ impl< > AsyncPaymentsMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - T::Target: BroadcasterInterface, ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, @@ -16039,7 +16024,7 @@ where #[cfg(feature = "dnssec")] impl< M: Deref, - T: Deref, + T: BroadcasterInterface, ES: Deref, NS: Deref, SP: Deref, @@ -16050,7 +16035,6 @@ impl< > DNSResolverMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - T::Target: BroadcasterInterface, ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, @@ -16107,7 +16091,7 @@ where impl< M: Deref, - T: Deref, + T: BroadcasterInterface, ES: Deref, NS: Deref, SP: Deref, @@ -16118,7 +16102,6 @@ impl< > NodeIdLookUp for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - T::Target: BroadcasterInterface, ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, @@ -16623,7 +16606,7 @@ impl_writeable_tlv_based!(PendingInboundPayment, { impl< M: Deref, - T: Deref, + T: BroadcasterInterface, ES: Deref, NS: Deref, SP: Deref, @@ -16634,7 +16617,6 @@ impl< > Writeable for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - T::Target: BroadcasterInterface, ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, @@ -16990,7 +16972,7 @@ impl Readable for VecDeque<(Event, Option)> { pub struct ChannelManagerReadArgs< 'a, M: Deref, - T: Deref, + T: BroadcasterInterface, ES: Deref, NS: Deref, SP: Deref, @@ -17000,7 +16982,6 @@ pub struct ChannelManagerReadArgs< L: Deref + Clone, > where M::Target: chain::Watch<::EcdsaSigner>, - T::Target: BroadcasterInterface, ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, @@ -17070,7 +17051,7 @@ pub struct ChannelManagerReadArgs< impl< 'a, M: Deref, - T: Deref, + T: BroadcasterInterface, ES: Deref, NS: Deref, SP: Deref, @@ -17081,7 +17062,6 @@ impl< > ChannelManagerReadArgs<'a, M, T, ES, NS, SP, F, R, MR, L> where M::Target: chain::Watch<::EcdsaSigner>, - T::Target: BroadcasterInterface, ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, @@ -17158,7 +17138,7 @@ fn dedup_decode_update_add_htlcs( impl< 'a, M: Deref, - T: Deref, + T: BroadcasterInterface, ES: Deref, NS: Deref, SP: Deref, @@ -17170,7 +17150,6 @@ impl< for (BlockHash, Arc>) where M::Target: chain::Watch<::EcdsaSigner>, - T::Target: BroadcasterInterface, ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, @@ -17191,7 +17170,7 @@ where impl< 'a, M: Deref, - T: Deref, + T: BroadcasterInterface, ES: Deref, NS: Deref, SP: Deref, @@ -17203,7 +17182,6 @@ impl< for (BlockHash, ChannelManager) where M::Target: chain::Watch<::EcdsaSigner>, - T::Target: BroadcasterInterface, ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, diff --git a/lightning/src/ln/functional_test_utils.rs b/lightning/src/ln/functional_test_utils.rs index 00fbca201cd..c4fd4f694a3 100644 --- a/lightning/src/ln/functional_test_utils.rs +++ b/lightning/src/ln/functional_test_utils.rs @@ -732,7 +732,7 @@ pub trait NodeHolder { &self, ) -> &ChannelManager< ::M, - ::T, + ::Broadcaster, ::ES, ::NS, ::SP, @@ -749,7 +749,7 @@ impl NodeHolder for &H { &self, ) -> &ChannelManager< ::M, - ::T, + ::Broadcaster, ::ES, ::NS, ::SP, diff --git a/lightning/src/util/anchor_channel_reserves.rs b/lightning/src/util/anchor_channel_reserves.rs index e50e103211f..26212ca3966 100644 --- a/lightning/src/util/anchor_channel_reserves.rs +++ b/lightning/src/util/anchor_channel_reserves.rs @@ -273,7 +273,7 @@ pub fn can_support_additional_anchor_channel< AChannelManagerRef: Deref, ChannelSigner: EcdsaChannelSigner, FilterRef: Deref, - BroadcasterRef: Deref, + B: BroadcasterInterface, EstimatorRef: Deref, LoggerRef: Deref, PersistRef: Deref, @@ -282,7 +282,7 @@ pub fn can_support_additional_anchor_channel< Target = ChainMonitor< ChannelSigner, FilterRef, - BroadcasterRef, + B, EstimatorRef, LoggerRef, PersistRef, @@ -296,7 +296,6 @@ pub fn can_support_additional_anchor_channel< where AChannelManagerRef::Target: AChannelManager, FilterRef::Target: Filter, - BroadcasterRef::Target: BroadcasterInterface, EstimatorRef::Target: FeeEstimator, LoggerRef::Target: Logger, PersistRef::Target: Persist, diff --git a/lightning/src/util/persist.rs b/lightning/src/util/persist.rs index 2e1e8805d0a..92a565a28f8 100644 --- a/lightning/src/util/persist.rs +++ b/lightning/src/util/persist.rs @@ -588,25 +588,28 @@ fn poll_sync_future(future: F) -> F::Output { /// If you have many stale updates stored (such as after a crash with pending lazy deletes), and /// would like to get rid of them, consider using the /// [`MonitorUpdatingPersister::cleanup_stale_updates`] function. -pub struct MonitorUpdatingPersister( - MonitorUpdatingPersisterAsync, PanicingSpawner, L, ES, SP, BI, FE>, -) +pub struct MonitorUpdatingPersister< + K: Deref, + L: Deref, + ES: Deref, + SP: Deref, + BI: BroadcasterInterface, + FE: Deref, +>(MonitorUpdatingPersisterAsync, PanicingSpawner, L, ES, SP, BI, FE>) where K::Target: KVStoreSync, L::Target: Logger, ES::Target: EntropySource + Sized, SP::Target: SignerProvider + Sized, - BI::Target: BroadcasterInterface, FE::Target: FeeEstimator; -impl +impl MonitorUpdatingPersister where K::Target: KVStoreSync, L::Target: Logger, ES::Target: EntropySource + Sized, SP::Target: SignerProvider + Sized, - BI::Target: BroadcasterInterface, FE::Target: FeeEstimator, { /// Constructs a new [`MonitorUpdatingPersister`]. @@ -697,7 +700,7 @@ impl< L: Deref, ES: Deref, SP: Deref, - BI: Deref, + BI: BroadcasterInterface, FE: Deref, > Persist for MonitorUpdatingPersister where @@ -705,7 +708,6 @@ where L::Target: Logger, ES::Target: EntropySource + Sized, SP::Target: SignerProvider + Sized, - BI::Target: BroadcasterInterface, FE::Target: FeeEstimator, { /// Persists a new channel. This means writing the entire monitor to the @@ -783,7 +785,7 @@ pub struct MonitorUpdatingPersisterAsync< L: Deref, ES: Deref, SP: Deref, - BI: Deref, + BI: BroadcasterInterface, FE: Deref, >(Arc>) where @@ -791,7 +793,6 @@ where L::Target: Logger, ES::Target: EntropySource + Sized, SP::Target: SignerProvider + Sized, - BI::Target: BroadcasterInterface, FE::Target: FeeEstimator; struct MonitorUpdatingPersisterAsyncInner< @@ -800,14 +801,13 @@ struct MonitorUpdatingPersisterAsyncInner< L: Deref, ES: Deref, SP: Deref, - BI: Deref, + BI: BroadcasterInterface, FE: Deref, > where K::Target: KVStore, L::Target: Logger, ES::Target: EntropySource + Sized, SP::Target: SignerProvider + Sized, - BI::Target: BroadcasterInterface, FE::Target: FeeEstimator, { kv_store: K, @@ -821,14 +821,20 @@ struct MonitorUpdatingPersisterAsyncInner< fee_estimator: FE, } -impl - MonitorUpdatingPersisterAsync +impl< + K: Deref, + S: FutureSpawner, + L: Deref, + ES: Deref, + SP: Deref, + BI: BroadcasterInterface, + FE: Deref, + > MonitorUpdatingPersisterAsync where K::Target: KVStore, L::Target: Logger, ES::Target: EntropySource + Sized, SP::Target: SignerProvider + Sized, - BI::Target: BroadcasterInterface, FE::Target: FeeEstimator, { /// Constructs a new [`MonitorUpdatingPersisterAsync`]. @@ -971,7 +977,7 @@ impl< L: Deref + MaybeSend + MaybeSync + 'static, ES: Deref + MaybeSend + MaybeSync + 'static, SP: Deref + MaybeSend + MaybeSync + 'static, - BI: Deref + MaybeSend + MaybeSync + 'static, + BI: BroadcasterInterface + MaybeSend + MaybeSync + 'static, FE: Deref + MaybeSend + MaybeSync + 'static, > MonitorUpdatingPersisterAsync where @@ -979,7 +985,6 @@ where L::Target: Logger, ES::Target: EntropySource + Sized, SP::Target: SignerProvider + Sized, - BI::Target: BroadcasterInterface, FE::Target: FeeEstimator, ::EcdsaSigner: MaybeSend + 'static, { @@ -1057,14 +1062,20 @@ where trait MaybeSendableFuture: Future> + MaybeSend {} impl> + MaybeSend> MaybeSendableFuture for F {} -impl - MonitorUpdatingPersisterAsyncInner +impl< + K: Deref, + S: FutureSpawner, + L: Deref, + ES: Deref, + SP: Deref, + BI: BroadcasterInterface, + FE: Deref, + > MonitorUpdatingPersisterAsyncInner where K::Target: KVStore, L::Target: Logger, ES::Target: EntropySource + Sized, SP::Target: SignerProvider + Sized, - BI::Target: BroadcasterInterface, FE::Target: FeeEstimator, { pub async fn read_channel_monitor_with_updates( diff --git a/lightning/src/util/sweep.rs b/lightning/src/util/sweep.rs index bf048efdae1..6b3ce10edb2 100644 --- a/lightning/src/util/sweep.rs +++ b/lightning/src/util/sweep.rs @@ -337,9 +337,15 @@ impl_writeable_tlv_based_enum!(OutputSpendStatus, /// /// [`Event::SpendableOutputs`]: crate::events::Event::SpendableOutputs // Note that updates to documentation on this struct should be copied to the synchronous version. -pub struct OutputSweeper -where - B::Target: BroadcasterInterface, +pub struct OutputSweeper< + B: BroadcasterInterface, + D: Deref, + E: Deref, + F: Deref, + K: Deref, + L: Deref, + O: Deref, +> where D::Target: ChangeDestinationSource, E::Target: FeeEstimator, F::Target: Filter, @@ -358,10 +364,9 @@ where logger: L, } -impl +impl OutputSweeper where - B::Target: BroadcasterInterface, D::Target: ChangeDestinationSource, E::Target: FeeEstimator, F::Target: Filter, @@ -710,10 +715,9 @@ where } } -impl Listen +impl Listen for OutputSweeper where - B::Target: BroadcasterInterface, D::Target: ChangeDestinationSource, E::Target: FeeEstimator, F::Target: Filter + Sync + Send, @@ -751,10 +755,9 @@ where } } -impl Confirm +impl Confirm for OutputSweeper where - B::Target: BroadcasterInterface, D::Target: ChangeDestinationSource, E::Target: FeeEstimator, F::Target: Filter + Sync + Send, @@ -848,10 +851,9 @@ pub enum SpendingDelay { }, } -impl +impl ReadableArgs<(B, E, Option, O, D, K, L)> for (BestBlock, OutputSweeper) where - B::Target: BroadcasterInterface, D::Target: ChangeDestinationSource, E::Target: FeeEstimator, F::Target: Filter + Sync + Send, @@ -918,9 +920,15 @@ where /// /// [`Event::SpendableOutputs`]: crate::events::Event::SpendableOutputs // Note that updates to documentation on this struct should be copied to the asynchronous version. -pub struct OutputSweeperSync -where - B::Target: BroadcasterInterface, +pub struct OutputSweeperSync< + B: BroadcasterInterface, + D: Deref, + E: Deref, + F: Deref, + K: Deref, + L: Deref, + O: Deref, +> where D::Target: ChangeDestinationSourceSync, E::Target: FeeEstimator, F::Target: Filter, @@ -932,10 +940,9 @@ where OutputSweeper, E, F, KVStoreSyncWrapper, L, O>, } -impl +impl OutputSweeperSync where - B::Target: BroadcasterInterface, D::Target: ChangeDestinationSourceSync, E::Target: FeeEstimator, F::Target: Filter, @@ -1052,10 +1059,9 @@ where } } -impl Listen +impl Listen for OutputSweeperSync where - B::Target: BroadcasterInterface, D::Target: ChangeDestinationSourceSync, E::Target: FeeEstimator, F::Target: Filter + Sync + Send, @@ -1074,10 +1080,9 @@ where } } -impl Confirm +impl Confirm for OutputSweeperSync where - B::Target: BroadcasterInterface, D::Target: ChangeDestinationSourceSync, E::Target: FeeEstimator, F::Target: Filter + Sync + Send, @@ -1104,10 +1109,9 @@ where } } -impl +impl ReadableArgs<(B, E, Option, O, D, K, L)> for (BestBlock, OutputSweeperSync) where - B::Target: BroadcasterInterface, D::Target: ChangeDestinationSourceSync, E::Target: FeeEstimator, F::Target: Filter + Sync + Send, From b2667a15645aa2df261ce828fa47ce6264635339 Mon Sep 17 00:00:00 2001 From: Valentine Wallace Date: Wed, 14 Jan 2026 13:48:47 -0500 Subject: [PATCH 03/17] Drop Deref indirection for EntropySource Reduces generics and verbosity across the codebase, should provide equivalent behavior. Co-Authored-By: Claude Opus 4.5 --- lightning-background-processor/src/lib.rs | 18 ++-- lightning-liquidity/src/lsps0/client.rs | 9 +- lightning-liquidity/src/lsps1/client.rs | 9 +- lightning-liquidity/src/lsps1/service.rs | 11 +-- lightning-liquidity/src/lsps2/client.rs | 9 +- lightning-liquidity/src/lsps5/client.rs | 9 +- lightning-liquidity/src/manager.rs | 70 ++++++--------- lightning-liquidity/src/utils/mod.rs | 7 +- lightning/src/blinded_path/message.rs | 24 ++---- lightning/src/blinded_path/payment.rs | 14 +-- lightning/src/chain/chainmonitor.rs | 36 +++----- lightning/src/crypto/utils.rs | 9 +- lightning/src/ln/chan_utils.rs | 11 +-- lightning/src/ln/channel.rs | 40 ++++----- lightning/src/ln/channelmanager.rs | 86 +++++++------------ lightning/src/ln/functional_test_utils.rs | 4 +- lightning/src/ln/inbound_payment.rs | 7 +- lightning/src/ln/interactivetxs.rs | 33 +++---- lightning/src/ln/invoice_utils.rs | 9 +- lightning/src/ln/outbound_payment.rs | 55 ++++-------- lightning/src/ln/types.rs | 6 +- lightning/src/offers/flow.rs | 64 +++++--------- lightning/src/offers/nonce.rs | 6 +- lightning/src/offers/refund.rs | 15 +--- lightning/src/onion_message/messenger.rs | 53 ++++-------- lightning/src/routing/router.rs | 13 ++- lightning/src/sign/mod.rs | 6 ++ lightning/src/util/anchor_channel_reserves.rs | 5 +- lightning/src/util/persist.rs | 31 +++---- lightning/src/util/scid_utils.rs | 9 +- 30 files changed, 236 insertions(+), 442 deletions(-) diff --git a/lightning-background-processor/src/lib.rs b/lightning-background-processor/src/lib.rs index 0cefcca7d24..c8898b0690d 100644 --- a/lightning-background-processor/src/lib.rs +++ b/lightning-background-processor/src/lib.rs @@ -420,8 +420,7 @@ type DynChannelManager = lightning::ln::channelmanager::ChannelManager< pub const NO_ONION_MESSENGER: Option< Arc< dyn AOnionMessenger< - EntropySource = dyn EntropySource + Send + Sync, - ES = &(dyn EntropySource + Send + Sync), + EntropySource = &(dyn EntropySource + Send + Sync), NodeSigner = dyn lightning::sign::NodeSigner + Send + Sync, NS = &(dyn lightning::sign::NodeSigner + Send + Sync), Logger = dyn Logger + Send + Sync, @@ -480,8 +479,7 @@ impl KVStore for DummyKVStore { pub const NO_LIQUIDITY_MANAGER: Option< Arc< dyn ALiquidityManager< - EntropySource = dyn EntropySource + Send + Sync, - ES = &(dyn EntropySource + Send + Sync), + EntropySource = &(dyn EntropySource + Send + Sync), NodeSigner = dyn lightning::sign::NodeSigner + Send + Sync, NS = &(dyn lightning::sign::NodeSigner + Send + Sync), AChannelManager = DynChannelManager, @@ -506,8 +504,7 @@ pub const NO_LIQUIDITY_MANAGER: Option< pub const NO_LIQUIDITY_MANAGER_SYNC: Option< Arc< dyn ALiquidityManagerSync< - EntropySource = dyn EntropySource + Send + Sync, - ES = &(dyn EntropySource + Send + Sync), + EntropySource = &(dyn EntropySource + Send + Sync), NodeSigner = dyn lightning::sign::NodeSigner + Send + Sync, NS = &(dyn lightning::sign::NodeSigner + Send + Sync), AChannelManager = DynChannelManager, @@ -961,7 +958,7 @@ pub async fn process_events_async< P: Deref, EventHandlerFuture: core::future::Future>, EventHandler: Fn(Event) -> EventHandlerFuture, - ES: Deref, + ES: EntropySource, M: Deref::Signer, CF, T, F, L, P, ES>>, CM: Deref, OM: Deref, @@ -990,7 +987,6 @@ where F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist<::Signer>, - ES::Target: EntropySource, CM::Target: AChannelManager, OM::Target: AOnionMessenger, PM::Target: APeerManager, @@ -1461,7 +1457,7 @@ pub async fn process_events_async_with_kv_store_sync< P: Deref, EventHandlerFuture: core::future::Future>, EventHandler: Fn(Event) -> EventHandlerFuture, - ES: Deref, + ES: EntropySource, M: Deref::Signer, CF, T, F, L, P, ES>>, CM: Deref, OM: Deref, @@ -1490,7 +1486,6 @@ where F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist<::Signer>, - ES::Target: EntropySource, CM::Target: AChannelManager, OM::Target: AOnionMessenger, PM::Target: APeerManager, @@ -1573,7 +1568,7 @@ impl BackgroundProcessor { L: 'static + Deref + Send, P: 'static + Deref, EH: 'static + EventHandler + Send, - ES: 'static + Deref + Send, + ES: 'static + EntropySource + Send, M: 'static + Deref< Target = ChainMonitor<::Signer, CF, T, F, L, P, ES>, @@ -1603,7 +1598,6 @@ impl BackgroundProcessor { F::Target: 'static + FeeEstimator, L::Target: 'static + Logger, P::Target: 'static + Persist<::Signer>, - ES::Target: 'static + EntropySource, CM::Target: AChannelManager, OM::Target: AOnionMessenger, PM::Target: APeerManager, diff --git a/lightning-liquidity/src/lsps0/client.rs b/lightning-liquidity/src/lsps0/client.rs index d300936e2b2..776e9d3c9a5 100644 --- a/lightning-liquidity/src/lsps0/client.rs +++ b/lightning-liquidity/src/lsps0/client.rs @@ -25,9 +25,8 @@ use bitcoin::secp256k1::PublicKey; use core::ops::Deref; /// A message handler capable of sending and handling bLIP-50 / LSPS0 messages. -pub struct LSPS0ClientHandler +pub struct LSPS0ClientHandler where - ES::Target: EntropySource, K::Target: KVStore, { entropy_source: ES, @@ -35,9 +34,8 @@ where pending_events: Arc>, } -impl LSPS0ClientHandler +impl LSPS0ClientHandler where - ES::Target: EntropySource, K::Target: KVStore, { /// Returns a new instance of [`LSPS0ClientHandler`]. @@ -89,9 +87,8 @@ where } } -impl LSPSProtocolMessageHandler for LSPS0ClientHandler +impl LSPSProtocolMessageHandler for LSPS0ClientHandler where - ES::Target: EntropySource, K::Target: KVStore, { type ProtocolMessage = LSPS0Message; diff --git a/lightning-liquidity/src/lsps1/client.rs b/lightning-liquidity/src/lsps1/client.rs index 4a79fb64887..1e5b2e3bef4 100644 --- a/lightning-liquidity/src/lsps1/client.rs +++ b/lightning-liquidity/src/lsps1/client.rs @@ -47,9 +47,8 @@ struct PeerState { } /// The main object allowing to send and receive bLIP-51 / LSPS1 messages. -pub struct LSPS1ClientHandler +pub struct LSPS1ClientHandler where - ES::Target: EntropySource, K::Target: KVStore, { entropy_source: ES, @@ -59,9 +58,8 @@ where config: LSPS1ClientConfig, } -impl LSPS1ClientHandler +impl LSPS1ClientHandler where - ES::Target: EntropySource, K::Target: KVStore, { /// Constructs an `LSPS1ClientHandler`. @@ -432,9 +430,8 @@ where } } -impl LSPSProtocolMessageHandler for LSPS1ClientHandler +impl LSPSProtocolMessageHandler for LSPS1ClientHandler where - ES::Target: EntropySource, K::Target: KVStore, { type ProtocolMessage = LSPS1Message; diff --git a/lightning-liquidity/src/lsps1/service.rs b/lightning-liquidity/src/lsps1/service.rs index 8afea1b4345..76a9a437b0b 100644 --- a/lightning-liquidity/src/lsps1/service.rs +++ b/lightning-liquidity/src/lsps1/service.rs @@ -132,9 +132,8 @@ impl PeerState { } /// The main object allowing to send and receive bLIP-51 / LSPS1 messages. -pub struct LSPS1ServiceHandler +pub struct LSPS1ServiceHandler where - ES::Target: EntropySource, CM::Target: AChannelManager, C::Target: Filter, K::Target: KVStore, @@ -148,12 +147,11 @@ where config: LSPS1ServiceConfig, } -impl LSPS1ServiceHandler +impl + LSPS1ServiceHandler where - ES::Target: EntropySource, CM::Target: AChannelManager, C::Target: Filter, - ES::Target: EntropySource, K::Target: KVStore, { /// Constructs a `LSPS1ServiceHandler`. @@ -421,10 +419,9 @@ where } } -impl LSPSProtocolMessageHandler +impl LSPSProtocolMessageHandler for LSPS1ServiceHandler where - ES::Target: EntropySource, CM::Target: AChannelManager, C::Target: Filter, K::Target: KVStore, diff --git a/lightning-liquidity/src/lsps2/client.rs b/lightning-liquidity/src/lsps2/client.rs index 83aa7e3e99f..2e9fca2d444 100644 --- a/lightning-liquidity/src/lsps2/client.rs +++ b/lightning-liquidity/src/lsps2/client.rs @@ -68,9 +68,8 @@ impl PeerState { /// opened. Please refer to the [`bLIP-52 / LSPS2 specification`] for more information. /// /// [`bLIP-52 / LSPS2 specification`]: https://github.com/lightning/blips/blob/master/blip-0052.md#trust-models -pub struct LSPS2ClientHandler +pub struct LSPS2ClientHandler where - ES::Target: EntropySource, K::Target: KVStore, { entropy_source: ES, @@ -80,9 +79,8 @@ where config: LSPS2ClientConfig, } -impl LSPS2ClientHandler +impl LSPS2ClientHandler where - ES::Target: EntropySource, K::Target: KVStore, { /// Constructs an `LSPS2ClientHandler`. @@ -375,9 +373,8 @@ where } } -impl LSPSProtocolMessageHandler for LSPS2ClientHandler +impl LSPSProtocolMessageHandler for LSPS2ClientHandler where - ES::Target: EntropySource, K::Target: KVStore, { type ProtocolMessage = LSPS2Message; diff --git a/lightning-liquidity/src/lsps5/client.rs b/lightning-liquidity/src/lsps5/client.rs index 1c6f8b8a250..df10522077e 100644 --- a/lightning-liquidity/src/lsps5/client.rs +++ b/lightning-liquidity/src/lsps5/client.rs @@ -125,9 +125,8 @@ impl PeerState { /// [`lsps5.list_webhooks`]: super::msgs::LSPS5Request::ListWebhooks /// [`lsps5.remove_webhook`]: super::msgs::LSPS5Request::RemoveWebhook /// [`LSPS5Validator`]: super::validator::LSPS5Validator -pub struct LSPS5ClientHandler +pub struct LSPS5ClientHandler where - ES::Target: EntropySource, K::Target: KVStore, { pending_messages: Arc, @@ -137,9 +136,8 @@ where _config: LSPS5ClientConfig, } -impl LSPS5ClientHandler +impl LSPS5ClientHandler where - ES::Target: EntropySource, K::Target: KVStore, { /// Constructs an `LSPS5ClientHandler`. @@ -426,9 +424,8 @@ where } } -impl LSPSProtocolMessageHandler for LSPS5ClientHandler +impl LSPSProtocolMessageHandler for LSPS5ClientHandler where - ES::Target: EntropySource, K::Target: KVStore, { type ProtocolMessage = LSPS5Message; diff --git a/lightning-liquidity/src/manager.rs b/lightning-liquidity/src/manager.rs index 84a52e2ab13..14b0fa52246 100644 --- a/lightning-liquidity/src/manager.rs +++ b/lightning-liquidity/src/manager.rs @@ -104,9 +104,7 @@ pub struct LiquidityClientConfig { /// languages. pub trait ALiquidityManager { /// A type implementing [`EntropySource`] - type EntropySource: EntropySource + ?Sized; - /// A type that may be dereferenced to [`Self::EntropySource`]. - type ES: Deref + Clone; + type EntropySource: EntropySource + Clone; /// A type implementing [`NodeSigner`] type NodeSigner: NodeSigner + ?Sized; /// A type that may be dereferenced to [`Self::NodeSigner`]. @@ -133,7 +131,7 @@ pub trait ALiquidityManager { fn get_lm( &self, ) -> &LiquidityManager< - Self::ES, + Self::EntropySource, Self::NS, Self::CM, Self::C, @@ -144,7 +142,7 @@ pub trait ALiquidityManager { } impl< - ES: Deref + Clone, + ES: EntropySource + Clone, NS: Deref + Clone, CM: Deref + Clone, C: Deref + Clone, @@ -153,15 +151,13 @@ impl< T: BroadcasterInterface + Clone, > ALiquidityManager for LiquidityManager where - ES::Target: EntropySource, NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, K::Target: KVStore, TP::Target: TimeProvider, { - type EntropySource = ES::Target; - type ES = ES; + type EntropySource = ES; type NodeSigner = NS::Target; type NS = NS; type AChannelManager = CM::Target; @@ -184,9 +180,7 @@ where /// languages. pub trait ALiquidityManagerSync { /// A type implementing [`EntropySource`] - type EntropySource: EntropySource + ?Sized; - /// A type that may be dereferenced to [`Self::EntropySource`]. - type ES: Deref + Clone; + type EntropySource: EntropySource + Clone; /// A type implementing [`NodeSigner`] type NodeSigner: NodeSigner + ?Sized; /// A type that may be dereferenced to [`Self::NodeSigner`]. @@ -214,7 +208,7 @@ pub trait ALiquidityManagerSync { fn get_lm_async( &self, ) -> &LiquidityManager< - Self::ES, + Self::EntropySource, Self::NS, Self::CM, Self::C, @@ -226,7 +220,7 @@ pub trait ALiquidityManagerSync { fn get_lm( &self, ) -> &LiquidityManagerSync< - Self::ES, + Self::EntropySource, Self::NS, Self::CM, Self::C, @@ -237,7 +231,7 @@ pub trait ALiquidityManagerSync { } impl< - ES: Deref + Clone, + ES: EntropySource + Clone, NS: Deref + Clone, CM: Deref + Clone, C: Deref + Clone, @@ -246,15 +240,13 @@ impl< T: BroadcasterInterface + Clone, > ALiquidityManagerSync for LiquidityManagerSync where - ES::Target: EntropySource, NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, KS::Target: KVStoreSync, TP::Target: TimeProvider, { - type EntropySource = ES::Target; - type ES = ES; + type EntropySource = ES; type NodeSigner = NS::Target; type NS = NS; type AChannelManager = CM::Target; @@ -271,7 +263,7 @@ where fn get_lm_async( &self, ) -> &LiquidityManager< - Self::ES, + Self::EntropySource, Self::NS, Self::CM, Self::C, @@ -306,7 +298,7 @@ where /// [`Event::HTLCHandlingFailed`]: lightning::events::Event::HTLCHandlingFailed /// [`Event::PaymentForwarded`]: lightning::events::Event::PaymentForwarded pub struct LiquidityManager< - ES: Deref + Clone, + ES: EntropySource + Clone, NS: Deref + Clone, CM: Deref + Clone, C: Deref + Clone, @@ -314,7 +306,6 @@ pub struct LiquidityManager< TP: Deref + Clone, T: BroadcasterInterface + Clone, > where - ES::Target: EntropySource, NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, @@ -344,7 +335,7 @@ pub struct LiquidityManager< #[cfg(feature = "time")] impl< - ES: Deref + Clone, + ES: EntropySource + Clone, NS: Deref + Clone, CM: Deref + Clone, C: Deref + Clone, @@ -352,7 +343,6 @@ impl< T: BroadcasterInterface + Clone, > LiquidityManager where - ES::Target: EntropySource, NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, @@ -384,7 +374,7 @@ where } impl< - ES: Deref + Clone, + ES: EntropySource + Clone, NS: Deref + Clone, CM: Deref + Clone, C: Deref + Clone, @@ -393,7 +383,6 @@ impl< T: BroadcasterInterface + Clone, > LiquidityManager where - ES::Target: EntropySource, NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, @@ -810,7 +799,7 @@ where } impl< - ES: Deref + Clone, + ES: EntropySource + Clone, NS: Deref + Clone, CM: Deref + Clone, C: Deref + Clone, @@ -819,7 +808,6 @@ impl< T: BroadcasterInterface + Clone, > CustomMessageReader for LiquidityManager where - ES::Target: EntropySource, NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, @@ -841,7 +829,7 @@ where } impl< - ES: Deref + Clone, + ES: EntropySource + Clone, NS: Deref + Clone, CM: Deref + Clone, C: Deref + Clone, @@ -850,7 +838,6 @@ impl< T: BroadcasterInterface + Clone, > CustomMessageHandler for LiquidityManager where - ES::Target: EntropySource, NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, @@ -974,7 +961,7 @@ where } impl< - ES: Deref + Clone, + ES: EntropySource + Clone, NS: Deref + Clone, CM: Deref + Clone, C: Deref + Clone, @@ -983,7 +970,6 @@ impl< T: BroadcasterInterface + Clone, > Listen for LiquidityManager where - ES::Target: EntropySource, NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, @@ -1019,7 +1005,7 @@ where } impl< - ES: Deref + Clone, + ES: EntropySource + Clone, NS: Deref + Clone, CM: Deref + Clone, C: Deref + Clone, @@ -1028,7 +1014,6 @@ impl< T: BroadcasterInterface + Clone, > Confirm for LiquidityManager where - ES::Target: EntropySource, NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, @@ -1064,7 +1049,7 @@ where /// A synchroneous wrapper around [`LiquidityManager`] to be used in contexts where async is not /// available. pub struct LiquidityManagerSync< - ES: Deref + Clone, + ES: EntropySource + Clone, NS: Deref + Clone, CM: Deref + Clone, C: Deref + Clone, @@ -1072,7 +1057,6 @@ pub struct LiquidityManagerSync< TP: Deref + Clone, T: BroadcasterInterface + Clone, > where - ES::Target: EntropySource, NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, @@ -1084,7 +1068,7 @@ pub struct LiquidityManagerSync< #[cfg(feature = "time")] impl< - ES: Deref + Clone, + ES: EntropySource + Clone, NS: Deref + Clone, CM: Deref + Clone, C: Deref + Clone, @@ -1092,7 +1076,6 @@ impl< T: BroadcasterInterface + Clone, > LiquidityManagerSync where - ES::Target: EntropySource, NS::Target: NodeSigner, CM::Target: AChannelManager, KS::Target: KVStoreSync, @@ -1135,7 +1118,7 @@ where } impl< - ES: Deref + Clone, + ES: EntropySource + Clone, NS: Deref + Clone, CM: Deref + Clone, C: Deref + Clone, @@ -1144,7 +1127,6 @@ impl< T: BroadcasterInterface + Clone, > LiquidityManagerSync where - ES::Target: EntropySource, NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, @@ -1304,7 +1286,7 @@ where } impl< - ES: Deref + Clone, + ES: EntropySource + Clone, NS: Deref + Clone, CM: Deref + Clone, C: Deref + Clone, @@ -1313,7 +1295,6 @@ impl< T: BroadcasterInterface + Clone, > CustomMessageReader for LiquidityManagerSync where - ES::Target: EntropySource, NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, @@ -1330,7 +1311,7 @@ where } impl< - ES: Deref + Clone, + ES: EntropySource + Clone, NS: Deref + Clone, CM: Deref + Clone, C: Deref + Clone, @@ -1339,7 +1320,6 @@ impl< T: BroadcasterInterface + Clone, > CustomMessageHandler for LiquidityManagerSync where - ES::Target: EntropySource, NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, @@ -1376,7 +1356,7 @@ where } impl< - ES: Deref + Clone, + ES: EntropySource + Clone, NS: Deref + Clone, CM: Deref + Clone, C: Deref + Clone, @@ -1385,7 +1365,6 @@ impl< T: BroadcasterInterface + Clone, > Listen for LiquidityManagerSync where - ES::Target: EntropySource, NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, @@ -1405,7 +1384,7 @@ where } impl< - ES: Deref + Clone, + ES: EntropySource + Clone, NS: Deref + Clone, CM: Deref + Clone, C: Deref + Clone, @@ -1414,7 +1393,6 @@ impl< T: BroadcasterInterface + Clone, > Confirm for LiquidityManagerSync where - ES::Target: EntropySource, NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, diff --git a/lightning-liquidity/src/utils/mod.rs b/lightning-liquidity/src/utils/mod.rs index b66d3eb7ead..32b50443350 100644 --- a/lightning-liquidity/src/utils/mod.rs +++ b/lightning-liquidity/src/utils/mod.rs @@ -1,7 +1,7 @@ //! Utilities for LSPS5 service. use alloc::string::String; -use core::{fmt::Write, ops::Deref}; +use core::fmt::Write; use lightning::sign::EntropySource; @@ -23,10 +23,7 @@ pub fn scid_from_human_readable_string(human_readable_scid: &str) -> Result(entropy_source: &ES) -> LSPSRequestId -where - ES::Target: EntropySource, -{ +pub(crate) fn generate_request_id(entropy_source: &ES) -> LSPSRequestId { let bytes = entropy_source.get_secure_random_bytes(); LSPSRequestId(hex_str(&bytes[0..16])) } diff --git a/lightning/src/blinded_path/message.rs b/lightning/src/blinded_path/message.rs index 84a42ff1be2..c914458ccbc 100644 --- a/lightning/src/blinded_path/message.rs +++ b/lightning/src/blinded_path/message.rs @@ -58,14 +58,11 @@ impl BlindedMessagePath { /// `compact_padding` selects between space-inefficient padding which better hides contents and /// a space-constrained padding which does very little to hide the contents, especially for the /// last hop. It should only be set when the blinded path needs to be as compact as possible. - pub fn one_hop( + pub fn one_hop( recipient_node_id: PublicKey, local_node_receive_key: ReceiveAuthKey, context: MessageContext, compact_padding: bool, entropy_source: ES, secp_ctx: &Secp256k1, - ) -> Self - where - ES::Target: EntropySource, - { + ) -> Self { Self::new( &[], recipient_node_id, @@ -82,14 +79,11 @@ impl BlindedMessagePath { /// `compact_padding` selects between space-inefficient padding which better hides contents and /// a space-constrained padding which does very little to hide the contents, especially for the /// last hop. It should only be set when the blinded path needs to be as compact as possible. - pub fn new( + pub fn new( intermediate_nodes: &[MessageForwardNode], recipient_node_id: PublicKey, local_node_receive_key: ReceiveAuthKey, context: MessageContext, compact_padding: bool, entropy_source: ES, secp_ctx: &Secp256k1, - ) -> Self - where - ES::Target: EntropySource, - { + ) -> Self { BlindedMessagePath::new_with_dummy_hops( intermediate_nodes, recipient_node_id, @@ -109,14 +103,14 @@ impl BlindedMessagePath { /// last hop. It should only be set when the blinded path needs to be as compact as possible. /// /// Note: At most [`MAX_DUMMY_HOPS_COUNT`] dummy hops can be added to the blinded path. - pub fn new_with_dummy_hops( + pub fn new_with_dummy_hops< + ES: EntropySource, + T: secp256k1::Signing + secp256k1::Verification, + >( intermediate_nodes: &[MessageForwardNode], recipient_node_id: PublicKey, dummy_hop_count: usize, local_node_receive_key: ReceiveAuthKey, context: MessageContext, compact_padding: bool, entropy_source: ES, secp_ctx: &Secp256k1, - ) -> Self - where - ES::Target: EntropySource, - { + ) -> Self { let introduction_node = IntroductionNode::NodeId( intermediate_nodes.first().map_or(recipient_node_id, |n| n.node_id), ); diff --git a/lightning/src/blinded_path/payment.rs b/lightning/src/blinded_path/payment.rs index 13ade222f5b..dfa46ee2edd 100644 --- a/lightning/src/blinded_path/payment.rs +++ b/lightning/src/blinded_path/payment.rs @@ -88,13 +88,10 @@ pub struct BlindedPaymentPath { impl BlindedPaymentPath { /// Create a one-hop blinded path for a payment. - pub fn one_hop( + pub fn one_hop( payee_node_id: PublicKey, local_node_receive_key: ReceiveAuthKey, payee_tlvs: ReceiveTlvs, min_final_cltv_expiry_delta: u16, entropy_source: ES, secp_ctx: &Secp256k1, - ) -> Result - where - ES::Target: EntropySource, - { + ) -> Result { // This value is not considered in pathfinding for 1-hop blinded paths, because it's intended to // be in relation to a specific channel. let htlc_maximum_msat = u64::max_value(); @@ -116,14 +113,11 @@ impl BlindedPaymentPath { /// * [`BlindedPayInfo`] calculation results in an integer overflow /// * any unknown features are required in the provided [`ForwardTlvs`] // TODO: make all payloads the same size with padding + add dummy hops - pub fn new( + pub fn new( intermediate_nodes: &[PaymentForwardNode], payee_node_id: PublicKey, local_node_receive_key: ReceiveAuthKey, payee_tlvs: ReceiveTlvs, htlc_maximum_msat: u64, min_final_cltv_expiry_delta: u16, entropy_source: ES, secp_ctx: &Secp256k1, - ) -> Result - where - ES::Target: EntropySource, - { + ) -> Result { let introduction_node = IntroductionNode::NodeId( intermediate_nodes.first().map_or(payee_node_id, |n| n.node_id), ); diff --git a/lightning/src/chain/chainmonitor.rs b/lightning/src/chain/chainmonitor.rs index 678c7b6ef5b..e4a9ca99290 100644 --- a/lightning/src/chain/chainmonitor.rs +++ b/lightning/src/chain/chainmonitor.rs @@ -259,14 +259,13 @@ pub struct AsyncPersister< K: Deref + MaybeSend + MaybeSync + 'static, S: FutureSpawner, L: Deref + MaybeSend + MaybeSync + 'static, - ES: Deref + MaybeSend + MaybeSync + 'static, + ES: EntropySource + MaybeSend + MaybeSync + 'static, SP: Deref + MaybeSend + MaybeSync + 'static, BI: BroadcasterInterface + MaybeSend + MaybeSync + 'static, FE: Deref + MaybeSend + MaybeSync + 'static, > where K::Target: KVStore + MaybeSync, L::Target: Logger, - ES::Target: EntropySource + Sized, SP::Target: SignerProvider + Sized, FE::Target: FeeEstimator, { @@ -278,7 +277,7 @@ impl< K: Deref + MaybeSend + MaybeSync + 'static, S: FutureSpawner, L: Deref + MaybeSend + MaybeSync + 'static, - ES: Deref + MaybeSend + MaybeSync + 'static, + ES: EntropySource + MaybeSend + MaybeSync + 'static, SP: Deref + MaybeSend + MaybeSync + 'static, BI: BroadcasterInterface + MaybeSend + MaybeSync + 'static, FE: Deref + MaybeSend + MaybeSync + 'static, @@ -286,7 +285,6 @@ impl< where K::Target: KVStore + MaybeSync, L::Target: Logger, - ES::Target: EntropySource + Sized, SP::Target: SignerProvider + Sized, FE::Target: FeeEstimator, { @@ -300,7 +298,7 @@ impl< K: Deref + MaybeSend + MaybeSync + 'static, S: FutureSpawner, L: Deref + MaybeSend + MaybeSync + 'static, - ES: Deref + MaybeSend + MaybeSync + 'static, + ES: EntropySource + MaybeSend + MaybeSync + 'static, SP: Deref + MaybeSend + MaybeSync + 'static, BI: BroadcasterInterface + MaybeSend + MaybeSync + 'static, FE: Deref + MaybeSend + MaybeSync + 'static, @@ -308,7 +306,6 @@ impl< where K::Target: KVStore + MaybeSync, L::Target: Logger, - ES::Target: EntropySource + Sized, SP::Target: SignerProvider + Sized, FE::Target: FeeEstimator, ::EcdsaSigner: MaybeSend + 'static, @@ -363,13 +360,12 @@ pub struct ChainMonitor< F: Deref, L: Deref, P: Deref, - ES: Deref, + ES: EntropySource, > where C::Target: chain::Filter, F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist, - ES::Target: EntropySource, { monitors: RwLock>>, chain_source: Option, @@ -403,7 +399,7 @@ impl< T: BroadcasterInterface + MaybeSend + MaybeSync + 'static, F: Deref + MaybeSend + MaybeSync + 'static, L: Deref + MaybeSend + MaybeSync + 'static, - ES: Deref + MaybeSend + MaybeSync + 'static, + ES: EntropySource + MaybeSend + MaybeSync + 'static, > ChainMonitor< ::EcdsaSigner, @@ -419,7 +415,6 @@ impl< C::Target: chain::Filter, F::Target: FeeEstimator, L::Target: Logger, - ES::Target: EntropySource + Sized, ::EcdsaSigner: MaybeSend + 'static, { /// Creates a new `ChainMonitor` used to watch on-chain activity pertaining to channels. @@ -461,14 +456,13 @@ impl< F: Deref, L: Deref, P: Deref, - ES: Deref, + ES: EntropySource, > ChainMonitor where C::Target: chain::Filter, F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist, - ES::Target: EntropySource, { /// Dispatches to per-channel monitors, which are responsible for updating their on-chain view /// of a channel and reacting accordingly based on transactions in the given chain data. See @@ -1107,14 +1101,13 @@ impl< F: Deref, L: Deref, P: Deref, - ES: Deref, + ES: EntropySource, > BaseMessageHandler for ChainMonitor where C::Target: chain::Filter, F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist, - ES::Target: EntropySource, { fn get_and_clear_pending_msg_events(&self) -> Vec { let mut pending_events = self.pending_send_only_events.lock().unwrap(); @@ -1145,14 +1138,13 @@ impl< F: Deref, L: Deref, P: Deref, - ES: Deref, + ES: EntropySource, > SendOnlyMessageHandler for ChainMonitor where C::Target: chain::Filter, F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist, - ES::Target: EntropySource, { } @@ -1163,14 +1155,13 @@ impl< F: Deref, L: Deref, P: Deref, - ES: Deref, + ES: EntropySource, > chain::Listen for ChainMonitor where C::Target: chain::Filter, F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist, - ES::Target: EntropySource, { fn filtered_block_connected(&self, header: &Header, txdata: &TransactionData, height: u32) { log_debug!( @@ -1226,14 +1217,13 @@ impl< F: Deref, L: Deref, P: Deref, - ES: Deref, + ES: EntropySource, > chain::Confirm for ChainMonitor where C::Target: chain::Filter, F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist, - ES::Target: EntropySource, { fn transactions_confirmed(&self, header: &Header, txdata: &TransactionData, height: u32) { log_debug!( @@ -1320,14 +1310,13 @@ impl< F: Deref, L: Deref, P: Deref, - ES: Deref, + ES: EntropySource, > chain::Watch for ChainMonitor where C::Target: chain::Filter, F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist, - ES::Target: EntropySource, { fn watch_channel( &self, channel_id: ChannelId, monitor: ChannelMonitor, @@ -1515,14 +1504,13 @@ impl< F: Deref, L: Deref, P: Deref, - ES: Deref, + ES: EntropySource, > events::EventsProvider for ChainMonitor where C::Target: chain::Filter, F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist, - ES::Target: EntropySource, { /// Processes [`SpendableOutputs`] events produced from each [`ChannelMonitor`] upon maturity. /// diff --git a/lightning/src/crypto/utils.rs b/lightning/src/crypto/utils.rs index b59cc6002d9..1570b3a0b2f 100644 --- a/lightning/src/crypto/utils.rs +++ b/lightning/src/crypto/utils.rs @@ -5,8 +5,6 @@ use bitcoin::secp256k1::{ecdsa::Signature, Message, Secp256k1, SecretKey, Signin use crate::sign::EntropySource; -use core::ops::Deref; - macro_rules! hkdf_extract_expand { ($salt: expr, $ikm: expr) => {{ let mut hmac = HmacEngine::::new($salt); @@ -72,12 +70,9 @@ pub fn sign(ctx: &Secp256k1, msg: &Message, sk: &SecretKey) -> Si #[inline] #[allow(unused_variables)] -pub fn sign_with_aux_rand( +pub fn sign_with_aux_rand( ctx: &Secp256k1, msg: &Message, sk: &SecretKey, entropy_source: &ES, -) -> Signature -where - ES::Target: EntropySource, -{ +) -> Signature { #[cfg(feature = "grind_signatures")] let sig = loop { let sig = ctx.sign_ecdsa_with_noncedata(msg, sk, &entropy_source.get_secure_random_bytes()); diff --git a/lightning/src/ln/chan_utils.rs b/lightning/src/ln/chan_utils.rs index 431fdd2859c..46afa05b2f2 100644 --- a/lightning/src/ln/chan_utils.rs +++ b/lightning/src/ln/chan_utils.rs @@ -1452,13 +1452,10 @@ impl BuiltCommitmentTransaction { } /// Signs the holder commitment transaction because we are about to broadcast it. - pub fn sign_holder_commitment( + pub fn sign_holder_commitment( &self, funding_key: &SecretKey, funding_redeemscript: &Script, channel_value_satoshis: u64, entropy_source: &ES, secp_ctx: &Secp256k1, - ) -> Signature - where - ES::Target: EntropySource, - { + ) -> Signature { let sighash = self.get_sighash_all(funding_redeemscript, channel_value_satoshis); sign_with_aux_rand(secp_ctx, &sighash, funding_key, entropy_source) } @@ -2139,10 +2136,10 @@ impl<'a> TrustedCommitmentTransaction<'a> { /// /// This function is only valid in the holder commitment context, it always uses EcdsaSighashType::All. #[rustfmt::skip] - pub fn get_htlc_sigs( + pub fn get_htlc_sigs( &self, htlc_base_key: &SecretKey, channel_parameters: &DirectedChannelTransactionParameters, entropy_source: &ES, secp_ctx: &Secp256k1, - ) -> Result, ()> where ES::Target: EntropySource { + ) -> Result, ()> { let inner = self.inner; let keys = &inner.keys; let txid = inner.built.txid; diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs index 659735cc0a2..ef59af179fe 100644 --- a/lightning/src/ln/channel.rs +++ b/lightning/src/ln/channel.rs @@ -3376,7 +3376,7 @@ where SP::Target: SignerProvider, { #[rustfmt::skip] - fn new_for_inbound_channel<'a, ES: Deref, F: Deref, L: Deref>( + fn new_for_inbound_channel<'a, ES: EntropySource, F: Deref, L: Deref>( fee_estimator: &'a LowerBoundedFeeEstimator, entropy_source: &'a ES, signer_provider: &'a SP, @@ -3396,7 +3396,6 @@ where open_channel_fields: msgs::CommonOpenChannelFields, ) -> Result<(FundingScope, ChannelContext), ChannelError> where - ES::Target: EntropySource, F::Target: FeeEstimator, L::Target: Logger, SP::Target: SignerProvider, @@ -3720,7 +3719,7 @@ where } #[rustfmt::skip] - fn new_for_outbound_channel<'a, ES: Deref, F: Deref, L: Deref>( + fn new_for_outbound_channel<'a, ES: EntropySource, F: Deref, L: Deref>( fee_estimator: &'a LowerBoundedFeeEstimator, entropy_source: &'a ES, signer_provider: &'a SP, @@ -3739,7 +3738,6 @@ where _logger: L, ) -> Result<(FundingScope, ChannelContext), APIError> where - ES::Target: EntropySource, F::Target: FeeEstimator, SP::Target: SignerProvider, L::Target: Logger, @@ -6651,13 +6649,12 @@ pub(super) struct FundingNegotiationContext { impl FundingNegotiationContext { /// Prepare and start interactive transaction negotiation. /// If error occurs, it is caused by our side, not the counterparty. - fn into_interactive_tx_constructor( + fn into_interactive_tx_constructor( mut self, context: &ChannelContext, funding: &FundingScope, signer_provider: &SP, entropy_source: &ES, holder_node_id: PublicKey, ) -> Result where SP::Target: SignerProvider, - ES::Target: EntropySource, { debug_assert_eq!( self.shared_funding_input.is_some(), @@ -12383,12 +12380,11 @@ where Ok(()) } - pub(crate) fn splice_init( + pub(crate) fn splice_init( &mut self, msg: &msgs::SpliceInit, our_funding_contribution_satoshis: i64, signer_provider: &SP, entropy_source: &ES, holder_node_id: &PublicKey, logger: &L, ) -> Result where - ES::Target: EntropySource, L::Target: Logger, { let our_funding_contribution = SignedAmount::from_sat(our_funding_contribution_satoshis); @@ -12454,12 +12450,11 @@ where }) } - pub(crate) fn splice_ack( + pub(crate) fn splice_ack( &mut self, msg: &msgs::SpliceAck, signer_provider: &SP, entropy_source: &ES, holder_node_id: &PublicKey, logger: &L, ) -> Result, ChannelError> where - ES::Target: EntropySource, L::Target: Logger, { let splice_funding = self.validate_splice_ack(msg)?; @@ -13566,13 +13561,12 @@ where #[allow(dead_code)] // TODO(dual_funding): Remove once opending V2 channels is enabled. #[rustfmt::skip] - pub fn new( + pub fn new( fee_estimator: &LowerBoundedFeeEstimator, entropy_source: &ES, signer_provider: &SP, counterparty_node_id: PublicKey, their_features: &InitFeatures, channel_value_satoshis: u64, push_msat: u64, user_id: u128, config: &UserConfig, current_chain_height: u32, outbound_scid_alias: u64, temporary_channel_id: Option, logger: L ) -> Result, APIError> - where ES::Target: EntropySource, - F::Target: FeeEstimator, + where F::Target: FeeEstimator, L::Target: Logger, { let holder_selected_channel_reserve_satoshis = get_holder_selected_channel_reserve_satoshis(channel_value_satoshis, config); @@ -13958,14 +13952,13 @@ where /// Creates a new channel from a remote sides' request for one. /// Assumes chain_hash has already been checked and corresponds with what we expect! #[rustfmt::skip] - pub fn new( + pub fn new( fee_estimator: &LowerBoundedFeeEstimator, entropy_source: &ES, signer_provider: &SP, counterparty_node_id: PublicKey, our_supported_features: &ChannelTypeFeatures, their_features: &InitFeatures, msg: &msgs::OpenChannel, user_id: u128, config: &UserConfig, current_chain_height: u32, logger: &L, is_0conf: bool, ) -> Result, ChannelError> - where ES::Target: EntropySource, - F::Target: FeeEstimator, + where F::Target: FeeEstimator, L::Target: Logger, { let logger = WithContext::from(logger, Some(counterparty_node_id), Some(msg.common_fields.temporary_channel_id), None); @@ -14232,15 +14225,14 @@ where { #[allow(dead_code)] // TODO(dual_funding): Remove once creating V2 channels is enabled. #[rustfmt::skip] - pub fn new_outbound( + pub fn new_outbound( fee_estimator: &LowerBoundedFeeEstimator, entropy_source: &ES, signer_provider: &SP, counterparty_node_id: PublicKey, their_features: &InitFeatures, funding_satoshis: u64, funding_inputs: Vec, user_id: u128, config: &UserConfig, current_chain_height: u32, outbound_scid_alias: u64, funding_confirmation_target: ConfirmationTarget, logger: L, ) -> Result - where ES::Target: EntropySource, - F::Target: FeeEstimator, + where F::Target: FeeEstimator, L::Target: Logger, { let channel_keys_id = signer_provider.generate_channel_keys_id(false, user_id); @@ -14381,14 +14373,13 @@ where /// TODO(dual_funding): Allow contributions, pass intended amount and inputs #[allow(dead_code)] // TODO(dual_funding): Remove once V2 channels is enabled. #[rustfmt::skip] - pub fn new_inbound( + pub fn new_inbound( fee_estimator: &LowerBoundedFeeEstimator, entropy_source: &ES, signer_provider: &SP, holder_node_id: PublicKey, counterparty_node_id: PublicKey, our_supported_features: &ChannelTypeFeatures, their_features: &InitFeatures, msg: &msgs::OpenChannelV2, user_id: u128, config: &UserConfig, current_chain_height: u32, logger: &L, ) -> Result - where ES::Target: EntropySource, - F::Target: FeeEstimator, + where F::Target: FeeEstimator, L::Target: Logger, { // TODO(dual_funding): Take these as input once supported @@ -15135,10 +15126,9 @@ where } } -impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, &'c ChannelTypeFeatures)> - for FundedChannel +impl<'a, 'b, 'c, ES: EntropySource, SP: Deref> + ReadableArgs<(&'a ES, &'b SP, &'c ChannelTypeFeatures)> for FundedChannel where - ES::Target: EntropySource, SP::Target: SignerProvider, { fn read( diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs index fcd3bc3637c..b52f4e2cc55 100644 --- a/lightning/src/ln/channelmanager.rs +++ b/lightning/src/ln/channelmanager.rs @@ -1778,9 +1778,7 @@ pub trait AChannelManager { /// A type implementing [`BroadcasterInterface`]. type Broadcaster: BroadcasterInterface; /// A type implementing [`EntropySource`]. - type EntropySource: EntropySource + ?Sized; - /// A type that may be dereferenced to [`Self::EntropySource`]. - type ES: Deref; + type EntropySource: EntropySource; /// A type implementing [`NodeSigner`]. type NodeSigner: NodeSigner + ?Sized; /// A type that may be dereferenced to [`Self::NodeSigner`]. @@ -1813,7 +1811,7 @@ pub trait AChannelManager { ) -> &ChannelManager< Self::M, Self::Broadcaster, - Self::ES, + Self::EntropySource, Self::NS, Self::SP, Self::F, @@ -1826,7 +1824,7 @@ pub trait AChannelManager { impl< M: Deref, T: BroadcasterInterface, - ES: Deref, + ES: EntropySource, NS: Deref, SP: Deref, F: Deref, @@ -1836,7 +1834,6 @@ impl< > AChannelManager for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, @@ -1847,8 +1844,7 @@ where type Watch = M::Target; type M = M; type Broadcaster = T; - type EntropySource = ES::Target; - type ES = ES; + type EntropySource = ES; type NodeSigner = NS::Target; type NS = NS; type Signer = ::EcdsaSigner; @@ -2649,7 +2645,7 @@ where pub struct ChannelManager< M: Deref, T: BroadcasterInterface, - ES: Deref, + ES: EntropySource, NS: Deref, SP: Deref, F: Deref, @@ -2658,7 +2654,6 @@ pub struct ChannelManager< L: Deref, > where M::Target: chain::Watch<::EcdsaSigner>, - ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, @@ -3724,7 +3719,7 @@ fn create_htlc_intercepted_event( impl< M: Deref, T: BroadcasterInterface, - ES: Deref, + ES: EntropySource, NS: Deref, SP: Deref, F: Deref, @@ -3734,7 +3729,6 @@ impl< > ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, @@ -5830,7 +5824,7 @@ where features, best_block_height, self.duration_since_epoch(), - &*self.entropy_source, + &self.entropy_source, &self.pending_events, ); match outbound_pmts_res { @@ -5963,7 +5957,7 @@ where intercept_id, prev_outbound_scid_alias, htlc_id, - &*self.entropy_source, + &self.entropy_source, ) } @@ -13054,7 +13048,7 @@ macro_rules! create_offer_builder { ($self: ident, $builder: ty) => { /// [`InvoiceRequest`]: crate::offers::invoice_request::InvoiceRequest pub fn create_offer_builder(&$self) -> Result<$builder, Bolt12SemanticError> { let builder = $self.flow.create_offer_builder( - &*$self.entropy_source, $self.get_peers_for_blinded_path() + &$self.entropy_source, $self.get_peers_for_blinded_path() )?; Ok(builder.into()) @@ -13079,7 +13073,7 @@ macro_rules! create_offer_builder { ($self: ident, $builder: ty) => { ME::Target: MessageRouter, { let builder = $self.flow.create_offer_builder_using_router( - router, &*$self.entropy_source, $self.get_peers_for_blinded_path() + router, &$self.entropy_source, $self.get_peers_for_blinded_path() )?; Ok(builder.into()) @@ -13131,7 +13125,7 @@ macro_rules! create_refund_builder { ($self: ident, $builder: ty) => { &$self, amount_msats: u64, absolute_expiry: Duration, payment_id: PaymentId, retry_strategy: Retry, route_params_config: RouteParametersConfig ) -> Result<$builder, Bolt12SemanticError> { - let entropy = &*$self.entropy_source; + let entropy = &$self.entropy_source; let builder = $self.flow.create_refund_builder( entropy, amount_msats, absolute_expiry, @@ -13175,7 +13169,7 @@ macro_rules! create_refund_builder { ($self: ident, $builder: ty) => { where ME::Target: MessageRouter, { - let entropy = &*$self.entropy_source; + let entropy = &$self.entropy_source; let builder = $self.flow.create_refund_builder_using_router( router, entropy, amount_msats, absolute_expiry, @@ -13198,7 +13192,7 @@ macro_rules! create_refund_builder { ($self: ident, $builder: ty) => { impl< M: Deref, T: BroadcasterInterface, - ES: Deref, + ES: EntropySource, NS: Deref, SP: Deref, F: Deref, @@ -13208,7 +13202,6 @@ impl< > ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, @@ -13404,7 +13397,7 @@ where payer_note: Option, payment_id: PaymentId, human_readable_name: Option, create_pending_payment: CPP, ) -> Result<(), Bolt12SemanticError> { - let entropy = &*self.entropy_source; + let entropy = &self.entropy_source; let nonce = Nonce::from_entropy_source(entropy); let builder = self.flow.create_invoice_request_builder( @@ -13472,7 +13465,7 @@ where &self, refund: &Refund, ) -> Result { let secp_ctx = &self.secp_ctx; - let entropy = &*self.entropy_source; + let entropy = &self.entropy_source; let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(self); @@ -13537,7 +13530,7 @@ where optional_params: OptionalOfferPaymentParams, dns_resolvers: Vec, ) -> Result<(), ()> { let (onion_message, context) = - self.flow.hrn_resolver.resolve_name(payment_id, name, &*self.entropy_source)?; + self.flow.hrn_resolver.resolve_name(payment_id, name, &self.entropy_source)?; let expiration = StaleExpiration::TimerTicks(1); self.pending_outbound_payments.add_new_awaiting_offer( @@ -14049,7 +14042,7 @@ where impl< M: Deref, T: BroadcasterInterface, - ES: Deref, + ES: EntropySource, NS: Deref, SP: Deref, F: Deref, @@ -14059,7 +14052,6 @@ impl< > BaseMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, @@ -14406,7 +14398,7 @@ where impl< M: Deref, T: BroadcasterInterface, - ES: Deref, + ES: EntropySource, NS: Deref, SP: Deref, F: Deref, @@ -14416,7 +14408,6 @@ impl< > EventsProvider for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, @@ -14440,7 +14431,7 @@ where impl< M: Deref, T: BroadcasterInterface, - ES: Deref, + ES: EntropySource, NS: Deref, SP: Deref, F: Deref, @@ -14450,7 +14441,6 @@ impl< > chain::Listen for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, @@ -14500,7 +14490,7 @@ where impl< M: Deref, T: BroadcasterInterface, - ES: Deref, + ES: EntropySource, NS: Deref, SP: Deref, F: Deref, @@ -14510,7 +14500,6 @@ impl< > chain::Confirm for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, @@ -14672,7 +14661,7 @@ pub(super) enum FundingConfirmedMessage { impl< M: Deref, T: BroadcasterInterface, - ES: Deref, + ES: EntropySource, NS: Deref, SP: Deref, F: Deref, @@ -14682,7 +14671,6 @@ impl< > ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, @@ -15033,7 +15021,7 @@ where impl< M: Deref, T: BroadcasterInterface, - ES: Deref, + ES: EntropySource, NS: Deref, SP: Deref, F: Deref, @@ -15043,7 +15031,6 @@ impl< > ChannelMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, @@ -15607,7 +15594,7 @@ where impl< M: Deref, T: BroadcasterInterface, - ES: Deref, + ES: EntropySource, NS: Deref, SP: Deref, F: Deref, @@ -15617,7 +15604,6 @@ impl< > OffersMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, @@ -15824,7 +15810,7 @@ where impl< M: Deref, T: BroadcasterInterface, - ES: Deref, + ES: EntropySource, NS: Deref, SP: Deref, F: Deref, @@ -15834,7 +15820,6 @@ impl< > AsyncPaymentsMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, @@ -15868,7 +15853,7 @@ where responder.clone(), self.get_peers_for_blinded_path(), self.list_usable_channels(), - &*self.entropy_source, + &self.entropy_source, &*self.router, ) { Some((msg, ctx)) => (msg, ctx), @@ -16025,7 +16010,7 @@ where impl< M: Deref, T: BroadcasterInterface, - ES: Deref, + ES: EntropySource, NS: Deref, SP: Deref, F: Deref, @@ -16035,7 +16020,6 @@ impl< > DNSResolverMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, @@ -16092,7 +16076,7 @@ where impl< M: Deref, T: BroadcasterInterface, - ES: Deref, + ES: EntropySource, NS: Deref, SP: Deref, F: Deref, @@ -16102,7 +16086,6 @@ impl< > NodeIdLookUp for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, @@ -16607,7 +16590,7 @@ impl_writeable_tlv_based!(PendingInboundPayment, { impl< M: Deref, T: BroadcasterInterface, - ES: Deref, + ES: EntropySource, NS: Deref, SP: Deref, F: Deref, @@ -16617,7 +16600,6 @@ impl< > Writeable for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, @@ -16973,7 +16955,7 @@ pub struct ChannelManagerReadArgs< 'a, M: Deref, T: BroadcasterInterface, - ES: Deref, + ES: EntropySource, NS: Deref, SP: Deref, F: Deref, @@ -16982,7 +16964,6 @@ pub struct ChannelManagerReadArgs< L: Deref + Clone, > where M::Target: chain::Watch<::EcdsaSigner>, - ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, @@ -17052,7 +17033,7 @@ impl< 'a, M: Deref, T: BroadcasterInterface, - ES: Deref, + ES: EntropySource, NS: Deref, SP: Deref, F: Deref, @@ -17062,7 +17043,6 @@ impl< > ChannelManagerReadArgs<'a, M, T, ES, NS, SP, F, R, MR, L> where M::Target: chain::Watch<::EcdsaSigner>, - ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, @@ -17139,7 +17119,7 @@ impl< 'a, M: Deref, T: BroadcasterInterface, - ES: Deref, + ES: EntropySource, NS: Deref, SP: Deref, F: Deref, @@ -17150,7 +17130,6 @@ impl< for (BlockHash, Arc>) where M::Target: chain::Watch<::EcdsaSigner>, - ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, @@ -17171,7 +17150,7 @@ impl< 'a, M: Deref, T: BroadcasterInterface, - ES: Deref, + ES: EntropySource, NS: Deref, SP: Deref, F: Deref, @@ -17182,7 +17161,6 @@ impl< for (BlockHash, ChannelManager) where M::Target: chain::Watch<::EcdsaSigner>, - ES::Target: EntropySource, NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, diff --git a/lightning/src/ln/functional_test_utils.rs b/lightning/src/ln/functional_test_utils.rs index c4fd4f694a3..76497a8805a 100644 --- a/lightning/src/ln/functional_test_utils.rs +++ b/lightning/src/ln/functional_test_utils.rs @@ -733,7 +733,7 @@ pub trait NodeHolder { ) -> &ChannelManager< ::M, ::Broadcaster, - ::ES, + ::EntropySource, ::NS, ::SP, ::F, @@ -750,7 +750,7 @@ impl NodeHolder for &H { ) -> &ChannelManager< ::M, ::Broadcaster, - ::ES, + ::EntropySource, ::NS, ::SP, ::F, diff --git a/lightning/src/ln/inbound_payment.rs b/lightning/src/ln/inbound_payment.rs index 17c2526e78d..03e271d196d 100644 --- a/lightning/src/ln/inbound_payment.rs +++ b/lightning/src/ln/inbound_payment.rs @@ -143,13 +143,10 @@ fn min_final_cltv_expiry_delta_from_metadata(bytes: [u8; METADATA_LEN]) -> u16 { /// /// [phantom node payments]: crate::sign::PhantomKeysManager /// [`NodeSigner::get_expanded_key`]: crate::sign::NodeSigner::get_expanded_key -pub fn create( +pub fn create( keys: &ExpandedKey, min_value_msat: Option, invoice_expiry_delta_secs: u32, entropy_source: &ES, current_time: u64, min_final_cltv_expiry_delta: Option, -) -> Result<(PaymentHash, PaymentSecret), ()> -where - ES::Target: EntropySource, -{ +) -> Result<(PaymentHash, PaymentSecret), ()> { let metadata_bytes = construct_metadata_bytes( min_value_msat, if min_final_cltv_expiry_delta.is_some() { diff --git a/lightning/src/ln/interactivetxs.rs b/lightning/src/ln/interactivetxs.rs index 4340aad420a..712a73d0700 100644 --- a/lightning/src/ln/interactivetxs.rs +++ b/lightning/src/ln/interactivetxs.rs @@ -39,7 +39,6 @@ use crate::ln::types::ChannelId; use crate::sign::{EntropySource, P2TR_KEY_PATH_WITNESS_WEIGHT, P2WPKH_WITNESS_WEIGHT}; use core::fmt::Display; -use core::ops::Deref; /// The number of received `tx_add_input` messages during a negotiation at which point the /// negotiation MUST be failed. @@ -1990,10 +1989,9 @@ macro_rules! do_state_transition { }}; } -fn generate_holder_serial_id(entropy_source: &ES, is_initiator: bool) -> SerialId -where - ES::Target: EntropySource, -{ +fn generate_holder_serial_id( + entropy_source: &ES, is_initiator: bool, +) -> SerialId { let rand_bytes = entropy_source.get_secure_random_bytes(); let mut serial_id_bytes = [0u8; 8]; serial_id_bytes.copy_from_slice(&rand_bytes[..8]); @@ -2009,10 +2007,7 @@ pub(super) enum HandleTxCompleteValue { NegotiationComplete(Option, OutPoint), } -pub(super) struct InteractiveTxConstructorArgs<'a, ES: Deref> -where - ES::Target: EntropySource, -{ +pub(super) struct InteractiveTxConstructorArgs<'a, ES: EntropySource> { pub entropy_source: &'a ES, pub holder_node_id: PublicKey, pub counterparty_node_id: PublicKey, @@ -2031,10 +2026,9 @@ impl InteractiveTxConstructor { /// /// If the holder is the initiator, they need to send the first message which is a `TxAddInput` /// message. - pub fn new(args: InteractiveTxConstructorArgs) -> Result - where - ES::Target: EntropySource, - { + pub fn new( + args: InteractiveTxConstructorArgs, + ) -> Result { let InteractiveTxConstructorArgs { entropy_source, holder_node_id, @@ -2420,7 +2414,6 @@ mod tests { OutPoint, PubkeyHash, ScriptBuf, Sequence, SignedAmount, Transaction, TxIn, TxOut, WPubkeyHash, }; - use core::ops::Deref; use super::{ get_output_weight, ConstructedTransaction, InteractiveTxSigningSession, TxInMetadata, @@ -2490,19 +2483,15 @@ mod tests { do_test_interactive_tx_constructor_internal(session, &&entropy_source); } - fn do_test_interactive_tx_constructor_with_entropy_source( + fn do_test_interactive_tx_constructor_with_entropy_source( session: TestSession, entropy_source: ES, - ) where - ES::Target: EntropySource, - { + ) { do_test_interactive_tx_constructor_internal(session, &entropy_source); } - fn do_test_interactive_tx_constructor_internal( + fn do_test_interactive_tx_constructor_internal( session: TestSession, entropy_source: &ES, - ) where - ES::Target: EntropySource, - { + ) { let channel_id = ChannelId(entropy_source.get_secure_random_bytes()); let funding_tx_locktime = AbsoluteLockTime::from_height(1337).unwrap(); let holder_node_id = PublicKey::from_secret_key( diff --git a/lightning/src/ln/invoice_utils.rs b/lightning/src/ln/invoice_utils.rs index 425cc4d7eb6..8d5af244735 100644 --- a/lightning/src/ln/invoice_utils.rs +++ b/lightning/src/ln/invoice_utils.rs @@ -67,14 +67,13 @@ use core::time::Duration; feature = "std", doc = "This can be used in a `no_std` environment, where [`std::time::SystemTime`] is not available and the current time is supplied by the caller." )] -pub fn create_phantom_invoice( +pub fn create_phantom_invoice( amt_msat: Option, payment_hash: Option, description: String, invoice_expiry_delta_secs: u32, phantom_route_hints: Vec, entropy_source: ES, node_signer: NS, logger: L, network: Currency, min_final_cltv_expiry_delta: Option, duration_since_epoch: Duration, ) -> Result> where - ES::Target: EntropySource, NS::Target: NodeSigner, L::Target: Logger, { @@ -135,14 +134,13 @@ where feature = "std", doc = "This version can be used in a `no_std` environment, where [`std::time::SystemTime`] is not available and the current time is supplied by the caller." )] -pub fn create_phantom_invoice_with_description_hash( +pub fn create_phantom_invoice_with_description_hash( amt_msat: Option, payment_hash: Option, invoice_expiry_delta_secs: u32, description_hash: Sha256, phantom_route_hints: Vec, entropy_source: ES, node_signer: NS, logger: L, network: Currency, min_final_cltv_expiry_delta: Option, duration_since_epoch: Duration, ) -> Result> where - ES::Target: EntropySource, NS::Target: NodeSigner, L::Target: Logger, { @@ -163,14 +161,13 @@ where const MAX_CHANNEL_HINTS: usize = 3; -fn _create_phantom_invoice( +fn _create_phantom_invoice( amt_msat: Option, payment_hash: Option, description: Bolt11InvoiceDescription, invoice_expiry_delta_secs: u32, phantom_route_hints: Vec, entropy_source: ES, node_signer: NS, logger: L, network: Currency, min_final_cltv_expiry_delta: Option, duration_since_epoch: Duration, ) -> Result> where - ES::Target: EntropySource, NS::Target: NodeSigner, L::Target: Logger, { diff --git a/lightning/src/ln/outbound_payment.rs b/lightning/src/ln/outbound_payment.rs index 75fe55bfeac..9483a593a3b 100644 --- a/lightning/src/ln/outbound_payment.rs +++ b/lightning/src/ln/outbound_payment.rs @@ -872,7 +872,7 @@ where } #[rustfmt::skip] - pub(super) fn send_payment( + pub(super) fn send_payment( &self, payment_hash: PaymentHash, recipient_onion: RecipientOnionFields, payment_id: PaymentId, retry_strategy: Retry, route_params: RouteParameters, router: &R, first_hops: Vec, compute_inflight_htlcs: IH, entropy_source: &ES, @@ -881,7 +881,6 @@ where ) -> Result<(), RetryableSendFailure> where R::Target: Router, - ES::Target: EntropySource, NS::Target: NodeSigner, IH: Fn() -> InFlightHtlcs, SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, @@ -892,7 +891,7 @@ where } #[rustfmt::skip] - pub(super) fn send_spontaneous_payment( + pub(super) fn send_spontaneous_payment( &self, payment_preimage: Option, recipient_onion: RecipientOnionFields, payment_id: PaymentId, retry_strategy: Retry, route_params: RouteParameters, router: &R, first_hops: Vec, inflight_htlcs: IH, entropy_source: &ES, @@ -901,7 +900,6 @@ where ) -> Result where R::Target: Router, - ES::Target: EntropySource, NS::Target: NodeSigner, IH: Fn() -> InFlightHtlcs, SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, @@ -916,7 +914,7 @@ where } #[rustfmt::skip] - pub(super) fn pay_for_bolt11_invoice( + pub(super) fn pay_for_bolt11_invoice( &self, invoice: &Bolt11Invoice, payment_id: PaymentId, amount_msats: Option, route_params_config: RouteParametersConfig, @@ -928,7 +926,6 @@ where ) -> Result<(), Bolt11PaymentError> where R::Target: Router, - ES::Target: EntropySource, NS::Target: NodeSigner, IH: Fn() -> InFlightHtlcs, SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, @@ -963,7 +960,7 @@ where #[rustfmt::skip] pub(super) fn send_payment_for_bolt12_invoice< - R: Deref, ES: Deref, NS: Deref, NL: Deref, IH, SP + R: Deref, ES: EntropySource, NS: Deref, NL: Deref, IH, SP >( &self, invoice: &Bolt12Invoice, payment_id: PaymentId, router: &R, first_hops: Vec, features: Bolt12InvoiceFeatures, inflight_htlcs: IH, @@ -974,7 +971,6 @@ where ) -> Result<(), Bolt12PaymentError> where R::Target: Router, - ES::Target: EntropySource, NS::Target: NodeSigner, NL::Target: NodeIdLookUp, IH: Fn() -> InFlightHtlcs, @@ -1008,7 +1004,7 @@ where #[rustfmt::skip] fn send_payment_for_bolt12_invoice_internal< - R: Deref, ES: Deref, NS: Deref, NL: Deref, IH, SP + R: Deref, ES: EntropySource, NS: Deref, NL: Deref, IH, SP >( &self, payment_id: PaymentId, payment_hash: PaymentHash, keysend_preimage: Option, invoice_request: Option<&InvoiceRequest>, @@ -1021,7 +1017,6 @@ where ) -> Result<(), Bolt12PaymentError> where R::Target: Router, - ES::Target: EntropySource, NS::Target: NodeSigner, NL::Target: NodeIdLookUp, IH: Fn() -> InFlightHtlcs, @@ -1115,14 +1110,11 @@ where Ok(()) } - pub(super) fn static_invoice_received( + pub(super) fn static_invoice_received( &self, invoice: &StaticInvoice, payment_id: PaymentId, features: Bolt12InvoiceFeatures, best_block_height: u32, duration_since_epoch: Duration, entropy_source: ES, pending_events: &Mutex)>>, - ) -> Result<(), Bolt12PaymentError> - where - ES::Target: EntropySource, - { + ) -> Result<(), Bolt12PaymentError> { macro_rules! abandon_with_entry { ($payment: expr, $reason: expr) => { assert!( @@ -1226,7 +1218,7 @@ where pub(super) fn send_payment_for_static_invoice< R: Deref, - ES: Deref, + ES: EntropySource, NS: Deref, NL: Deref, IH, @@ -1240,7 +1232,6 @@ where ) -> Result<(), Bolt12PaymentError> where R::Target: Router, - ES::Target: EntropySource, NS::Target: NodeSigner, NL::Target: NodeIdLookUp, IH: Fn() -> InFlightHtlcs, @@ -1307,7 +1298,7 @@ where } // Returns whether the data changed and needs to be repersisted. - pub(super) fn check_retry_payments( + pub(super) fn check_retry_payments( &self, router: &R, first_hops: FH, inflight_htlcs: IH, entropy_source: &ES, node_signer: &NS, best_block_height: u32, pending_events: &Mutex)>>, @@ -1315,7 +1306,6 @@ where ) -> bool where R::Target: Router, - ES::Target: EntropySource, NS::Target: NodeSigner, SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, IH: Fn() -> InFlightHtlcs, @@ -1469,7 +1459,7 @@ where /// [`Event::PaymentPathFailed`]: crate::events::Event::PaymentPathFailed /// [`Event::PaymentFailed`]: crate::events::Event::PaymentFailed #[rustfmt::skip] - fn send_payment_for_non_bolt12_invoice( + fn send_payment_for_non_bolt12_invoice( &self, payment_id: PaymentId, payment_hash: PaymentHash, recipient_onion: RecipientOnionFields, keysend_preimage: Option, retry_strategy: Retry, mut route_params: RouteParameters, router: &R, first_hops: Vec, inflight_htlcs: IH, entropy_source: &ES, @@ -1478,7 +1468,6 @@ where ) -> Result<(), RetryableSendFailure> where R::Target: Router, - ES::Target: EntropySource, NS::Target: NodeSigner, L::Target: Logger, IH: Fn() -> InFlightHtlcs, @@ -1514,7 +1503,7 @@ where } #[rustfmt::skip] - fn find_route_and_send_payment( + fn find_route_and_send_payment( &self, payment_hash: PaymentHash, payment_id: PaymentId, route_params: RouteParameters, router: &R, first_hops: Vec, inflight_htlcs: &IH, entropy_source: &ES, node_signer: &NS, best_block_height: u32, @@ -1522,7 +1511,6 @@ where ) where R::Target: Router, - ES::Target: EntropySource, NS::Target: NodeSigner, L::Target: Logger, IH: Fn() -> InFlightHtlcs, @@ -1675,7 +1663,7 @@ where } #[rustfmt::skip] - fn handle_pay_route_err( + fn handle_pay_route_err( &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, inflight_htlcs: &IH, entropy_source: &ES, node_signer: &NS, @@ -1685,7 +1673,6 @@ where ) where R::Target: Router, - ES::Target: EntropySource, NS::Target: NodeSigner, IH: Fn() -> InFlightHtlcs, SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, @@ -1792,12 +1779,11 @@ where } #[rustfmt::skip] - pub(super) fn send_probe( + pub(super) fn send_probe( &self, path: Path, probing_cookie_secret: [u8; 32], entropy_source: &ES, node_signer: &NS, best_block_height: u32, send_payment_along_path: F ) -> Result<(PaymentHash, PaymentId), ProbeSendFailure> where - ES::Target: EntropySource, NS::Target: NodeSigner, F: Fn(SendAlongPathArgs) -> Result<(), APIError>, { @@ -1867,20 +1853,20 @@ where #[cfg(any(test, feature = "_externalize_tests"))] #[rustfmt::skip] - pub(super) fn test_add_new_pending_payment( + pub(super) fn test_add_new_pending_payment( &self, payment_hash: PaymentHash, recipient_onion: RecipientOnionFields, payment_id: PaymentId, route: &Route, retry_strategy: Option, entropy_source: &ES, best_block_height: u32 - ) -> Result, PaymentSendFailure> where ES::Target: EntropySource { + ) -> Result, PaymentSendFailure> { self.add_new_pending_payment(payment_hash, recipient_onion, payment_id, None, route, retry_strategy, None, entropy_source, best_block_height, None) } #[rustfmt::skip] - pub(super) fn add_new_pending_payment( + pub(super) fn add_new_pending_payment( &self, payment_hash: PaymentHash, recipient_onion: RecipientOnionFields, payment_id: PaymentId, keysend_preimage: Option, route: &Route, retry_strategy: Option, payment_params: Option, entropy_source: &ES, best_block_height: u32, bolt12_invoice: Option - ) -> Result, PaymentSendFailure> where ES::Target: EntropySource { + ) -> Result, PaymentSendFailure> { let mut pending_outbounds = self.pending_outbound_payments.lock().unwrap(); match pending_outbounds.entry(payment_id) { hash_map::Entry::Occupied(_) => Err(PaymentSendFailure::DuplicatePayment), @@ -1896,15 +1882,12 @@ where } #[rustfmt::skip] - fn create_pending_payment( + fn create_pending_payment( payment_hash: PaymentHash, recipient_onion: RecipientOnionFields, keysend_preimage: Option, invoice_request: Option, bolt12_invoice: Option, route: &Route, retry_strategy: Option, payment_params: Option, entropy_source: &ES, best_block_height: u32 - ) -> (PendingOutboundPayment, Vec<[u8; 32]>) - where - ES::Target: EntropySource, - { + ) -> (PendingOutboundPayment, Vec<[u8; 32]>) { let mut onion_session_privs = Vec::with_capacity(route.paths.len()); for _ in 0..route.paths.len() { onion_session_privs.push(entropy_source.get_secure_random_bytes()); diff --git a/lightning/src/ln/types.rs b/lightning/src/ln/types.rs index 5d72ba685cb..fd8ccbae382 100644 --- a/lightning/src/ln/types.rs +++ b/lightning/src/ln/types.rs @@ -24,7 +24,6 @@ use bitcoin::hashes::{sha256::Hash as Sha256, Hash as _, HashEngine as _}; use bitcoin::hex::display::impl_fmt_traits; use core::borrow::Borrow; -use core::ops::Deref; /// A unique 32-byte identifier for a channel. /// Depending on how the ID is generated, several varieties are distinguished @@ -53,10 +52,7 @@ impl ChannelId { } /// Create a _temporary_ channel ID randomly, based on an entropy source. - pub fn temporary_from_entropy_source(entropy_source: &ES) -> Self - where - ES::Target: EntropySource, - { + pub fn temporary_from_entropy_source(entropy_source: &ES) -> Self { Self(entropy_source.get_secure_random_bytes()) } diff --git a/lightning/src/offers/flow.rs b/lightning/src/offers/flow.rs index 8b03f0ea081..97e92fdaec5 100644 --- a/lightning/src/offers/flow.rs +++ b/lightning/src/offers/flow.rs @@ -550,11 +550,10 @@ where } } - fn create_offer_builder_intern( + fn create_offer_builder_intern( &self, entropy_source: ES, make_paths: PF, ) -> Result<(OfferBuilder<'_, DerivedMetadata, secp256k1::All>, Nonce), Bolt12SemanticError> where - ES::Target: EntropySource, PF: FnOnce( PublicKey, MessageContext, @@ -607,13 +606,10 @@ where /// This is not exported to bindings users as builder patterns don't map outside of move semantics. /// /// [`DefaultMessageRouter`]: crate::onion_message::messenger::DefaultMessageRouter - pub fn create_offer_builder( + pub fn create_offer_builder( &self, entropy_source: ES, peers: Vec, - ) -> Result, Bolt12SemanticError> - where - ES::Target: EntropySource, - { - self.create_offer_builder_intern(&*entropy_source, |_, context, _| { + ) -> Result, Bolt12SemanticError> { + self.create_offer_builder_intern(&entropy_source, |_, context, _| { self.create_blinded_paths(peers, context) .map(|paths| paths.into_iter().take(1)) .map_err(|_| Bolt12SemanticError::MissingPaths) @@ -630,15 +626,14 @@ where /// This is not exported to bindings users as builder patterns don't map outside of move semantics. /// /// See [`Self::create_offer_builder`] for more details on usage. - pub fn create_offer_builder_using_router( + pub fn create_offer_builder_using_router( &self, router: ME, entropy_source: ES, peers: Vec, ) -> Result, Bolt12SemanticError> where ME::Target: MessageRouter, - ES::Target: EntropySource, { let receive_key = self.get_receive_auth_key(); - self.create_offer_builder_intern(&*entropy_source, |node_id, context, secp_ctx| { + self.create_offer_builder_intern(&entropy_source, |node_id, context, secp_ctx| { router .create_blinded_paths(node_id, receive_key, context, peers, secp_ctx) .map(|paths| paths.into_iter().take(1)) @@ -657,23 +652,19 @@ where /// aforementioned always-online node. /// /// This is not exported to bindings users as builder patterns don't map outside of move semantics. - pub fn create_async_receive_offer_builder( + pub fn create_async_receive_offer_builder( &self, entropy_source: ES, message_paths_to_always_online_node: Vec, - ) -> Result<(OfferBuilder<'_, DerivedMetadata, secp256k1::All>, Nonce), Bolt12SemanticError> - where - ES::Target: EntropySource, - { - self.create_offer_builder_intern(&*entropy_source, |_, _, _| { + ) -> Result<(OfferBuilder<'_, DerivedMetadata, secp256k1::All>, Nonce), Bolt12SemanticError> { + self.create_offer_builder_intern(&entropy_source, |_, _, _| { Ok(message_paths_to_always_online_node) }) } - fn create_refund_builder_intern( + fn create_refund_builder_intern( &self, entropy_source: ES, make_paths: PF, amount_msats: u64, absolute_expiry: Duration, payment_id: PaymentId, ) -> Result, Bolt12SemanticError> where - ES::Target: EntropySource, PF: FnOnce( PublicKey, MessageContext, @@ -683,7 +674,7 @@ where { let node_id = self.get_our_node_id(); let expanded_key = &self.inbound_payment_key; - let entropy = &*entropy_source; + let entropy = &entropy_source; let secp_ctx = &self.secp_ctx; let nonce = Nonce::from_entropy_source(entropy); @@ -744,15 +735,12 @@ where /// /// [`Event::PaymentFailed`]: crate::events::Event::PaymentFailed /// [`RouteParameters::from_payment_params_and_value`]: crate::routing::router::RouteParameters::from_payment_params_and_value - pub fn create_refund_builder( + pub fn create_refund_builder( &self, entropy_source: ES, amount_msats: u64, absolute_expiry: Duration, payment_id: PaymentId, peers: Vec, - ) -> Result, Bolt12SemanticError> - where - ES::Target: EntropySource, - { + ) -> Result, Bolt12SemanticError> { self.create_refund_builder_intern( - &*entropy_source, + &entropy_source, |_, context, _| { self.create_blinded_paths(peers, context) .map(|paths| paths.into_iter().take(1)) @@ -785,17 +773,16 @@ where /// [`Bolt12Invoice`]: crate::offers::invoice::Bolt12Invoice /// [`Event::PaymentFailed`]: crate::events::Event::PaymentFailed /// [`RouteParameters::from_payment_params_and_value`]: crate::routing::router::RouteParameters::from_payment_params_and_value - pub fn create_refund_builder_using_router( + pub fn create_refund_builder_using_router( &self, router: ME, entropy_source: ES, amount_msats: u64, absolute_expiry: Duration, payment_id: PaymentId, peers: Vec, ) -> Result, Bolt12SemanticError> where ME::Target: MessageRouter, - ES::Target: EntropySource, { let receive_key = self.get_receive_auth_key(); self.create_refund_builder_intern( - &*entropy_source, + &entropy_source, |node_id, context, secp_ctx| { router .create_blinded_paths(node_id, receive_key, context, peers, secp_ctx) @@ -905,12 +892,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: Deref, R: Deref, F>( + pub fn create_invoice_builder_from_refund<'a, ES: EntropySource, R: Deref, F>( &'a self, router: &R, entropy_source: ES, refund: &'a Refund, usable_channels: Vec, get_payment_info: F, ) -> Result, Bolt12SemanticError> where - ES::Target: EntropySource, R::Target: Router, F: Fn(u64, u32) -> Result<(PaymentHash, PaymentSecret), Bolt12SemanticError>, { @@ -919,7 +905,7 @@ where } let expanded_key = &self.inbound_payment_key; - let entropy = &*entropy_source; + let entropy = &entropy_source; let amount_msats = refund.amount_msats(); let relative_expiry = DEFAULT_RELATIVE_EXPIRY.as_secs() as u32; @@ -1282,12 +1268,9 @@ where /// received to our node. /// /// [`ReleaseHeldHtlc`]: crate::onion_message::async_payments::ReleaseHeldHtlc - pub fn path_for_release_held_htlc( + pub fn path_for_release_held_htlc( &self, intercept_id: InterceptId, prev_outbound_scid_alias: u64, htlc_id: u64, entropy: ES, - ) -> BlindedMessagePath - where - ES::Target: EntropySource, - { + ) -> BlindedMessagePath { // In the future, we should support multi-hop paths here. let context = MessageContext::AsyncPayments(AsyncPaymentsContext::ReleaseHeldHtlc { intercept_id, @@ -1302,7 +1285,7 @@ where self.receive_auth_key, context, false, - &*entropy, + &entropy, &self.secp_ctx, ) } @@ -1589,13 +1572,12 @@ 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( + pub fn handle_offer_paths( &self, message: OfferPaths, context: AsyncPaymentsContext, responder: Responder, peers: Vec, usable_channels: Vec, entropy: ES, router: R, ) -> Option<(ServeStaticInvoice, MessageContext)> where - ES::Target: EntropySource, R::Target: Router, { let duration_since_epoch = self.duration_since_epoch(); @@ -1624,7 +1606,7 @@ where } let (mut offer_builder, offer_nonce) = - match self.create_async_receive_offer_builder(&*entropy, message.paths) { + match self.create_async_receive_offer_builder(&entropy, message.paths) { Ok((builder, nonce)) => (builder, nonce), Err(_) => return None, // Only reachable if OfferPaths::paths is empty }; diff --git a/lightning/src/offers/nonce.rs b/lightning/src/offers/nonce.rs index 0675414125f..8c99a464abc 100644 --- a/lightning/src/offers/nonce.rs +++ b/lightning/src/offers/nonce.rs @@ -13,7 +13,6 @@ use crate::io::{self, Read}; use crate::ln::msgs::DecodeError; use crate::sign::EntropySource; use crate::util::ser::{Readable, Writeable, Writer}; -use core::ops::Deref; #[allow(unused_imports)] use crate::prelude::*; @@ -34,10 +33,7 @@ impl Nonce { pub const LENGTH: usize = 16; /// Creates a `Nonce` from the given [`EntropySource`]. - pub fn from_entropy_source(entropy_source: ES) -> Self - where - ES::Target: EntropySource, - { + pub fn from_entropy_source(entropy_source: ES) -> Self { let mut bytes = [0u8; Self::LENGTH]; let rand_bytes = entropy_source.get_secure_random_bytes(); bytes.copy_from_slice(&rand_bytes[..Self::LENGTH]); diff --git a/lightning/src/offers/refund.rs b/lightning/src/offers/refund.rs index dd2c3e2a92e..c0fd9dfdd3e 100644 --- a/lightning/src/offers/refund.rs +++ b/lightning/src/offers/refund.rs @@ -110,7 +110,6 @@ use bitcoin::constants::ChainHash; use bitcoin::network::Network; use bitcoin::secp256k1::{self, PublicKey, Secp256k1}; use core::hash::{Hash, Hasher}; -use core::ops::Deref; use core::str::FromStr; use core::time::Duration; @@ -624,13 +623,10 @@ macro_rules! respond_with_derived_signing_pubkey_methods { ($self: ident, $build /// /// [`Bolt12Invoice`]: crate::offers::invoice::Bolt12Invoice #[cfg(feature = "std")] - pub fn respond_using_derived_keys( + pub fn respond_using_derived_keys( &$self, payment_paths: Vec, payment_hash: PaymentHash, expanded_key: &ExpandedKey, entropy_source: ES - ) -> Result<$builder, Bolt12SemanticError> - where - ES::Target: EntropySource, - { + ) -> Result<$builder, Bolt12SemanticError> { let created_at = std::time::SystemTime::now() .duration_since(std::time::SystemTime::UNIX_EPOCH) .expect("SystemTime::now() should come after SystemTime::UNIX_EPOCH"); @@ -648,13 +644,10 @@ macro_rules! respond_with_derived_signing_pubkey_methods { ($self: ident, $build /// This is not exported to bindings users as builder patterns don't map outside of move semantics. /// /// [`Bolt12Invoice`]: crate::offers::invoice::Bolt12Invoice - pub fn respond_using_derived_keys_no_std( + pub fn respond_using_derived_keys_no_std( &$self, payment_paths: Vec, payment_hash: PaymentHash, created_at: core::time::Duration, expanded_key: &ExpandedKey, entropy_source: ES - ) -> Result<$builder, Bolt12SemanticError> - where - ES::Target: EntropySource, - { + ) -> Result<$builder, Bolt12SemanticError> { if $self.features().requires_unknown_bits() { return Err(Bolt12SemanticError::UnknownRequiredFeatures); } diff --git a/lightning/src/onion_message/messenger.rs b/lightning/src/onion_message/messenger.rs index dbeab3937d0..d859d35dc09 100644 --- a/lightning/src/onion_message/messenger.rs +++ b/lightning/src/onion_message/messenger.rs @@ -66,9 +66,7 @@ pub(super) const MAX_TIMER_TICKS: usize = 2; /// languages. pub trait AOnionMessenger { /// A type implementing [`EntropySource`] - type EntropySource: EntropySource + ?Sized; - /// A type that may be dereferenced to [`Self::EntropySource`] - type ES: Deref; + type EntropySource: EntropySource; /// A type implementing [`NodeSigner`] type NodeSigner: NodeSigner + ?Sized; /// A type that may be dereferenced to [`Self::NodeSigner`] @@ -105,7 +103,7 @@ pub trait AOnionMessenger { fn get_om( &self, ) -> &OnionMessenger< - Self::ES, + Self::EntropySource, Self::NS, Self::L, Self::NL, @@ -118,7 +116,7 @@ pub trait AOnionMessenger { } impl< - ES: Deref, + ES: EntropySource, NS: Deref, L: Deref, NL: Deref, @@ -129,7 +127,6 @@ impl< CMH: Deref, > AOnionMessenger for OnionMessenger where - ES::Target: EntropySource, NS::Target: NodeSigner, L::Target: Logger, NL::Target: NodeIdLookUp, @@ -139,8 +136,7 @@ where DRH::Target: DNSResolverMessageHandler, CMH::Target: CustomOnionMessageHandler, { - type EntropySource = ES::Target; - type ES = ES; + type EntropySource = ES; type NodeSigner = NS::Target; type NS = NS; type Logger = L::Target; @@ -284,7 +280,7 @@ where /// [`InvoiceRequest`]: crate::offers::invoice_request::InvoiceRequest /// [`Bolt12Invoice`]: crate::offers::invoice::Bolt12Invoice pub struct OnionMessenger< - ES: Deref, + ES: EntropySource, NS: Deref, L: Deref, NL: Deref, @@ -294,7 +290,6 @@ pub struct OnionMessenger< DRH: Deref, CMH: Deref, > where - ES::Target: EntropySource, NS::Target: NodeSigner, L::Target: Logger, NL::Target: NodeIdLookUp, @@ -549,10 +544,9 @@ pub trait MessageRouter { /// node. Otherwise, there is no way to find a path to the introduction node in order to send a /// message, and thus an `Err` is returned. The impact of this may be somewhat muted when /// additional dummy hops are added to the blinded path, but this protection is not complete. -pub struct DefaultMessageRouter>, L: Deref, ES: Deref> +pub struct DefaultMessageRouter>, L: Deref, ES: EntropySource> where L::Target: Logger, - ES::Target: EntropySource, { network_graph: G, entropy_source: ES, @@ -569,10 +563,9 @@ pub(crate) const DUMMY_HOPS_PATH_LENGTH: usize = 4; // We add dummy hops until the path reaches this length (including the recipient). pub(crate) const QR_CODED_DUMMY_HOPS_PATH_LENGTH: usize = 2; -impl>, L: Deref, ES: Deref> DefaultMessageRouter +impl>, L: Deref, ES: EntropySource> DefaultMessageRouter where L::Target: Logger, - ES::Target: EntropySource, { /// Creates a [`DefaultMessageRouter`] using the given [`NetworkGraph`]. pub fn new(network_graph: G, entropy_source: ES) -> Self { @@ -660,7 +653,7 @@ where local_node_receive_key, context.clone(), size_constrained, - &**entropy_source, + &entropy_source, secp_ctx, ) }; @@ -738,11 +731,10 @@ where } } -impl>, L: Deref, ES: Deref> MessageRouter +impl>, L: Deref, ES: EntropySource> MessageRouter for DefaultMessageRouter where L::Target: Logger, - ES::Target: EntropySource, { fn find_path( &self, sender: PublicKey, peers: Vec, destination: Destination, @@ -784,19 +776,17 @@ where /// node. Otherwise, there is no way to find a path to the introduction node in order to send a /// message, and thus an `Err` is returned. The impact of this may be somewhat muted when /// additional dummy hops are added to the blinded path, but this protection is not complete. -pub struct NodeIdMessageRouter>, L: Deref, ES: Deref> +pub struct NodeIdMessageRouter>, L: Deref, ES: EntropySource> where L::Target: Logger, - ES::Target: EntropySource, { network_graph: G, entropy_source: ES, } -impl>, L: Deref, ES: Deref> NodeIdMessageRouter +impl>, L: Deref, ES: EntropySource> NodeIdMessageRouter where L::Target: Logger, - ES::Target: EntropySource, { /// Creates a [`NodeIdMessageRouter`] using the given [`NetworkGraph`]. pub fn new(network_graph: G, entropy_source: ES) -> Self { @@ -804,11 +794,10 @@ where } } -impl>, L: Deref, ES: Deref> MessageRouter +impl>, L: Deref, ES: EntropySource> MessageRouter for NodeIdMessageRouter where L::Target: Logger, - ES::Target: EntropySource, { fn find_path( &self, sender: PublicKey, peers: Vec, destination: Destination, @@ -1052,7 +1041,7 @@ pub enum PeeledOnion { /// Returns the node id of the peer to send the message to, the message itself, and any addresses /// needed to connect to the first node. pub fn create_onion_message_resolving_destination< - ES: Deref, + ES: EntropySource, NS: Deref, NL: Deref, T: OnionMessageContents, @@ -1062,7 +1051,6 @@ pub fn create_onion_message_resolving_destination< mut path: OnionMessagePath, contents: T, reply_path: Option, ) -> Result<(PublicKey, OnionMessage, Vec), SendError> where - ES::Target: EntropySource, NS::Target: NodeSigner, NL::Target: NodeIdLookUp, { @@ -1089,13 +1077,12 @@ where /// - unless it can be resolved by [`NodeIdLookUp::next_node_id`]. /// Use [`create_onion_message_resolving_destination`] instead to resolve the introduction node /// first with a [`ReadOnlyNetworkGraph`]. -pub fn create_onion_message( +pub fn create_onion_message( entropy_source: &ES, node_signer: &NS, node_id_lookup: &NL, secp_ctx: &Secp256k1, path: OnionMessagePath, contents: T, reply_path: Option, ) -> Result<(PublicKey, OnionMessage, Vec), SendError> where - ES::Target: EntropySource, NS::Target: NodeSigner, NL::Target: NodeIdLookUp, { @@ -1394,7 +1381,7 @@ macro_rules! drop_handled_events_and_abort { } impl< - ES: Deref, + ES: EntropySource, NS: Deref, L: Deref, NL: Deref, @@ -1405,7 +1392,6 @@ impl< CMH: Deref, > OnionMessenger where - ES::Target: EntropySource, NS::Target: NodeSigner, L::Target: Logger, NL::Target: NodeIdLookUp, @@ -2038,7 +2024,7 @@ fn outbound_buffer_full( } impl< - ES: Deref, + ES: EntropySource, NS: Deref, L: Deref, NL: Deref, @@ -2049,7 +2035,6 @@ impl< CMH: Deref, > EventsProvider for OnionMessenger where - ES::Target: EntropySource, NS::Target: NodeSigner, L::Target: Logger, NL::Target: NodeIdLookUp, @@ -2159,7 +2144,7 @@ where } impl< - ES: Deref, + ES: EntropySource, NS: Deref, L: Deref, NL: Deref, @@ -2170,7 +2155,6 @@ impl< CMH: Deref, > BaseMessageHandler for OnionMessenger where - ES::Target: EntropySource, NS::Target: NodeSigner, L::Target: Logger, NL::Target: NodeIdLookUp, @@ -2231,7 +2215,7 @@ where } impl< - ES: Deref, + ES: EntropySource, NS: Deref, L: Deref, NL: Deref, @@ -2242,7 +2226,6 @@ impl< CMH: Deref, > OnionMessageHandler for OnionMessenger where - ES::Target: EntropySource, NS::Target: NodeSigner, L::Target: Logger, NL::Target: NodeIdLookUp, diff --git a/lightning/src/routing/router.rs b/lightning/src/routing/router.rs index 40580a09c8c..2c1c401dcfd 100644 --- a/lightning/src/routing/router.rs +++ b/lightning/src/routing/router.rs @@ -58,14 +58,13 @@ pub use lightning_types::routing::{RouteHint, RouteHintHop}; pub struct DefaultRouter< G: Deref>, L: Deref, - ES: Deref, + ES: EntropySource, S: Deref, SP: Sized, Sc: ScoreLookUp, > where L::Target: Logger, S::Target: for<'a> LockableScore<'a, ScoreLookUp = Sc>, - ES::Target: EntropySource, { network_graph: G, logger: L, @@ -77,7 +76,7 @@ pub struct DefaultRouter< impl< G: Deref>, L: Deref, - ES: Deref, + ES: EntropySource, S: Deref, SP: Sized, Sc: ScoreLookUp, @@ -85,7 +84,6 @@ impl< where L::Target: Logger, S::Target: for<'a> LockableScore<'a, ScoreLookUp = Sc>, - ES::Target: EntropySource, { /// Creates a new router. pub fn new( @@ -98,7 +96,7 @@ where impl< G: Deref>, L: Deref, - ES: Deref, + ES: EntropySource, S: Deref, SP: Sized, Sc: ScoreLookUp, @@ -106,7 +104,6 @@ impl< where L::Target: Logger, S::Target: for<'a> LockableScore<'a, ScoreLookUp = Sc>, - ES::Target: EntropySource, { #[rustfmt::skip] fn find_route( @@ -200,7 +197,7 @@ where .map(|forward_node| { BlindedPaymentPath::new( &[forward_node], recipient, local_node_receive_key, tlvs.clone(), u64::MAX, MIN_FINAL_CLTV_EXPIRY_DELTA, - &*self.entropy_source, secp_ctx + &self.entropy_source, secp_ctx ) }) .take(MAX_PAYMENT_PATHS) @@ -211,7 +208,7 @@ where _ => { if network_graph.nodes().contains_key(&NodeId::from_pubkey(&recipient)) { BlindedPaymentPath::new( - &[], recipient, local_node_receive_key, tlvs, u64::MAX, MIN_FINAL_CLTV_EXPIRY_DELTA, &*self.entropy_source, + &[], recipient, local_node_receive_key, tlvs, u64::MAX, MIN_FINAL_CLTV_EXPIRY_DELTA, &self.entropy_source, secp_ctx ).map(|path| vec![path]) } else { diff --git a/lightning/src/sign/mod.rs b/lightning/src/sign/mod.rs index 26252c74dd2..51b00a68037 100644 --- a/lightning/src/sign/mod.rs +++ b/lightning/src/sign/mod.rs @@ -878,6 +878,12 @@ pub trait EntropySource { fn get_secure_random_bytes(&self) -> [u8; 32]; } +impl> EntropySource for E { + fn get_secure_random_bytes(&self) -> [u8; 32] { + self.deref().get_secure_random_bytes() + } +} + /// A trait that can handle cryptographic operations at the scope level of a node. pub trait NodeSigner { /// Get the [`ExpandedKey`] which provides cryptographic material for various Lightning Network operations. diff --git a/lightning/src/util/anchor_channel_reserves.rs b/lightning/src/util/anchor_channel_reserves.rs index 26212ca3966..ff29e8adbd4 100644 --- a/lightning/src/util/anchor_channel_reserves.rs +++ b/lightning/src/util/anchor_channel_reserves.rs @@ -277,7 +277,7 @@ pub fn can_support_additional_anchor_channel< EstimatorRef: Deref, LoggerRef: Deref, PersistRef: Deref, - EntropySourceRef: Deref, + ES: EntropySource, ChainMonitorRef: Deref< Target = ChainMonitor< ChannelSigner, @@ -286,7 +286,7 @@ pub fn can_support_additional_anchor_channel< EstimatorRef, LoggerRef, PersistRef, - EntropySourceRef, + ES, >, >, >( @@ -299,7 +299,6 @@ where EstimatorRef::Target: FeeEstimator, LoggerRef::Target: Logger, PersistRef::Target: Persist, - EntropySourceRef::Target: EntropySource, { let mut anchor_channels = new_hash_set(); // Calculate the number of in-progress anchor channels by inspecting ChannelMonitors with balance. diff --git a/lightning/src/util/persist.rs b/lightning/src/util/persist.rs index 92a565a28f8..ecc2d946acd 100644 --- a/lightning/src/util/persist.rs +++ b/lightning/src/util/persist.rs @@ -445,12 +445,11 @@ impl Persist( +pub fn read_channel_monitors( kv_store: K, entropy_source: ES, signer_provider: SP, ) -> Result::EcdsaSigner>)>, io::Error> where K::Target: KVStoreSync, - ES::Target: EntropySource + Sized, SP::Target: SignerProvider + Sized, { let mut res = Vec::new(); @@ -465,7 +464,7 @@ where CHANNEL_MONITOR_PERSISTENCE_SECONDARY_NAMESPACE, &stored_key, )?), - (&*entropy_source, &*signer_provider), + (&entropy_source, &*signer_provider), ) { Ok(Some((block_hash, channel_monitor))) => { let monitor_name = MonitorName::from_str(&stored_key)?; @@ -591,7 +590,7 @@ fn poll_sync_future(future: F) -> F::Output { pub struct MonitorUpdatingPersister< K: Deref, L: Deref, - ES: Deref, + ES: EntropySource, SP: Deref, BI: BroadcasterInterface, FE: Deref, @@ -599,16 +598,14 @@ pub struct MonitorUpdatingPersister< where K::Target: KVStoreSync, L::Target: Logger, - ES::Target: EntropySource + Sized, SP::Target: SignerProvider + Sized, FE::Target: FeeEstimator; -impl +impl MonitorUpdatingPersister where K::Target: KVStoreSync, L::Target: Logger, - ES::Target: EntropySource + Sized, SP::Target: SignerProvider + Sized, FE::Target: FeeEstimator, { @@ -698,7 +695,7 @@ impl< ChannelSigner: EcdsaChannelSigner, K: Deref, L: Deref, - ES: Deref, + ES: EntropySource, SP: Deref, BI: BroadcasterInterface, FE: Deref, @@ -706,7 +703,6 @@ impl< where K::Target: KVStoreSync, L::Target: Logger, - ES::Target: EntropySource + Sized, SP::Target: SignerProvider + Sized, FE::Target: FeeEstimator, { @@ -783,7 +779,7 @@ pub struct MonitorUpdatingPersisterAsync< K: Deref, S: FutureSpawner, L: Deref, - ES: Deref, + ES: EntropySource, SP: Deref, BI: BroadcasterInterface, FE: Deref, @@ -791,7 +787,6 @@ pub struct MonitorUpdatingPersisterAsync< where K::Target: KVStore, L::Target: Logger, - ES::Target: EntropySource + Sized, SP::Target: SignerProvider + Sized, FE::Target: FeeEstimator; @@ -799,14 +794,13 @@ struct MonitorUpdatingPersisterAsyncInner< K: Deref, S: FutureSpawner, L: Deref, - ES: Deref, + ES: EntropySource, SP: Deref, BI: BroadcasterInterface, FE: Deref, > where K::Target: KVStore, L::Target: Logger, - ES::Target: EntropySource + Sized, SP::Target: SignerProvider + Sized, FE::Target: FeeEstimator, { @@ -825,7 +819,7 @@ impl< K: Deref, S: FutureSpawner, L: Deref, - ES: Deref, + ES: EntropySource, SP: Deref, BI: BroadcasterInterface, FE: Deref, @@ -833,7 +827,6 @@ impl< where K::Target: KVStore, L::Target: Logger, - ES::Target: EntropySource + Sized, SP::Target: SignerProvider + Sized, FE::Target: FeeEstimator, { @@ -975,7 +968,7 @@ impl< K: Deref + MaybeSend + MaybeSync + 'static, S: FutureSpawner, L: Deref + MaybeSend + MaybeSync + 'static, - ES: Deref + MaybeSend + MaybeSync + 'static, + ES: EntropySource + MaybeSend + MaybeSync + 'static, SP: Deref + MaybeSend + MaybeSync + 'static, BI: BroadcasterInterface + MaybeSend + MaybeSync + 'static, FE: Deref + MaybeSend + MaybeSync + 'static, @@ -983,7 +976,6 @@ impl< where K::Target: KVStore + MaybeSync, L::Target: Logger, - ES::Target: EntropySource + Sized, SP::Target: SignerProvider + Sized, FE::Target: FeeEstimator, ::EcdsaSigner: MaybeSend + 'static, @@ -1066,7 +1058,7 @@ impl< K: Deref, S: FutureSpawner, L: Deref, - ES: Deref, + ES: EntropySource, SP: Deref, BI: BroadcasterInterface, FE: Deref, @@ -1074,7 +1066,6 @@ impl< where K::Target: KVStore, L::Target: Logger, - ES::Target: EntropySource + Sized, SP::Target: SignerProvider + Sized, FE::Target: FeeEstimator, { @@ -1159,7 +1150,7 @@ where } match ::EcdsaSigner>)>>::read( &mut monitor_cursor, - (&*self.entropy_source, &*self.signer_provider), + (&self.entropy_source, &*self.signer_provider), ) { Ok(None) => Ok(None), Ok(Some((blockhash, channel_monitor))) => { diff --git a/lightning/src/util/scid_utils.rs b/lightning/src/util/scid_utils.rs index b9dcc4688e8..d57c529a41a 100644 --- a/lightning/src/util/scid_utils.rs +++ b/lightning/src/util/scid_utils.rs @@ -80,8 +80,6 @@ pub(crate) mod fake_scid { use bitcoin::constants::ChainHash; use bitcoin::Network; - use core::ops::Deref; - const TEST_SEGWIT_ACTIVATION_HEIGHT: u32 = 1; const MAINNET_SEGWIT_ACTIVATION_HEIGHT: u32 = 481_824; const MAX_TX_INDEX: u32 = 2_500; @@ -110,13 +108,10 @@ pub(crate) mod fake_scid { /// between segwit activation and the current best known height, and the tx index and output /// index are also selected from a "reasonable" range. We add this logic because it makes it /// non-obvious at a glance that the scid is fake, e.g. if it appears in invoice route hints. - pub(crate) fn get_fake_scid( + pub(crate) fn get_fake_scid( &self, highest_seen_blockheight: u32, chain_hash: &ChainHash, fake_scid_rand_bytes: &[u8; 32], entropy_source: &ES, - ) -> u64 - where - ES::Target: EntropySource, - { + ) -> u64 { // Ensure we haven't created a namespace that doesn't fit into the 3 bits we've allocated for // namespaces. assert!((*self as u8) < MAX_NAMESPACES); From 7b20730c620e3b2019ca6ed8b018ed94d40e451d Mon Sep 17 00:00:00 2001 From: Valentine Wallace Date: Wed, 14 Jan 2026 14:19:40 -0500 Subject: [PATCH 04/17] Drop Deref indirection for NodeSigner Reduces generics and verbosity across the codebase, should provide equivalent behavior. Co-Authored-By: Claude Opus 4.5 --- lightning-background-processor/src/lib.rs | 9 +-- lightning-liquidity/src/lsps5/service.rs | 9 +-- lightning-liquidity/src/manager.rs | 70 +++++++------------- lightning/src/blinded_path/message.rs | 3 +- lightning/src/blinded_path/payment.rs | 12 ++-- lightning/src/ln/channel.rs | 43 +++++-------- lightning/src/ln/channelmanager.rs | 74 ++++++++-------------- lightning/src/ln/functional_test_utils.rs | 4 +- lightning/src/ln/invoice_utils.rs | 9 +-- lightning/src/ln/msgs.rs | 11 +--- lightning/src/ln/onion_payment.rs | 6 +- lightning/src/ln/onion_utils.rs | 11 ++-- lightning/src/ln/outbound_payment.rs | 42 ++++-------- lightning/src/ln/peer_channel_encryptor.rs | 33 +++------- lightning/src/ln/peer_handler.rs | 23 +++---- lightning/src/onion_message/messenger.rs | 38 ++++------- lightning/src/sign/mod.rs | 36 +++++++++++ 17 files changed, 170 insertions(+), 263 deletions(-) diff --git a/lightning-background-processor/src/lib.rs b/lightning-background-processor/src/lib.rs index c8898b0690d..6731dae4b2e 100644 --- a/lightning-background-processor/src/lib.rs +++ b/lightning-background-processor/src/lib.rs @@ -421,8 +421,7 @@ pub const NO_ONION_MESSENGER: Option< Arc< dyn AOnionMessenger< EntropySource = &(dyn EntropySource + Send + Sync), - NodeSigner = dyn lightning::sign::NodeSigner + Send + Sync, - NS = &(dyn lightning::sign::NodeSigner + Send + Sync), + NodeSigner = &(dyn lightning::sign::NodeSigner + Send + Sync), Logger = dyn Logger + Send + Sync, L = &'static (dyn Logger + Send + Sync), NodeIdLookUp = DynChannelManager, @@ -480,8 +479,7 @@ pub const NO_LIQUIDITY_MANAGER: Option< Arc< dyn ALiquidityManager< EntropySource = &(dyn EntropySource + Send + Sync), - NodeSigner = dyn lightning::sign::NodeSigner + Send + Sync, - NS = &(dyn lightning::sign::NodeSigner + Send + Sync), + NodeSigner = &(dyn lightning::sign::NodeSigner + Send + Sync), AChannelManager = DynChannelManager, CM = &DynChannelManager, Filter = dyn chain::Filter + Send + Sync, @@ -505,8 +503,7 @@ pub const NO_LIQUIDITY_MANAGER_SYNC: Option< Arc< dyn ALiquidityManagerSync< EntropySource = &(dyn EntropySource + Send + Sync), - NodeSigner = dyn lightning::sign::NodeSigner + Send + Sync, - NS = &(dyn lightning::sign::NodeSigner + Send + Sync), + NodeSigner = &(dyn lightning::sign::NodeSigner + Send + Sync), AChannelManager = DynChannelManager, CM = &DynChannelManager, Filter = dyn chain::Filter + Send + Sync, diff --git a/lightning-liquidity/src/lsps5/service.rs b/lightning-liquidity/src/lsps5/service.rs index 53fa96ee565..489d543ca90 100644 --- a/lightning-liquidity/src/lsps5/service.rs +++ b/lightning-liquidity/src/lsps5/service.rs @@ -125,10 +125,9 @@ impl Default for LSPS5ServiceConfig { /// [`LSPS5ServiceEvent::SendWebhookNotification`]: super::event::LSPS5ServiceEvent::SendWebhookNotification /// [`app_name`]: super::msgs::LSPS5AppName /// [`lsps5.webhook_registered`]: super::msgs::WebhookNotificationMethod::LSPS5WebhookRegistered -pub struct LSPS5ServiceHandler +pub struct LSPS5ServiceHandler where CM::Target: AChannelManager, - NS::Target: NodeSigner, K::Target: KVStore, TP::Target: TimeProvider, { @@ -144,10 +143,9 @@ where persistence_in_flight: AtomicUsize, } -impl LSPS5ServiceHandler +impl LSPS5ServiceHandler where CM::Target: AChannelManager, - NS::Target: NodeSigner, K::Target: KVStore, TP::Target: TimeProvider, { @@ -694,11 +692,10 @@ where } } -impl LSPSProtocolMessageHandler +impl LSPSProtocolMessageHandler for LSPS5ServiceHandler where CM::Target: AChannelManager, - NS::Target: NodeSigner, K::Target: KVStore, TP::Target: TimeProvider, { diff --git a/lightning-liquidity/src/manager.rs b/lightning-liquidity/src/manager.rs index 14b0fa52246..0e897dd7abe 100644 --- a/lightning-liquidity/src/manager.rs +++ b/lightning-liquidity/src/manager.rs @@ -106,9 +106,7 @@ pub trait ALiquidityManager { /// A type implementing [`EntropySource`] type EntropySource: EntropySource + Clone; /// A type implementing [`NodeSigner`] - type NodeSigner: NodeSigner + ?Sized; - /// A type that may be dereferenced to [`Self::NodeSigner`]. - type NS: Deref + Clone; + type NodeSigner: NodeSigner + Clone; /// A type implementing [`AChannelManager`] type AChannelManager: AChannelManager + ?Sized; /// A type that may be dereferenced to [`Self::AChannelManager`]. @@ -132,7 +130,7 @@ pub trait ALiquidityManager { &self, ) -> &LiquidityManager< Self::EntropySource, - Self::NS, + Self::NodeSigner, Self::CM, Self::C, Self::K, @@ -143,7 +141,7 @@ pub trait ALiquidityManager { impl< ES: EntropySource + Clone, - NS: Deref + Clone, + NS: NodeSigner + Clone, CM: Deref + Clone, C: Deref + Clone, K: Deref + Clone, @@ -151,15 +149,13 @@ impl< T: BroadcasterInterface + Clone, > ALiquidityManager for LiquidityManager where - NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, K::Target: KVStore, TP::Target: TimeProvider, { type EntropySource = ES; - type NodeSigner = NS::Target; - type NS = NS; + type NodeSigner = NS; type AChannelManager = CM::Target; type CM = CM; type Filter = C::Target; @@ -182,9 +178,7 @@ pub trait ALiquidityManagerSync { /// A type implementing [`EntropySource`] type EntropySource: EntropySource + Clone; /// A type implementing [`NodeSigner`] - type NodeSigner: NodeSigner + ?Sized; - /// A type that may be dereferenced to [`Self::NodeSigner`]. - type NS: Deref + Clone; + type NodeSigner: NodeSigner + Clone; /// A type implementing [`AChannelManager`] type AChannelManager: AChannelManager + ?Sized; /// A type that may be dereferenced to [`Self::AChannelManager`]. @@ -209,7 +203,7 @@ pub trait ALiquidityManagerSync { &self, ) -> &LiquidityManager< Self::EntropySource, - Self::NS, + Self::NodeSigner, Self::CM, Self::C, KVStoreSyncWrapper, @@ -221,7 +215,7 @@ pub trait ALiquidityManagerSync { &self, ) -> &LiquidityManagerSync< Self::EntropySource, - Self::NS, + Self::NodeSigner, Self::CM, Self::C, Self::KS, @@ -232,7 +226,7 @@ pub trait ALiquidityManagerSync { impl< ES: EntropySource + Clone, - NS: Deref + Clone, + NS: NodeSigner + Clone, CM: Deref + Clone, C: Deref + Clone, KS: Deref + Clone, @@ -240,15 +234,13 @@ impl< T: BroadcasterInterface + Clone, > ALiquidityManagerSync for LiquidityManagerSync where - NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, KS::Target: KVStoreSync, TP::Target: TimeProvider, { type EntropySource = ES; - type NodeSigner = NS::Target; - type NS = NS; + type NodeSigner = NS; type AChannelManager = CM::Target; type CM = CM; type Filter = C::Target; @@ -264,7 +256,7 @@ where &self, ) -> &LiquidityManager< Self::EntropySource, - Self::NS, + Self::NodeSigner, Self::CM, Self::C, KVStoreSyncWrapper, @@ -299,14 +291,13 @@ where /// [`Event::PaymentForwarded`]: lightning::events::Event::PaymentForwarded pub struct LiquidityManager< ES: EntropySource + Clone, - NS: Deref + Clone, + NS: NodeSigner + Clone, CM: Deref + Clone, C: Deref + Clone, K: Deref + Clone, TP: Deref + Clone, T: BroadcasterInterface + Clone, > where - NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, K::Target: KVStore, @@ -336,14 +327,13 @@ pub struct LiquidityManager< #[cfg(feature = "time")] impl< ES: EntropySource + Clone, - NS: Deref + Clone, + NS: NodeSigner + Clone, CM: Deref + Clone, C: Deref + Clone, K: Deref + Clone, T: BroadcasterInterface + Clone, > LiquidityManager where - NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, K::Target: KVStore, @@ -375,7 +365,7 @@ where impl< ES: EntropySource + Clone, - NS: Deref + Clone, + NS: NodeSigner + Clone, CM: Deref + Clone, C: Deref + Clone, K: Deref + Clone, @@ -383,7 +373,6 @@ impl< T: BroadcasterInterface + Clone, > LiquidityManager where - NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, K::Target: KVStore, @@ -800,7 +789,7 @@ where impl< ES: EntropySource + Clone, - NS: Deref + Clone, + NS: NodeSigner + Clone, CM: Deref + Clone, C: Deref + Clone, K: Deref + Clone, @@ -808,7 +797,6 @@ impl< T: BroadcasterInterface + Clone, > CustomMessageReader for LiquidityManager where - NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, K::Target: KVStore, @@ -830,7 +818,7 @@ where impl< ES: EntropySource + Clone, - NS: Deref + Clone, + NS: NodeSigner + Clone, CM: Deref + Clone, C: Deref + Clone, K: Deref + Clone, @@ -838,7 +826,6 @@ impl< T: BroadcasterInterface + Clone, > CustomMessageHandler for LiquidityManager where - NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, K::Target: KVStore, @@ -962,7 +949,7 @@ where impl< ES: EntropySource + Clone, - NS: Deref + Clone, + NS: NodeSigner + Clone, CM: Deref + Clone, C: Deref + Clone, K: Deref + Clone, @@ -970,7 +957,6 @@ impl< T: BroadcasterInterface + Clone, > Listen for LiquidityManager where - NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, K::Target: KVStore, @@ -1006,7 +992,7 @@ where impl< ES: EntropySource + Clone, - NS: Deref + Clone, + NS: NodeSigner + Clone, CM: Deref + Clone, C: Deref + Clone, K: Deref + Clone, @@ -1014,7 +1000,6 @@ impl< T: BroadcasterInterface + Clone, > Confirm for LiquidityManager where - NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, K::Target: KVStore, @@ -1050,14 +1035,13 @@ where /// available. pub struct LiquidityManagerSync< ES: EntropySource + Clone, - NS: Deref + Clone, + NS: NodeSigner + Clone, CM: Deref + Clone, C: Deref + Clone, KS: Deref + Clone, TP: Deref + Clone, T: BroadcasterInterface + Clone, > where - NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, KS::Target: KVStoreSync, @@ -1069,14 +1053,13 @@ pub struct LiquidityManagerSync< #[cfg(feature = "time")] impl< ES: EntropySource + Clone, - NS: Deref + Clone, + NS: NodeSigner + Clone, CM: Deref + Clone, C: Deref + Clone, KS: Deref + Clone, T: BroadcasterInterface + Clone, > LiquidityManagerSync where - NS::Target: NodeSigner, CM::Target: AChannelManager, KS::Target: KVStoreSync, C::Target: Filter, @@ -1119,7 +1102,7 @@ where impl< ES: EntropySource + Clone, - NS: Deref + Clone, + NS: NodeSigner + Clone, CM: Deref + Clone, C: Deref + Clone, KS: Deref + Clone, @@ -1127,7 +1110,6 @@ impl< T: BroadcasterInterface + Clone, > LiquidityManagerSync where - NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, KS::Target: KVStoreSync, @@ -1287,7 +1269,7 @@ where impl< ES: EntropySource + Clone, - NS: Deref + Clone, + NS: NodeSigner + Clone, CM: Deref + Clone, C: Deref + Clone, KS: Deref + Clone, @@ -1295,7 +1277,6 @@ impl< T: BroadcasterInterface + Clone, > CustomMessageReader for LiquidityManagerSync where - NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, KS::Target: KVStoreSync, @@ -1312,7 +1293,7 @@ where impl< ES: EntropySource + Clone, - NS: Deref + Clone, + NS: NodeSigner + Clone, CM: Deref + Clone, C: Deref + Clone, KS: Deref + Clone, @@ -1320,7 +1301,6 @@ impl< T: BroadcasterInterface + Clone, > CustomMessageHandler for LiquidityManagerSync where - NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, KS::Target: KVStoreSync, @@ -1357,7 +1337,7 @@ where impl< ES: EntropySource + Clone, - NS: Deref + Clone, + NS: NodeSigner + Clone, CM: Deref + Clone, C: Deref + Clone, KS: Deref + Clone, @@ -1365,7 +1345,6 @@ impl< T: BroadcasterInterface + Clone, > Listen for LiquidityManagerSync where - NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, KS::Target: KVStoreSync, @@ -1385,7 +1364,7 @@ where impl< ES: EntropySource + Clone, - NS: Deref + Clone, + NS: NodeSigner + Clone, CM: Deref + Clone, C: Deref + Clone, KS: Deref + Clone, @@ -1393,7 +1372,6 @@ impl< T: BroadcasterInterface + Clone, > Confirm for LiquidityManagerSync where - NS::Target: NodeSigner, CM::Target: AChannelManager, C::Target: Filter, KS::Target: KVStoreSync, diff --git a/lightning/src/blinded_path/message.rs b/lightning/src/blinded_path/message.rs index c914458ccbc..68c4a60738b 100644 --- a/lightning/src/blinded_path/message.rs +++ b/lightning/src/blinded_path/message.rs @@ -192,11 +192,10 @@ impl BlindedMessagePath { /// introduction node. /// /// Will only modify `self` when returning `Ok`. - pub fn advance_path_by_one( + pub fn advance_path_by_one( &mut self, node_signer: &NS, node_id_lookup: &NL, secp_ctx: &Secp256k1, ) -> Result<(), ()> where - NS::Target: NodeSigner, NL::Target: NodeIdLookUp, T: secp256k1::Signing + secp256k1::Verification, { diff --git a/lightning/src/blinded_path/payment.rs b/lightning/src/blinded_path/payment.rs index dfa46ee2edd..98fd1afcf95 100644 --- a/lightning/src/blinded_path/payment.rs +++ b/lightning/src/blinded_path/payment.rs @@ -177,15 +177,14 @@ impl BlindedPaymentPath { /// introduction node. /// /// Will only modify `self` when returning `Ok`. - pub fn advance_path_by_one( + pub fn advance_path_by_one( &mut self, node_signer: &NS, node_id_lookup: &NL, secp_ctx: &Secp256k1, ) -> Result<(), ()> where - NS::Target: NodeSigner, NL::Target: NodeIdLookUp, T: secp256k1::Signing + secp256k1::Verification, { - match self.decrypt_intro_payload::(node_signer) { + match self.decrypt_intro_payload(node_signer) { Ok(( BlindedPaymentTlvs::Forward(ForwardTlvs { short_channel_id, .. }), control_tlvs_ss, @@ -209,12 +208,9 @@ impl BlindedPaymentPath { } } - pub(crate) fn decrypt_intro_payload( + pub(crate) fn decrypt_intro_payload( &self, node_signer: &NS, - ) -> Result<(BlindedPaymentTlvs, SharedSecret), ()> - where - NS::Target: NodeSigner, - { + ) -> Result<(BlindedPaymentTlvs, SharedSecret), ()> { let control_tlvs_ss = node_signer.ecdh(Recipient::Node, &self.inner_path.blinding_point, None)?; let rho = onion_utils::gen_rho_from_shared_secret(&control_tlvs_ss.secret_bytes()); diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs index ef59af179fe..7c25fd7e28a 100644 --- a/lightning/src/ln/channel.rs +++ b/lightning/src/ln/channel.rs @@ -7644,12 +7644,11 @@ where /// and the channel is now usable (and public), this may generate an announcement_signatures to /// reply with. #[rustfmt::skip] - pub fn channel_ready( + pub fn channel_ready( &mut self, msg: &msgs::ChannelReady, node_signer: &NS, chain_hash: ChainHash, user_config: &UserConfig, best_block: &BestBlock, logger: &L ) -> Result, ChannelError> where - NS::Target: NodeSigner, L::Target: Logger { if self.context.channel_state.is_peer_disconnected() { @@ -9433,13 +9432,12 @@ where /// successfully and we should restore normal operation. Returns messages which should be sent /// to the remote side. #[rustfmt::skip] - pub fn monitor_updating_restored( + pub fn monitor_updating_restored( &mut self, logger: &L, node_signer: &NS, chain_hash: ChainHash, user_config: &UserConfig, best_block_height: u32, path_for_release_htlc: CBP ) -> MonitorRestoreUpdates where L::Target: Logger, - NS::Target: NodeSigner, CBP: Fn(u64) -> BlindedMessagePath { assert!(self.context.channel_state.is_monitor_update_in_progress()); @@ -9906,14 +9904,13 @@ where /// May panic if some calls other than message-handling calls (which will all Err immediately) /// have been called between remove_uncommitted_htlcs_and_mark_paused and this call. #[rustfmt::skip] - pub fn channel_reestablish( + pub fn channel_reestablish( &mut self, msg: &msgs::ChannelReestablish, logger: &L, node_signer: &NS, chain_hash: ChainHash, user_config: &UserConfig, best_block: &BestBlock, path_for_release_htlc: CBP, ) -> Result where L::Target: Logger, - NS::Target: NodeSigner, CBP: Fn(u64) -> BlindedMessagePath { if !self.context.channel_state.is_peer_disconnected() { @@ -11259,12 +11256,11 @@ where } /// Returns `Some` if a splice [`FundingScope`] was promoted. - fn maybe_promote_splice_funding( + fn maybe_promote_splice_funding( &mut self, node_signer: &NS, chain_hash: ChainHash, user_config: &UserConfig, block_height: u32, logger: &L, ) -> Option where - NS::Target: NodeSigner, L::Target: Logger, { debug_assert!(self.pending_splice.is_some()); @@ -11380,12 +11376,11 @@ where /// In the first case, we store the confirmation height and calculating the short channel id. /// In the second, we simply return an Err indicating we need to be force-closed now. #[rustfmt::skip] - pub fn transactions_confirmed( + pub fn transactions_confirmed( &mut self, block_hash: &BlockHash, height: u32, txdata: &TransactionData, chain_hash: ChainHash, node_signer: &NS, user_config: &UserConfig, logger: &L ) -> Result<(Option, Option), ClosureReason> where - NS::Target: NodeSigner, L::Target: Logger { for &(index_in_block, tx) in txdata.iter() { @@ -11478,12 +11473,11 @@ where /// /// May return some HTLCs (and their payment_hash) which have timed out and should be failed /// back. - pub fn best_block_updated( + pub fn best_block_updated( &mut self, height: u32, highest_header_time: Option, chain_hash: ChainHash, node_signer: &NS, user_config: &UserConfig, logger: &L, ) -> Result where - NS::Target: NodeSigner, L::Target: Logger, { self.do_best_block_updated( @@ -11495,12 +11489,11 @@ where } #[rustfmt::skip] - fn do_best_block_updated( + fn do_best_block_updated( &mut self, height: u32, highest_header_time: Option, chain_node_signer: Option<(ChainHash, &NS, &UserConfig)>, logger: &L ) -> Result<(Option, Vec<(HTLCSource, PaymentHash)>, Option), ClosureReason> where - NS::Target: NodeSigner, L::Target: Logger { let mut timed_out_htlcs = Vec::new(); @@ -11728,9 +11721,9 @@ where /// /// [`ChannelReady`]: crate::ln::msgs::ChannelReady #[rustfmt::skip] - fn get_channel_announcement( + fn get_channel_announcement( &self, node_signer: &NS, chain_hash: ChainHash, user_config: &UserConfig, - ) -> Result where NS::Target: NodeSigner { + ) -> Result { if !self.context.config.announce_for_forwarding { return Err(ChannelError::Ignore("Channel is not available for public announcements".to_owned())); } @@ -11760,12 +11753,11 @@ where } #[rustfmt::skip] - fn get_announcement_sigs( + fn get_announcement_sigs( &mut self, node_signer: &NS, chain_hash: ChainHash, user_config: &UserConfig, best_block_height: u32, logger: &L ) -> Option where - NS::Target: NodeSigner, L::Target: Logger { if self.funding.funding_tx_confirmation_height == 0 || self.funding.funding_tx_confirmation_height + 5 > best_block_height { @@ -11834,9 +11826,9 @@ where /// Signs the given channel announcement, returning a ChannelError::Ignore if no keys are /// available. #[rustfmt::skip] - fn sign_channel_announcement( + fn sign_channel_announcement( &self, node_signer: &NS, announcement: msgs::UnsignedChannelAnnouncement - ) -> Result where NS::Target: NodeSigner { + ) -> Result { if let Some((their_node_sig, their_bitcoin_sig)) = self.context.announcement_sigs { let our_node_key = NodeId::from_pubkey(&node_signer.get_node_id(Recipient::Node) .map_err(|_| ChannelError::Ignore("Signer failed to retrieve own public key".to_owned()))?); @@ -11871,10 +11863,10 @@ where /// channel_announcement message which we can broadcast and storing our counterparty's /// signatures for later reconstruction/rebroadcast of the channel_announcement. #[rustfmt::skip] - pub fn announcement_signatures( + pub fn announcement_signatures( &mut self, node_signer: &NS, chain_hash: ChainHash, best_block_height: u32, msg: &msgs::AnnouncementSignatures, user_config: &UserConfig - ) -> Result where NS::Target: NodeSigner { + ) -> Result { let announcement = self.get_channel_announcement(node_signer, chain_hash, user_config)?; let msghash = hash_to_message!(&Sha256d::hash(&announcement.encode()[..])[..]); @@ -11902,9 +11894,9 @@ where /// Gets a signed channel_announcement for this channel, if we previously received an /// announcement_signatures from our counterparty. #[rustfmt::skip] - pub fn get_signed_channel_announcement( + pub fn get_signed_channel_announcement( &self, node_signer: &NS, chain_hash: ChainHash, best_block_height: u32, user_config: &UserConfig - ) -> Option where NS::Target: NodeSigner { + ) -> Option { if self.funding.funding_tx_confirmation_height == 0 || self.funding.funding_tx_confirmation_height + 5 > best_block_height { return None; } @@ -12603,12 +12595,11 @@ where Ok((holder_balance_floor, counterparty_balance_floor)) } - pub fn splice_locked( + pub fn splice_locked( &mut self, msg: &msgs::SpliceLocked, node_signer: &NS, chain_hash: ChainHash, user_config: &UserConfig, block_height: u32, logger: &L, ) -> Result, ChannelError> where - NS::Target: NodeSigner, L::Target: Logger, { log_info!(logger, "Received splice_locked txid {} from our peer", msg.splice_txid,); diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs index b52f4e2cc55..98dbc97ae31 100644 --- a/lightning/src/ln/channelmanager.rs +++ b/lightning/src/ln/channelmanager.rs @@ -1169,11 +1169,11 @@ impl ClaimablePayments { /// /// If no payment is found, `Err(Vec::new())` is returned. #[rustfmt::skip] - fn begin_claiming_payment( + fn begin_claiming_payment( &mut self, payment_hash: PaymentHash, node_signer: &S, logger: &L, inbound_payment_id_secret: &[u8; 32], custom_tlvs_known: bool, ) -> Result<(Vec, ClaimingPayment), Vec> - where L::Target: Logger, S::Target: NodeSigner, + where L::Target: Logger, { match self.claimable_payments.remove(&payment_hash) { Some(payment) => { @@ -1780,9 +1780,7 @@ pub trait AChannelManager { /// A type implementing [`EntropySource`]. type EntropySource: EntropySource; /// A type implementing [`NodeSigner`]. - type NodeSigner: NodeSigner + ?Sized; - /// A type that may be dereferenced to [`Self::NodeSigner`]. - type NS: Deref; + type NodeSigner: NodeSigner; /// A type implementing [`EcdsaChannelSigner`]. type Signer: EcdsaChannelSigner + Sized; /// A type implementing [`SignerProvider`] for [`Self::Signer`]. @@ -1812,7 +1810,7 @@ pub trait AChannelManager { Self::M, Self::Broadcaster, Self::EntropySource, - Self::NS, + Self::NodeSigner, Self::SP, Self::F, Self::R, @@ -1825,7 +1823,7 @@ impl< M: Deref, T: BroadcasterInterface, ES: EntropySource, - NS: Deref, + NS: NodeSigner, SP: Deref, F: Deref, R: Deref, @@ -1834,7 +1832,6 @@ impl< > AChannelManager for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, R::Target: Router, @@ -1845,8 +1842,7 @@ where type M = M; type Broadcaster = T; type EntropySource = ES; - type NodeSigner = NS::Target; - type NS = NS; + type NodeSigner = NS; type Signer = ::EcdsaSigner; type SignerProvider = SP::Target; type SP = SP; @@ -2646,7 +2642,7 @@ pub struct ChannelManager< M: Deref, T: BroadcasterInterface, ES: EntropySource, - NS: Deref, + NS: NodeSigner, SP: Deref, F: Deref, R: Deref, @@ -2654,7 +2650,6 @@ pub struct ChannelManager< L: Deref, > where M::Target: chain::Watch<::EcdsaSigner>, - NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, R::Target: Router, @@ -3720,7 +3715,7 @@ impl< M: Deref, T: BroadcasterInterface, ES: EntropySource, - NS: Deref, + NS: NodeSigner, SP: Deref, F: Deref, R: Deref, @@ -3729,7 +3724,6 @@ impl< > ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, R::Target: Router, @@ -7075,7 +7069,7 @@ where let (next_hop, next_packet_details_opt) = match decode_incoming_update_add_htlc_onion( &update_add_htlc, - &*self.node_signer, + &self.node_signer, &*self.logger, &self.secp_ctx, ) { @@ -7425,7 +7419,7 @@ where onion_packet.hmac, payment_hash, None, - &*self.node_signer, + &self.node_signer, ); let next_hop = match decode_res { Ok(res) => res, @@ -13193,7 +13187,7 @@ impl< M: Deref, T: BroadcasterInterface, ES: EntropySource, - NS: Deref, + NS: NodeSigner, SP: Deref, F: Deref, R: Deref, @@ -13202,7 +13196,6 @@ impl< > ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, R::Target: Router, @@ -14043,7 +14036,7 @@ impl< M: Deref, T: BroadcasterInterface, ES: EntropySource, - NS: Deref, + NS: NodeSigner, SP: Deref, F: Deref, R: Deref, @@ -14052,7 +14045,6 @@ impl< > BaseMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, R::Target: Router, @@ -14399,7 +14391,7 @@ impl< M: Deref, T: BroadcasterInterface, ES: EntropySource, - NS: Deref, + NS: NodeSigner, SP: Deref, F: Deref, R: Deref, @@ -14408,7 +14400,6 @@ impl< > EventsProvider for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, R::Target: Router, @@ -14432,7 +14423,7 @@ impl< M: Deref, T: BroadcasterInterface, ES: EntropySource, - NS: Deref, + NS: NodeSigner, SP: Deref, F: Deref, R: Deref, @@ -14441,7 +14432,6 @@ impl< > chain::Listen for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, R::Target: Router, @@ -14491,7 +14481,7 @@ impl< M: Deref, T: BroadcasterInterface, ES: EntropySource, - NS: Deref, + NS: NodeSigner, SP: Deref, F: Deref, R: Deref, @@ -14500,7 +14490,6 @@ impl< > chain::Confirm for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, R::Target: Router, @@ -14662,7 +14651,7 @@ impl< M: Deref, T: BroadcasterInterface, ES: EntropySource, - NS: Deref, + NS: NodeSigner, SP: Deref, F: Deref, R: Deref, @@ -14671,7 +14660,6 @@ impl< > ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, R::Target: Router, @@ -15022,7 +15010,7 @@ impl< M: Deref, T: BroadcasterInterface, ES: EntropySource, - NS: Deref, + NS: NodeSigner, SP: Deref, F: Deref, R: Deref, @@ -15031,7 +15019,6 @@ impl< > ChannelMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, R::Target: Router, @@ -15595,7 +15582,7 @@ impl< M: Deref, T: BroadcasterInterface, ES: EntropySource, - NS: Deref, + NS: NodeSigner, SP: Deref, F: Deref, R: Deref, @@ -15604,7 +15591,6 @@ impl< > OffersMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, R::Target: Router, @@ -15811,7 +15797,7 @@ impl< M: Deref, T: BroadcasterInterface, ES: EntropySource, - NS: Deref, + NS: NodeSigner, SP: Deref, F: Deref, R: Deref, @@ -15820,7 +15806,6 @@ impl< > AsyncPaymentsMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, R::Target: Router, @@ -16011,7 +15996,7 @@ impl< M: Deref, T: BroadcasterInterface, ES: EntropySource, - NS: Deref, + NS: NodeSigner, SP: Deref, F: Deref, R: Deref, @@ -16020,7 +16005,6 @@ impl< > DNSResolverMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, R::Target: Router, @@ -16077,7 +16061,7 @@ impl< M: Deref, T: BroadcasterInterface, ES: EntropySource, - NS: Deref, + NS: NodeSigner, SP: Deref, F: Deref, R: Deref, @@ -16086,7 +16070,6 @@ impl< > NodeIdLookUp for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, R::Target: Router, @@ -16591,7 +16574,7 @@ impl< M: Deref, T: BroadcasterInterface, ES: EntropySource, - NS: Deref, + NS: NodeSigner, SP: Deref, F: Deref, R: Deref, @@ -16600,7 +16583,6 @@ impl< > Writeable for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, - NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, R::Target: Router, @@ -16956,7 +16938,7 @@ pub struct ChannelManagerReadArgs< M: Deref, T: BroadcasterInterface, ES: EntropySource, - NS: Deref, + NS: NodeSigner, SP: Deref, F: Deref, R: Deref, @@ -16964,7 +16946,6 @@ pub struct ChannelManagerReadArgs< L: Deref + Clone, > where M::Target: chain::Watch<::EcdsaSigner>, - NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, R::Target: Router, @@ -17034,7 +17015,7 @@ impl< M: Deref, T: BroadcasterInterface, ES: EntropySource, - NS: Deref, + NS: NodeSigner, SP: Deref, F: Deref, R: Deref, @@ -17043,7 +17024,6 @@ impl< > ChannelManagerReadArgs<'a, M, T, ES, NS, SP, F, R, MR, L> where M::Target: chain::Watch<::EcdsaSigner>, - NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, R::Target: Router, @@ -17120,7 +17100,7 @@ impl< M: Deref, T: BroadcasterInterface, ES: EntropySource, - NS: Deref, + NS: NodeSigner, SP: Deref, F: Deref, R: Deref, @@ -17130,7 +17110,6 @@ impl< for (BlockHash, Arc>) where M::Target: chain::Watch<::EcdsaSigner>, - NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, R::Target: Router, @@ -17151,7 +17130,7 @@ impl< M: Deref, T: BroadcasterInterface, ES: EntropySource, - NS: Deref, + NS: NodeSigner, SP: Deref, F: Deref, R: Deref, @@ -17161,7 +17140,6 @@ impl< for (BlockHash, ChannelManager) where M::Target: chain::Watch<::EcdsaSigner>, - NS::Target: NodeSigner, SP::Target: SignerProvider, F::Target: FeeEstimator, R::Target: Router, diff --git a/lightning/src/ln/functional_test_utils.rs b/lightning/src/ln/functional_test_utils.rs index 76497a8805a..2bdb7e0a826 100644 --- a/lightning/src/ln/functional_test_utils.rs +++ b/lightning/src/ln/functional_test_utils.rs @@ -734,7 +734,7 @@ pub trait NodeHolder { ::M, ::Broadcaster, ::EntropySource, - ::NS, + ::NodeSigner, ::SP, ::F, ::R, @@ -751,7 +751,7 @@ impl NodeHolder for &H { ::M, ::Broadcaster, ::EntropySource, - ::NS, + ::NodeSigner, ::SP, ::F, ::R, diff --git a/lightning/src/ln/invoice_utils.rs b/lightning/src/ln/invoice_utils.rs index 8d5af244735..1136b36fcb6 100644 --- a/lightning/src/ln/invoice_utils.rs +++ b/lightning/src/ln/invoice_utils.rs @@ -67,14 +67,13 @@ use core::time::Duration; feature = "std", doc = "This can be used in a `no_std` environment, where [`std::time::SystemTime`] is not available and the current time is supplied by the caller." )] -pub fn create_phantom_invoice( +pub fn create_phantom_invoice( amt_msat: Option, payment_hash: Option, description: String, invoice_expiry_delta_secs: u32, phantom_route_hints: Vec, entropy_source: ES, node_signer: NS, logger: L, network: Currency, min_final_cltv_expiry_delta: Option, duration_since_epoch: Duration, ) -> Result> where - NS::Target: NodeSigner, L::Target: Logger, { let description = Description::new(description).map_err(SignOrCreationError::CreationError)?; @@ -134,14 +133,13 @@ where feature = "std", doc = "This version can be used in a `no_std` environment, where [`std::time::SystemTime`] is not available and the current time is supplied by the caller." )] -pub fn create_phantom_invoice_with_description_hash( +pub fn create_phantom_invoice_with_description_hash( amt_msat: Option, payment_hash: Option, invoice_expiry_delta_secs: u32, description_hash: Sha256, phantom_route_hints: Vec, entropy_source: ES, node_signer: NS, logger: L, network: Currency, min_final_cltv_expiry_delta: Option, duration_since_epoch: Duration, ) -> Result> where - NS::Target: NodeSigner, L::Target: Logger, { _create_phantom_invoice::( @@ -161,14 +159,13 @@ where const MAX_CHANNEL_HINTS: usize = 3; -fn _create_phantom_invoice( +fn _create_phantom_invoice( amt_msat: Option, payment_hash: Option, description: Bolt11InvoiceDescription, invoice_expiry_delta_secs: u32, phantom_route_hints: Vec, entropy_source: ES, node_signer: NS, logger: L, network: Currency, min_final_cltv_expiry_delta: Option, duration_since_epoch: Duration, ) -> Result> where - NS::Target: NodeSigner, L::Target: Logger, { if phantom_route_hints.is_empty() { diff --git a/lightning/src/ln/msgs.rs b/lightning/src/ln/msgs.rs index dd9c8ff7756..98939e69546 100644 --- a/lightning/src/ln/msgs.rs +++ b/lightning/src/ln/msgs.rs @@ -50,7 +50,6 @@ use crate::io_extras::read_to_end; use core::fmt; use core::fmt::Debug; use core::fmt::Display; -use core::ops::Deref; #[cfg(feature = "std")] use core::str::FromStr; #[cfg(feature = "std")] @@ -3631,10 +3630,7 @@ impl<'a> Writeable for OutboundTrampolinePayload<'a> { } } -impl ReadableArgs<(Option, NS)> for InboundOnionPayload -where - NS::Target: NodeSigner, -{ +impl ReadableArgs<(Option, NS)> for InboundOnionPayload { fn read(r: &mut R, args: (Option, NS)) -> Result { let (update_add_blinding_point, node_signer) = args; @@ -3799,10 +3795,7 @@ where } } -impl ReadableArgs<(Option, NS)> for InboundTrampolinePayload -where - NS::Target: NodeSigner, -{ +impl ReadableArgs<(Option, NS)> for InboundTrampolinePayload { fn read(r: &mut R, args: (Option, NS)) -> Result { let (update_add_blinding_point, node_signer) = args; let receive_auth_key = node_signer.get_receive_auth_key(); diff --git a/lightning/src/ln/onion_payment.rs b/lightning/src/ln/onion_payment.rs index 6c841f5e17e..04562ebed59 100644 --- a/lightning/src/ln/onion_payment.rs +++ b/lightning/src/ln/onion_payment.rs @@ -471,12 +471,11 @@ pub(super) fn create_recv_pending_htlc_info( /// /// [`Event::PaymentClaimable`]: crate::events::Event::PaymentClaimable #[rustfmt::skip] -pub fn peel_payment_onion( +pub fn peel_payment_onion( msg: &msgs::UpdateAddHTLC, node_signer: NS, logger: L, secp_ctx: &Secp256k1, cur_height: u32, allow_skimmed_fees: bool, ) -> Result where - NS::Target: NodeSigner, L::Target: Logger, { let (hop, next_packet_details_opt) = @@ -545,11 +544,10 @@ pub(super) struct NextPacketDetails { } #[rustfmt::skip] -pub(super) fn decode_incoming_update_add_htlc_onion( +pub(super) fn decode_incoming_update_add_htlc_onion( msg: &msgs::UpdateAddHTLC, node_signer: NS, logger: L, secp_ctx: &Secp256k1, ) -> Result<(onion_utils::Hop, Option), (HTLCFailureMsg, LocalHTLCFailureReason)> where - NS::Target: NodeSigner, L::Target: Logger, { let encode_malformed_error = |message: &str, failure_reason: LocalHTLCFailureReason| { diff --git a/lightning/src/ln/onion_utils.rs b/lightning/src/ln/onion_utils.rs index dbc2ebc9d48..5d17d1591b8 100644 --- a/lightning/src/ln/onion_utils.rs +++ b/lightning/src/ln/onion_utils.rs @@ -2308,13 +2308,10 @@ pub(crate) enum OnionDecodeErr { }, } -pub(crate) fn decode_next_payment_hop( +pub(crate) fn decode_next_payment_hop( recipient: Recipient, hop_pubkey: &PublicKey, hop_data: &[u8], hmac_bytes: [u8; 32], payment_hash: PaymentHash, blinding_point: Option, node_signer: NS, -) -> Result -where - NS::Target: NodeSigner, -{ +) -> Result { let blinded_node_id_tweak = blinding_point.map(|bp| { let blinded_tlvs_ss = node_signer.ecdh(recipient, &bp, None).unwrap().secret_bytes(); let mut hmac = HmacEngine::::new(b"blinded_node_id"); @@ -2329,7 +2326,7 @@ where hop_data, hmac_bytes, Some(payment_hash), - (blinding_point, &(*node_signer)), + (blinding_point, &node_signer), ); match decoded_hop { Ok((next_hop_data, Some((next_hop_hmac, FixedSizeOnionPacket(new_packet_bytes))))) => { @@ -2397,7 +2394,7 @@ where &hop_data.trampoline_packet.hop_data, hop_data.trampoline_packet.hmac, Some(payment_hash), - (blinding_point, node_signer), + (blinding_point, &node_signer), ); match decoded_trampoline_hop { Ok(( diff --git a/lightning/src/ln/outbound_payment.rs b/lightning/src/ln/outbound_payment.rs index 9483a593a3b..ed99da29f6f 100644 --- a/lightning/src/ln/outbound_payment.rs +++ b/lightning/src/ln/outbound_payment.rs @@ -872,7 +872,7 @@ where } #[rustfmt::skip] - pub(super) fn send_payment( + pub(super) fn send_payment( &self, payment_hash: PaymentHash, recipient_onion: RecipientOnionFields, payment_id: PaymentId, retry_strategy: Retry, route_params: RouteParameters, router: &R, first_hops: Vec, compute_inflight_htlcs: IH, entropy_source: &ES, @@ -881,7 +881,6 @@ where ) -> Result<(), RetryableSendFailure> where R::Target: Router, - NS::Target: NodeSigner, IH: Fn() -> InFlightHtlcs, SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, { @@ -891,7 +890,7 @@ where } #[rustfmt::skip] - pub(super) fn send_spontaneous_payment( + pub(super) fn send_spontaneous_payment( &self, payment_preimage: Option, recipient_onion: RecipientOnionFields, payment_id: PaymentId, retry_strategy: Retry, route_params: RouteParameters, router: &R, first_hops: Vec, inflight_htlcs: IH, entropy_source: &ES, @@ -900,7 +899,6 @@ where ) -> Result where R::Target: Router, - NS::Target: NodeSigner, IH: Fn() -> InFlightHtlcs, SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, { @@ -914,7 +912,7 @@ where } #[rustfmt::skip] - pub(super) fn pay_for_bolt11_invoice( + pub(super) fn pay_for_bolt11_invoice( &self, invoice: &Bolt11Invoice, payment_id: PaymentId, amount_msats: Option, route_params_config: RouteParametersConfig, @@ -926,7 +924,6 @@ where ) -> Result<(), Bolt11PaymentError> where R::Target: Router, - NS::Target: NodeSigner, IH: Fn() -> InFlightHtlcs, SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, { @@ -960,7 +957,7 @@ where #[rustfmt::skip] pub(super) fn send_payment_for_bolt12_invoice< - R: Deref, ES: EntropySource, NS: Deref, NL: Deref, IH, SP + R: Deref, ES: EntropySource, NS: NodeSigner, NL: Deref, IH, SP >( &self, invoice: &Bolt12Invoice, payment_id: PaymentId, router: &R, first_hops: Vec, features: Bolt12InvoiceFeatures, inflight_htlcs: IH, @@ -971,7 +968,6 @@ where ) -> Result<(), Bolt12PaymentError> where R::Target: Router, - NS::Target: NodeSigner, NL::Target: NodeIdLookUp, IH: Fn() -> InFlightHtlcs, SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, @@ -1004,7 +1000,7 @@ where #[rustfmt::skip] fn send_payment_for_bolt12_invoice_internal< - R: Deref, ES: EntropySource, NS: Deref, NL: Deref, IH, SP + R: Deref, ES: EntropySource, NS: NodeSigner, NL: Deref, IH, SP >( &self, payment_id: PaymentId, payment_hash: PaymentHash, keysend_preimage: Option, invoice_request: Option<&InvoiceRequest>, @@ -1017,7 +1013,6 @@ where ) -> Result<(), Bolt12PaymentError> where R::Target: Router, - NS::Target: NodeSigner, NL::Target: NodeIdLookUp, IH: Fn() -> InFlightHtlcs, SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, @@ -1219,7 +1214,7 @@ where pub(super) fn send_payment_for_static_invoice< R: Deref, ES: EntropySource, - NS: Deref, + NS: NodeSigner, NL: Deref, IH, SP, @@ -1232,7 +1227,6 @@ where ) -> Result<(), Bolt12PaymentError> where R::Target: Router, - NS::Target: NodeSigner, NL::Target: NodeIdLookUp, IH: Fn() -> InFlightHtlcs, SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, @@ -1298,7 +1292,7 @@ where } // Returns whether the data changed and needs to be repersisted. - pub(super) fn check_retry_payments( + pub(super) fn check_retry_payments( &self, router: &R, first_hops: FH, inflight_htlcs: IH, entropy_source: &ES, node_signer: &NS, best_block_height: u32, pending_events: &Mutex)>>, @@ -1306,7 +1300,6 @@ where ) -> bool where R::Target: Router, - NS::Target: NodeSigner, SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, IH: Fn() -> InFlightHtlcs, FH: Fn() -> Vec, @@ -1404,7 +1397,7 @@ where } #[rustfmt::skip] - fn find_initial_route( + fn find_initial_route( &self, payment_id: PaymentId, payment_hash: PaymentHash, recipient_onion: &RecipientOnionFields, keysend_preimage: Option, invoice_request: Option<&InvoiceRequest>, route_params: &mut RouteParameters, router: &R, first_hops: &Vec, @@ -1412,7 +1405,6 @@ where ) -> Result where R::Target: Router, - NS::Target: NodeSigner, L::Target: Logger, IH: Fn() -> InFlightHtlcs, { @@ -1459,7 +1451,7 @@ where /// [`Event::PaymentPathFailed`]: crate::events::Event::PaymentPathFailed /// [`Event::PaymentFailed`]: crate::events::Event::PaymentFailed #[rustfmt::skip] - fn send_payment_for_non_bolt12_invoice( + fn send_payment_for_non_bolt12_invoice( &self, payment_id: PaymentId, payment_hash: PaymentHash, recipient_onion: RecipientOnionFields, keysend_preimage: Option, retry_strategy: Retry, mut route_params: RouteParameters, router: &R, first_hops: Vec, inflight_htlcs: IH, entropy_source: &ES, @@ -1468,7 +1460,6 @@ where ) -> Result<(), RetryableSendFailure> where R::Target: Router, - NS::Target: NodeSigner, L::Target: Logger, IH: Fn() -> InFlightHtlcs, SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, @@ -1503,7 +1494,7 @@ where } #[rustfmt::skip] - fn find_route_and_send_payment( + fn find_route_and_send_payment( &self, payment_hash: PaymentHash, payment_id: PaymentId, route_params: RouteParameters, router: &R, first_hops: Vec, inflight_htlcs: &IH, entropy_source: &ES, node_signer: &NS, best_block_height: u32, @@ -1511,7 +1502,6 @@ where ) where R::Target: Router, - NS::Target: NodeSigner, L::Target: Logger, IH: Fn() -> InFlightHtlcs, SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, @@ -1663,7 +1653,7 @@ where } #[rustfmt::skip] - fn handle_pay_route_err( + fn handle_pay_route_err( &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, inflight_htlcs: &IH, entropy_source: &ES, node_signer: &NS, @@ -1673,7 +1663,6 @@ where ) where R::Target: Router, - NS::Target: NodeSigner, IH: Fn() -> InFlightHtlcs, SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, { @@ -1779,12 +1768,11 @@ where } #[rustfmt::skip] - pub(super) fn send_probe( + pub(super) fn send_probe( &self, path: Path, probing_cookie_secret: [u8; 32], entropy_source: &ES, node_signer: &NS, best_block_height: u32, send_payment_along_path: F ) -> Result<(PaymentHash, PaymentId), ProbeSendFailure> where - NS::Target: NodeSigner, F: Fn(SendAlongPathArgs) -> Result<(), APIError>, { let payment_id = PaymentId(entropy_source.get_secure_random_bytes()); @@ -2051,14 +2039,13 @@ where } #[rustfmt::skip] - fn pay_route_internal( + fn pay_route_internal( &self, route: &Route, payment_hash: PaymentHash, recipient_onion: &RecipientOnionFields, keysend_preimage: Option, invoice_request: Option<&InvoiceRequest>, bolt12_invoice: Option<&PaidBolt12Invoice>, payment_id: PaymentId, recv_value_msat: Option, onion_session_privs: &Vec<[u8; 32]>, hold_htlcs_at_next_hop: bool, node_signer: &NS, best_block_height: u32, send_payment_along_path: &F ) -> Result<(), PaymentSendFailure> where - NS::Target: NodeSigner, F: Fn(SendAlongPathArgs) -> Result<(), APIError>, { if route.paths.len() < 1 { @@ -2166,14 +2153,13 @@ where #[cfg(any(test, feature = "_externalize_tests"))] #[rustfmt::skip] - pub(super) fn test_send_payment_internal( + pub(super) fn test_send_payment_internal( &self, route: &Route, payment_hash: PaymentHash, recipient_onion: RecipientOnionFields, keysend_preimage: Option, payment_id: PaymentId, recv_value_msat: Option, onion_session_privs: Vec<[u8; 32]>, node_signer: &NS, best_block_height: u32, send_payment_along_path: F ) -> Result<(), PaymentSendFailure> where - NS::Target: NodeSigner, F: Fn(SendAlongPathArgs) -> Result<(), APIError>, { self.pay_route_internal(route, payment_hash, &recipient_onion, diff --git a/lightning/src/ln/peer_channel_encryptor.rs b/lightning/src/ln/peer_channel_encryptor.rs index 894de045b14..5554c5a8c19 100644 --- a/lightning/src/ln/peer_channel_encryptor.rs +++ b/lightning/src/ln/peer_channel_encryptor.rs @@ -30,8 +30,6 @@ use crate::crypto::chacha20poly1305rfc::ChaCha20Poly1305RFC; use crate::crypto::utils::hkdf_extract_expand_twice; use crate::util::ser::VecWriter; -use core::ops::Deref; - /// Maximum Lightning message data length according to /// [BOLT-8](https://github.com/lightning/bolts/blob/v1.0/08-transport.md#lightning-message-specification) /// and [BOLT-1](https://github.com/lightning/bolts/blob/master/01-messaging.md#lightning-message-format): @@ -52,10 +50,7 @@ const NOISE_H: [u8; 32] = [ 0x4b, 0xb4, 0x20, 0xd8, 0x9d, 0x2a, 0x04, 0x8a, 0x3c, 0x4f, 0x4c, 0x09, 0x2e, 0x37, 0xb6, 0x76, ]; -enum NoiseSecretKey<'a, 'b, NS: Deref> -where - NS::Target: NodeSigner, -{ +enum NoiseSecretKey<'a, 'b, NS: NodeSigner> { InMemory(&'a SecretKey), NodeSigner(&'b NS), } @@ -130,10 +125,7 @@ impl PeerChannelEncryptor { } } - pub fn new_inbound(node_signer: &NS) -> PeerChannelEncryptor - where - NS::Target: NodeSigner, - { + pub fn new_inbound(node_signer: &NS) -> PeerChannelEncryptor { let mut sha = Sha256::engine(); sha.input(&NOISE_H); let our_node_id = node_signer.get_node_id(Recipient::Node).unwrap(); @@ -248,12 +240,9 @@ impl PeerChannelEncryptor { } #[inline] - fn inbound_noise_act<'a, 'b, NS: Deref>( + fn inbound_noise_act<'a, 'b, NS: NodeSigner>( state: &mut BidirectionalNoiseState, act: &[u8], secret_key: NoiseSecretKey<'a, 'b, NS>, - ) -> Result<(PublicKey, [u8; 32]), LightningError> - where - NS::Target: NodeSigner, - { + ) -> Result<(PublicKey, [u8; 32]), LightningError> { assert_eq!(act.len(), 50); if act[0] != 0 { @@ -327,13 +316,10 @@ impl PeerChannelEncryptor { } } - pub fn process_act_one_with_keys( + pub fn process_act_one_with_keys( &mut self, act_one: &[u8], node_signer: &NS, our_ephemeral: SecretKey, secp_ctx: &Secp256k1, - ) -> Result<[u8; 50], LightningError> - where - NS::Target: NodeSigner, - { + ) -> Result<[u8; 50], LightningError> { assert_eq!(act_one.len(), 50); match self.noise_state { @@ -372,12 +358,9 @@ impl PeerChannelEncryptor { } } - pub fn process_act_two( + pub fn process_act_two( &mut self, act_two: &[u8], node_signer: &NS, - ) -> Result<([u8; 66], PublicKey), LightningError> - where - NS::Target: NodeSigner, - { + ) -> Result<([u8; 66], PublicKey), LightningError> { assert_eq!(act_two.len(), 50); let final_hkdf; diff --git a/lightning/src/ln/peer_handler.rs b/lightning/src/ln/peer_handler.rs index 4d1dff9cd52..c2bb0af3103 100644 --- a/lightning/src/ln/peer_handler.rs +++ b/lightning/src/ln/peer_handler.rs @@ -981,8 +981,7 @@ pub trait APeerManager { type L: Deref; type CMHT: CustomMessageHandler + ?Sized; type CMH: Deref; - type NST: NodeSigner + ?Sized; - type NS: Deref; + type NodeSigner: NodeSigner; type SMT: SendOnlyMessageHandler + ?Sized; type SM: Deref; /// Gets a reference to the underlying [`PeerManager`]. @@ -995,7 +994,7 @@ pub trait APeerManager { Self::OM, Self::L, Self::CMH, - Self::NS, + Self::NodeSigner, Self::SM, >; } @@ -1007,7 +1006,7 @@ impl< OM: Deref, L: Deref, CMH: Deref, - NS: Deref, + NS: NodeSigner, SM: Deref, > APeerManager for PeerManager where @@ -1016,7 +1015,6 @@ where OM::Target: OnionMessageHandler, L::Target: Logger, CMH::Target: CustomMessageHandler, - NS::Target: NodeSigner, SM::Target: SendOnlyMessageHandler, { type Descriptor = Descriptor; @@ -1030,8 +1028,7 @@ where type L = L; type CMHT = ::Target; type CMH = CMH; - type NST = ::Target; - type NS = NS; + type NodeSigner = NS; type SMT = ::Target; type SM = SM; fn as_ref(&self) -> &PeerManager { @@ -1065,7 +1062,7 @@ pub struct PeerManager< OM: Deref, L: Deref, CMH: Deref, - NS: Deref, + NS: NodeSigner, SM: Deref, > where CM::Target: ChannelMessageHandler, @@ -1073,7 +1070,6 @@ pub struct PeerManager< OM::Target: OnionMessageHandler, L::Target: Logger, CMH::Target: CustomMessageHandler, - NS::Target: NodeSigner, SM::Target: SendOnlyMessageHandler, { message_handler: MessageHandler, @@ -1151,13 +1147,12 @@ fn encode_message(message: wire::Message) -> Vec { buffer.0 } -impl +impl PeerManager where CM::Target: ChannelMessageHandler, OM::Target: OnionMessageHandler, L::Target: Logger, - NS::Target: NodeSigner, SM::Target: SendOnlyMessageHandler, { /// Constructs a new `PeerManager` with the given `ChannelMessageHandler` and @@ -1194,7 +1189,7 @@ where } } -impl +impl PeerManager< Descriptor, ErroringMessageHandler, @@ -1207,7 +1202,6 @@ impl > where RM::Target: RoutingMessageHandler, L::Target: Logger, - NS::Target: NodeSigner, { /// Constructs a new `PeerManager` with the given `RoutingMessageHandler`. No channel message /// handler or onion message handler is used and onion and channel messages will be ignored (or @@ -1298,7 +1292,7 @@ impl< OM: Deref, L: Deref, CMH: Deref, - NS: Deref, + NS: NodeSigner, SM: Deref, > PeerManager where @@ -1307,7 +1301,6 @@ where OM::Target: OnionMessageHandler, L::Target: Logger, CMH::Target: CustomMessageHandler, - NS::Target: NodeSigner, SM::Target: SendOnlyMessageHandler, { /// Constructs a new `PeerManager` with the given message handlers. diff --git a/lightning/src/onion_message/messenger.rs b/lightning/src/onion_message/messenger.rs index d859d35dc09..5f4b703618b 100644 --- a/lightning/src/onion_message/messenger.rs +++ b/lightning/src/onion_message/messenger.rs @@ -68,9 +68,7 @@ pub trait AOnionMessenger { /// A type implementing [`EntropySource`] type EntropySource: EntropySource; /// A type implementing [`NodeSigner`] - type NodeSigner: NodeSigner + ?Sized; - /// A type that may be dereferenced to [`Self::NodeSigner`] - type NS: Deref; + type NodeSigner: NodeSigner; /// A type implementing [`Logger`] type Logger: Logger + ?Sized; /// A type that may be dereferenced to [`Self::Logger`] @@ -104,7 +102,7 @@ pub trait AOnionMessenger { &self, ) -> &OnionMessenger< Self::EntropySource, - Self::NS, + Self::NodeSigner, Self::L, Self::NL, Self::MR, @@ -117,7 +115,7 @@ pub trait AOnionMessenger { impl< ES: EntropySource, - NS: Deref, + NS: NodeSigner, L: Deref, NL: Deref, MR: Deref, @@ -127,7 +125,6 @@ impl< CMH: Deref, > AOnionMessenger for OnionMessenger where - NS::Target: NodeSigner, L::Target: Logger, NL::Target: NodeIdLookUp, MR::Target: MessageRouter, @@ -137,8 +134,7 @@ where CMH::Target: CustomOnionMessageHandler, { type EntropySource = ES; - type NodeSigner = NS::Target; - type NS = NS; + type NodeSigner = NS; type Logger = L::Target; type L = L; type NodeIdLookUp = NL::Target; @@ -281,7 +277,7 @@ where /// [`Bolt12Invoice`]: crate::offers::invoice::Bolt12Invoice pub struct OnionMessenger< ES: EntropySource, - NS: Deref, + NS: NodeSigner, L: Deref, NL: Deref, MR: Deref, @@ -290,7 +286,6 @@ pub struct OnionMessenger< DRH: Deref, CMH: Deref, > where - NS::Target: NodeSigner, L::Target: Logger, NL::Target: NodeIdLookUp, MR::Target: MessageRouter, @@ -1042,7 +1037,7 @@ pub enum PeeledOnion { /// needed to connect to the first node. pub fn create_onion_message_resolving_destination< ES: EntropySource, - NS: Deref, + NS: NodeSigner, NL: Deref, T: OnionMessageContents, >( @@ -1051,7 +1046,6 @@ pub fn create_onion_message_resolving_destination< mut path: OnionMessagePath, contents: T, reply_path: Option, ) -> Result<(PublicKey, OnionMessage, Vec), SendError> where - NS::Target: NodeSigner, NL::Target: NodeIdLookUp, { path.destination.resolve(network_graph); @@ -1077,13 +1071,12 @@ where /// - unless it can be resolved by [`NodeIdLookUp::next_node_id`]. /// Use [`create_onion_message_resolving_destination`] instead to resolve the introduction node /// first with a [`ReadOnlyNetworkGraph`]. -pub fn create_onion_message( +pub fn create_onion_message( entropy_source: &ES, node_signer: &NS, node_id_lookup: &NL, secp_ctx: &Secp256k1, path: OnionMessagePath, contents: T, reply_path: Option, ) -> Result<(PublicKey, OnionMessage, Vec), SendError> where - NS::Target: NodeSigner, NL::Target: NodeIdLookUp, { let OnionMessagePath { intermediate_nodes, mut destination, first_node_addresses } = path; @@ -1158,12 +1151,11 @@ where /// /// Returns either the next layer of the onion for forwarding or the decrypted content for the /// receiver. -pub fn peel_onion_message( +pub fn peel_onion_message( msg: &OnionMessage, secp_ctx: &Secp256k1, node_signer: NS, logger: L, custom_handler: CMH, ) -> Result::Target as CustomOnionMessageHandler>::CustomMessage>, ()> where - NS::Target: NodeSigner, L::Target: Logger, CMH::Target: CustomOnionMessageHandler, { @@ -1382,7 +1374,7 @@ macro_rules! drop_handled_events_and_abort { impl< ES: EntropySource, - NS: Deref, + NS: NodeSigner, L: Deref, NL: Deref, MR: Deref, @@ -1392,7 +1384,6 @@ impl< CMH: Deref, > OnionMessenger where - NS::Target: NodeSigner, L::Target: Logger, NL::Target: NodeIdLookUp, MR::Target: MessageRouter, @@ -1794,7 +1785,7 @@ where peel_onion_message( msg, &self.secp_ctx, - &*self.node_signer, + &self.node_signer, &*self.logger, &*self.custom_handler, ) @@ -2025,7 +2016,7 @@ fn outbound_buffer_full( impl< ES: EntropySource, - NS: Deref, + NS: NodeSigner, L: Deref, NL: Deref, MR: Deref, @@ -2035,7 +2026,6 @@ impl< CMH: Deref, > EventsProvider for OnionMessenger where - NS::Target: NodeSigner, L::Target: Logger, NL::Target: NodeIdLookUp, MR::Target: MessageRouter, @@ -2145,7 +2135,7 @@ where impl< ES: EntropySource, - NS: Deref, + NS: NodeSigner, L: Deref, NL: Deref, MR: Deref, @@ -2155,7 +2145,6 @@ impl< CMH: Deref, > BaseMessageHandler for OnionMessenger where - NS::Target: NodeSigner, L::Target: Logger, NL::Target: NodeIdLookUp, MR::Target: MessageRouter, @@ -2216,7 +2205,7 @@ where impl< ES: EntropySource, - NS: Deref, + NS: NodeSigner, L: Deref, NL: Deref, MR: Deref, @@ -2226,7 +2215,6 @@ impl< CMH: Deref, > OnionMessageHandler for OnionMessenger where - NS::Target: NodeSigner, L::Target: Logger, NL::Target: NodeIdLookUp, MR::Target: MessageRouter, diff --git a/lightning/src/sign/mod.rs b/lightning/src/sign/mod.rs index 51b00a68037..539432df043 100644 --- a/lightning/src/sign/mod.rs +++ b/lightning/src/sign/mod.rs @@ -998,6 +998,42 @@ pub trait NodeSigner { fn sign_message(&self, msg: &[u8]) -> Result; } +impl> NodeSigner for N { + fn get_expanded_key(&self) -> ExpandedKey { + self.deref().get_expanded_key() + } + fn get_peer_storage_key(&self) -> PeerStorageKey { + self.deref().get_peer_storage_key() + } + fn get_receive_auth_key(&self) -> ReceiveAuthKey { + self.deref().get_receive_auth_key() + } + fn get_node_id(&self, recipient: Recipient) -> Result { + self.deref().get_node_id(recipient) + } + fn ecdh( + &self, recipient: Recipient, other_key: &PublicKey, tweak: Option<&Scalar>, + ) -> Result { + self.deref().ecdh(recipient, other_key, tweak) + } + fn sign_invoice( + &self, invoice: &RawBolt11Invoice, recipient: Recipient, + ) -> Result { + self.deref().sign_invoice(invoice, recipient) + } + fn sign_bolt12_invoice( + &self, invoice: &UnsignedBolt12Invoice, + ) -> Result { + self.deref().sign_bolt12_invoice(invoice) + } + fn sign_gossip_message(&self, msg: UnsignedGossipMessage) -> Result { + self.deref().sign_gossip_message(msg) + } + fn sign_message(&self, msg: &[u8]) -> Result { + self.deref().sign_message(msg) + } +} + /// A trait that describes a wallet capable of creating a spending [`Transaction`] from a set of /// [`SpendableOutputDescriptor`]s. pub trait OutputSpender { From 12c3d35f895c586d8da1d2b405033d21696c8509 Mon Sep 17 00:00:00 2001 From: Valentine Wallace Date: Wed, 14 Jan 2026 18:22:30 -0500 Subject: [PATCH 05/17] Drop Deref indirection for FeeEstimator Reduces generics and verbosity across the codebase, should provide equivalent behavior. Co-Authored-By: Claude Opus 4.5 --- lightning-background-processor/src/lib.rs | 9 +- lightning/src/chain/chaininterface.rs | 19 +- lightning/src/chain/chainmonitor.rs | 52 ++--- lightning/src/chain/channelmonitor.rs | 93 ++++----- lightning/src/chain/onchaintx.rs | 38 ++-- lightning/src/chain/package.rs | 24 +-- lightning/src/ln/chan_utils.rs | 7 +- lightning/src/ln/channel.rs | 180 ++++++------------ lightning/src/ln/channel_state.rs | 3 +- lightning/src/ln/channelmanager.rs | 66 +++---- lightning/src/ln/functional_test_utils.rs | 4 +- lightning/src/util/anchor_channel_reserves.rs | 15 +- lightning/src/util/persist.rs | 36 ++-- lightning/src/util/sweep.rs | 103 +++++++--- 14 files changed, 269 insertions(+), 380 deletions(-) diff --git a/lightning-background-processor/src/lib.rs b/lightning-background-processor/src/lib.rs index 6731dae4b2e..941de6b3cee 100644 --- a/lightning-background-processor/src/lib.rs +++ b/lightning-background-processor/src/lib.rs @@ -949,7 +949,7 @@ pub async fn process_events_async< UL: Deref, CF: Deref, T: BroadcasterInterface, - F: Deref, + F: FeeEstimator, G: Deref>, L: Deref, P: Deref, @@ -981,7 +981,6 @@ pub async fn process_events_async< where UL::Target: UtxoLookup, CF::Target: chain::Filter, - F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist<::Signer>, CM::Target: AChannelManager, @@ -1448,7 +1447,7 @@ pub async fn process_events_async_with_kv_store_sync< UL: Deref, CF: Deref, T: BroadcasterInterface, - F: Deref, + F: FeeEstimator, G: Deref>, L: Deref, P: Deref, @@ -1480,7 +1479,6 @@ pub async fn process_events_async_with_kv_store_sync< where UL::Target: UtxoLookup, CF::Target: chain::Filter, - F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist<::Signer>, CM::Target: AChannelManager, @@ -1560,7 +1558,7 @@ impl BackgroundProcessor { UL: 'static + Deref, CF: 'static + Deref, T: 'static + BroadcasterInterface, - F: 'static + Deref + Send, + F: 'static + FeeEstimator + Send, G: 'static + Deref>, L: 'static + Deref + Send, P: 'static + Deref, @@ -1592,7 +1590,6 @@ impl BackgroundProcessor { where UL::Target: 'static + UtxoLookup, CF::Target: 'static + chain::Filter, - F::Target: 'static + FeeEstimator, L::Target: 'static + Logger, P::Target: 'static + Persist<::Signer>, CM::Target: AChannelManager, diff --git a/lightning/src/chain/chaininterface.rs b/lightning/src/chain/chaininterface.rs index d21017c25bb..7e71d960e67 100644 --- a/lightning/src/chain/chaininterface.rs +++ b/lightning/src/chain/chaininterface.rs @@ -187,6 +187,12 @@ pub trait FeeEstimator { fn get_est_sat_per_1000_weight(&self, confirmation_target: ConfirmationTarget) -> u32; } +impl> FeeEstimator for F { + fn get_est_sat_per_1000_weight(&self, confirmation_target: ConfirmationTarget) -> u32 { + self.deref().get_est_sat_per_1000_weight(confirmation_target) + } +} + /// Minimum relay fee as required by bitcoin network mempool policy. pub const INCREMENTAL_RELAY_FEE_SAT_PER_1000_WEIGHT: u64 = 253; /// Minimum feerate that takes a sane approach to bitcoind weight-to-vbytes rounding. @@ -194,19 +200,14 @@ pub const INCREMENTAL_RELAY_FEE_SAT_PER_1000_WEIGHT: u64 = 253; /// pub const FEERATE_FLOOR_SATS_PER_KW: u32 = 253; -/// Wraps a `Deref` to a `FeeEstimator` so that any fee estimations provided by it -/// are bounded below by `FEERATE_FLOOR_SATS_PER_KW` (253 sats/KW). +/// Wraps a [`FeeEstimator`] so that any fee estimations provided by it are bounded below by +/// `FEERATE_FLOOR_SATS_PER_KW` (253 sats/KW). /// /// Note that this does *not* implement [`FeeEstimator`] to make it harder to accidentally mix the /// two. -pub(crate) struct LowerBoundedFeeEstimator(pub F) -where - F::Target: FeeEstimator; +pub(crate) struct LowerBoundedFeeEstimator(pub F); -impl LowerBoundedFeeEstimator -where - F::Target: FeeEstimator, -{ +impl LowerBoundedFeeEstimator { /// Creates a new `LowerBoundedFeeEstimator` which wraps the provided fee_estimator pub fn new(fee_estimator: F) -> Self { LowerBoundedFeeEstimator(fee_estimator) diff --git a/lightning/src/chain/chainmonitor.rs b/lightning/src/chain/chainmonitor.rs index e4a9ca99290..30f1d56ab71 100644 --- a/lightning/src/chain/chainmonitor.rs +++ b/lightning/src/chain/chainmonitor.rs @@ -262,12 +262,11 @@ pub struct AsyncPersister< ES: EntropySource + MaybeSend + MaybeSync + 'static, SP: Deref + MaybeSend + MaybeSync + 'static, BI: BroadcasterInterface + MaybeSend + MaybeSync + 'static, - FE: Deref + MaybeSend + MaybeSync + 'static, + FE: FeeEstimator + MaybeSend + MaybeSync + 'static, > where K::Target: KVStore + MaybeSync, L::Target: Logger, SP::Target: SignerProvider + Sized, - FE::Target: FeeEstimator, { persister: MonitorUpdatingPersisterAsync, event_notifier: Arc, @@ -280,13 +279,12 @@ impl< ES: EntropySource + MaybeSend + MaybeSync + 'static, SP: Deref + MaybeSend + MaybeSync + 'static, BI: BroadcasterInterface + MaybeSend + MaybeSync + 'static, - FE: Deref + MaybeSend + MaybeSync + 'static, + FE: FeeEstimator + MaybeSend + MaybeSync + 'static, > Deref for AsyncPersister where K::Target: KVStore + MaybeSync, L::Target: Logger, SP::Target: SignerProvider + Sized, - FE::Target: FeeEstimator, { type Target = Self; fn deref(&self) -> &Self { @@ -301,13 +299,12 @@ impl< ES: EntropySource + MaybeSend + MaybeSync + 'static, SP: Deref + MaybeSend + MaybeSync + 'static, BI: BroadcasterInterface + MaybeSend + MaybeSync + 'static, - FE: Deref + MaybeSend + MaybeSync + 'static, + FE: FeeEstimator + MaybeSend + MaybeSync + 'static, > Persist<::EcdsaSigner> for AsyncPersister where K::Target: KVStore + MaybeSync, L::Target: Logger, SP::Target: SignerProvider + Sized, - FE::Target: FeeEstimator, ::EcdsaSigner: MaybeSend + 'static, { fn persist_new_channel( @@ -357,13 +354,12 @@ pub struct ChainMonitor< ChannelSigner: EcdsaChannelSigner, C: Deref, T: BroadcasterInterface, - F: Deref, + F: FeeEstimator, L: Deref, P: Deref, ES: EntropySource, > where C::Target: chain::Filter, - F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist, { @@ -397,7 +393,7 @@ impl< SP: Deref + MaybeSend + MaybeSync + 'static, C: Deref, T: BroadcasterInterface + MaybeSend + MaybeSync + 'static, - F: Deref + MaybeSend + MaybeSync + 'static, + F: FeeEstimator + MaybeSend + MaybeSync + 'static, L: Deref + MaybeSend + MaybeSync + 'static, ES: EntropySource + MaybeSend + MaybeSync + 'static, > @@ -413,7 +409,6 @@ impl< K::Target: KVStore + MaybeSync, SP::Target: SignerProvider + Sized, C::Target: chain::Filter, - F::Target: FeeEstimator, L::Target: Logger, ::EcdsaSigner: MaybeSend + 'static, { @@ -453,14 +448,13 @@ impl< ChannelSigner: EcdsaChannelSigner, C: Deref, T: BroadcasterInterface, - F: Deref, + F: FeeEstimator, L: Deref, P: Deref, ES: EntropySource, > ChainMonitor where C::Target: chain::Filter, - F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist, { @@ -884,7 +878,7 @@ where for (_, monitor_holder) in &*monitors { monitor_holder.monitor.rebroadcast_pending_claims( &self.broadcaster, - &*self.fee_estimator, + &self.fee_estimator, &self.logger, ) } @@ -900,7 +894,7 @@ where if let Some(monitor_holder) = monitors.get(&channel_id) { monitor_holder.monitor.signer_unblocked( &self.broadcaster, - &*self.fee_estimator, + &self.fee_estimator, &self.logger, ) } @@ -908,7 +902,7 @@ where for (_, monitor_holder) in &*monitors { monitor_holder.monitor.signer_unblocked( &self.broadcaster, - &*self.fee_estimator, + &self.fee_estimator, &self.logger, ) } @@ -1098,14 +1092,13 @@ impl< ChannelSigner: EcdsaChannelSigner, C: Deref, T: BroadcasterInterface, - F: Deref, + F: FeeEstimator, L: Deref, P: Deref, ES: EntropySource, > BaseMessageHandler for ChainMonitor where C::Target: chain::Filter, - F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist, { @@ -1135,14 +1128,13 @@ impl< ChannelSigner: EcdsaChannelSigner, C: Deref, T: BroadcasterInterface, - F: Deref, + F: FeeEstimator, L: Deref, P: Deref, ES: EntropySource, > SendOnlyMessageHandler for ChainMonitor where C::Target: chain::Filter, - F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist, { @@ -1152,14 +1144,13 @@ impl< ChannelSigner: EcdsaChannelSigner, C: Deref, T: BroadcasterInterface, - F: Deref, + F: FeeEstimator, L: Deref, P: Deref, ES: EntropySource, > chain::Listen for ChainMonitor where C::Target: chain::Filter, - F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist, { @@ -1176,7 +1167,7 @@ where txdata, height, &self.broadcaster, - &*self.fee_estimator, + &self.fee_estimator, &self.logger, ) }); @@ -1203,7 +1194,7 @@ where monitor_state.monitor.blocks_disconnected( fork_point, &self.broadcaster, - &*self.fee_estimator, + &self.fee_estimator, &self.logger, ); } @@ -1214,14 +1205,13 @@ impl< ChannelSigner: EcdsaChannelSigner, C: Deref, T: BroadcasterInterface, - F: Deref, + F: FeeEstimator, L: Deref, P: Deref, ES: EntropySource, > chain::Confirm for ChainMonitor where C::Target: chain::Filter, - F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist, { @@ -1239,7 +1229,7 @@ where txdata, height, &self.broadcaster, - &*self.fee_estimator, + &self.fee_estimator, &self.logger, ) }); @@ -1254,7 +1244,7 @@ where monitor_state.monitor.transaction_unconfirmed( txid, &self.broadcaster, - &*self.fee_estimator, + &self.fee_estimator, &self.logger, ); } @@ -1275,7 +1265,7 @@ where header, height, &self.broadcaster, - &*self.fee_estimator, + &self.fee_estimator, &self.logger, ) }); @@ -1307,14 +1297,13 @@ impl< ChannelSigner: EcdsaChannelSigner, C: Deref, T: BroadcasterInterface, - F: Deref, + F: FeeEstimator, L: Deref, P: Deref, ES: EntropySource, > chain::Watch for ChainMonitor where C::Target: chain::Filter, - F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist, { @@ -1501,14 +1490,13 @@ impl< ChannelSigner: EcdsaChannelSigner, C: Deref, T: BroadcasterInterface, - F: Deref, + F: FeeEstimator, L: Deref, P: Deref, ES: EntropySource, > events::EventsProvider for ChainMonitor where C::Target: chain::Filter, - F::Target: FeeEstimator, L::Target: Logger, P::Target: Persist, { diff --git a/lightning/src/chain/channelmonitor.rs b/lightning/src/chain/channelmonitor.rs index e91bb16e531..64208048422 100644 --- a/lightning/src/chain/channelmonitor.rs +++ b/lightning/src/chain/channelmonitor.rs @@ -2076,7 +2076,7 @@ impl ChannelMonitor { /// /// [`ChannelManager`]: crate::ln::channelmanager::ChannelManager #[rustfmt::skip] - pub(crate) fn provide_payment_preimage_unsafe_legacy( + pub(crate) fn provide_payment_preimage_unsafe_legacy( &self, payment_hash: &PaymentHash, payment_preimage: &PaymentPreimage, @@ -2084,7 +2084,6 @@ impl ChannelMonitor { fee_estimator: &LowerBoundedFeeEstimator, logger: &L, ) where - F::Target: FeeEstimator, L::Target: Logger, { let mut inner = self.inner.lock().unwrap(); @@ -2100,11 +2099,10 @@ impl ChannelMonitor { /// itself. /// /// panics if the given update is not the next update by update_id. - pub fn update_monitor( + pub fn update_monitor( &self, updates: &ChannelMonitorUpdate, broadcaster: &B, fee_estimator: &F, logger: &L, ) -> Result<(), ()> where - F::Target: FeeEstimator, L::Target: Logger, { let mut inner = self.inner.lock().unwrap(); @@ -2354,14 +2352,17 @@ impl ChannelMonitor { /// transactions that cannot be confirmed until the funding transaction is visible. /// /// [`Event::BumpTransaction`]: crate::events::Event::BumpTransaction - pub fn broadcast_latest_holder_commitment_txn( + pub fn broadcast_latest_holder_commitment_txn< + B: BroadcasterInterface, + F: FeeEstimator, + L: Deref, + >( &self, broadcaster: &B, fee_estimator: &F, logger: &L, ) where - F::Target: FeeEstimator, L::Target: Logger, { let mut inner = self.inner.lock().unwrap(); - let fee_estimator = LowerBoundedFeeEstimator::new(&**fee_estimator); + let fee_estimator = LowerBoundedFeeEstimator::new(fee_estimator); let logger = WithChannelMonitor::from_impl(logger, &*inner, None); inner.queue_latest_holder_commitment_txn_for_broadcast( @@ -2397,7 +2398,7 @@ impl ChannelMonitor { /// /// [`get_outputs_to_watch`]: #method.get_outputs_to_watch #[rustfmt::skip] - pub fn block_connected( + pub fn block_connected( &self, header: &Header, txdata: &TransactionData, @@ -2407,7 +2408,6 @@ impl ChannelMonitor { logger: &L, ) -> Vec where - F::Target: FeeEstimator, L::Target: Logger, { let mut inner = self.inner.lock().unwrap(); @@ -2418,10 +2418,9 @@ impl ChannelMonitor { /// Determines if the disconnected block contained any transactions of interest and updates /// appropriately. - pub fn blocks_disconnected( + pub fn blocks_disconnected( &self, fork_point: BestBlock, broadcaster: B, fee_estimator: F, logger: &L, ) where - F::Target: FeeEstimator, L::Target: Logger, { let mut inner = self.inner.lock().unwrap(); @@ -2437,7 +2436,7 @@ impl ChannelMonitor { /// /// [`block_connected`]: Self::block_connected #[rustfmt::skip] - pub fn transactions_confirmed( + pub fn transactions_confirmed( &self, header: &Header, txdata: &TransactionData, @@ -2447,7 +2446,6 @@ impl ChannelMonitor { logger: &L, ) -> Vec where - F::Target: FeeEstimator, L::Target: Logger, { let bounded_fee_estimator = LowerBoundedFeeEstimator::new(fee_estimator); @@ -2464,14 +2462,13 @@ impl ChannelMonitor { /// /// [`blocks_disconnected`]: Self::blocks_disconnected #[rustfmt::skip] - pub fn transaction_unconfirmed( + pub fn transaction_unconfirmed( &self, txid: &Txid, broadcaster: B, fee_estimator: F, logger: &L, ) where - F::Target: FeeEstimator, L::Target: Logger, { let bounded_fee_estimator = LowerBoundedFeeEstimator::new(fee_estimator); @@ -2490,7 +2487,7 @@ impl ChannelMonitor { /// /// [`block_connected`]: Self::block_connected #[rustfmt::skip] - pub fn best_block_updated( + pub fn best_block_updated( &self, header: &Header, height: u32, @@ -2499,7 +2496,6 @@ impl ChannelMonitor { logger: &L, ) -> Vec where - F::Target: FeeEstimator, L::Target: Logger, { let bounded_fee_estimator = LowerBoundedFeeEstimator::new(fee_estimator); @@ -2536,11 +2532,10 @@ impl ChannelMonitor { /// invoking this every 30 seconds, or lower if running in an environment with spotty /// connections, like on mobile. #[rustfmt::skip] - pub fn rebroadcast_pending_claims( + pub fn rebroadcast_pending_claims( &self, broadcaster: B, fee_estimator: F, logger: &L, ) where - F::Target: FeeEstimator, L::Target: Logger, { let fee_estimator = LowerBoundedFeeEstimator::new(fee_estimator); @@ -2563,11 +2558,10 @@ impl ChannelMonitor { /// Triggers rebroadcasts of pending claims from a force-closed channel after a transaction /// signature generation failure. #[rustfmt::skip] - pub fn signer_unblocked( + pub fn signer_unblocked( &self, broadcaster: B, fee_estimator: F, logger: &L, ) where - F::Target: FeeEstimator, L::Target: Logger, { let fee_estimator = LowerBoundedFeeEstimator::new(fee_estimator); @@ -3816,12 +3810,11 @@ impl ChannelMonitorImpl { /// /// Note that this is often called multiple times for the same payment and must be idempotent. #[rustfmt::skip] - fn provide_payment_preimage( + fn provide_payment_preimage( &mut self, payment_hash: &PaymentHash, payment_preimage: &PaymentPreimage, payment_info: &Option, broadcaster: &B, fee_estimator: &LowerBoundedFeeEstimator, logger: &WithChannelMonitor) - where F::Target: FeeEstimator, - L::Target: Logger, + where L::Target: Logger, { self.payment_preimages.entry(payment_hash.clone()) .and_modify(|(_, payment_infos)| { @@ -3994,12 +3987,11 @@ impl ChannelMonitorImpl { /// See also [`ChannelMonitor::broadcast_latest_holder_commitment_txn`]. /// /// [`ChannelMonitor::broadcast_latest_holder_commitment_txn`]: crate::chain::channelmonitor::ChannelMonitor::broadcast_latest_holder_commitment_txn - pub(crate) fn queue_latest_holder_commitment_txn_for_broadcast( + pub(crate) fn queue_latest_holder_commitment_txn_for_broadcast( &mut self, broadcaster: &B, fee_estimator: &LowerBoundedFeeEstimator, logger: &WithChannelMonitor, require_funding_seen: bool, ) where - F::Target: FeeEstimator, L::Target: Logger, { let reason = ClosureReason::HolderForceClosed { @@ -4197,11 +4189,10 @@ impl ChannelMonitorImpl { } #[rustfmt::skip] - fn update_monitor( + fn update_monitor( &mut self, updates: &ChannelMonitorUpdate, broadcaster: &B, fee_estimator: &F, logger: &WithChannelMonitor ) -> Result<(), ()> - where F::Target: FeeEstimator, - L::Target: Logger, + where L::Target: Logger, { if self.latest_update_id == LEGACY_CLOSED_CHANNEL_UPDATE_ID && updates.update_id == LEGACY_CLOSED_CHANNEL_UPDATE_ID { log_info!(logger, "Applying pre-0.1 post-force-closed update to monitor {} with {} change(s).", @@ -4243,7 +4234,7 @@ impl ChannelMonitorImpl { } } let mut ret = Ok(()); - let bounded_fee_estimator = LowerBoundedFeeEstimator::new(&**fee_estimator); + let bounded_fee_estimator = LowerBoundedFeeEstimator::new(fee_estimator); for update in updates.updates.iter() { match update { ChannelMonitorUpdateStep::LatestHolderCommitmentTXInfo { commitment_tx, htlc_outputs, claimed_htlcs, nondust_htlc_sources } => { @@ -5292,13 +5283,10 @@ impl ChannelMonitorImpl { } #[rustfmt::skip] - fn block_connected( + fn block_connected( &mut self, header: &Header, txdata: &TransactionData, height: u32, broadcaster: B, fee_estimator: F, logger: &WithChannelMonitor, - ) -> Vec - where F::Target: FeeEstimator, - L::Target: Logger, - { + ) -> Vec where L::Target: Logger, { let block_hash = header.block_hash(); self.best_block = BestBlock::new(block_hash, height); @@ -5307,7 +5295,7 @@ impl ChannelMonitorImpl { } #[rustfmt::skip] - fn best_block_updated( + fn best_block_updated( &mut self, header: &Header, height: u32, @@ -5316,7 +5304,6 @@ impl ChannelMonitorImpl { logger: &WithChannelMonitor, ) -> Vec where - F::Target: FeeEstimator, L::Target: Logger, { let block_hash = header.block_hash(); @@ -5338,7 +5325,7 @@ impl ChannelMonitorImpl { } #[rustfmt::skip] - fn transactions_confirmed( + fn transactions_confirmed( &mut self, header: &Header, txdata: &TransactionData, @@ -5348,7 +5335,6 @@ impl ChannelMonitorImpl { logger: &WithChannelMonitor, ) -> Vec where - F::Target: FeeEstimator, L::Target: Logger, { let funding_seen_before = self.funding_seen_onchain; @@ -5622,7 +5608,7 @@ impl ChannelMonitorImpl { /// `conf_height` should be set to the height at which any new transaction(s)/block(s) were /// confirmed at, even if it is not the current best height. #[rustfmt::skip] - fn block_confirmed( + fn block_confirmed( &mut self, conf_height: u32, conf_hash: BlockHash, @@ -5634,7 +5620,6 @@ impl ChannelMonitorImpl { logger: &WithChannelMonitor, ) -> Vec where - F::Target: FeeEstimator, L::Target: Logger, { log_trace!(logger, "Processing {} matched transactions for block at height {}.", txn_matched.len(), conf_height); @@ -5849,10 +5834,9 @@ impl ChannelMonitorImpl { } #[rustfmt::skip] - fn blocks_disconnected( + fn blocks_disconnected( &mut self, fork_point: BestBlock, broadcaster: B, fee_estimator: F, logger: &WithChannelMonitor - ) where F::Target: FeeEstimator, - L::Target: Logger, + ) where L::Target: Logger, { let new_height = fork_point.height; log_trace!(logger, "Block(s) disconnected to height {}", new_height); @@ -5897,14 +5881,13 @@ impl ChannelMonitorImpl { } #[rustfmt::skip] - fn transaction_unconfirmed( + fn transaction_unconfirmed( &mut self, txid: &Txid, broadcaster: B, fee_estimator: &LowerBoundedFeeEstimator, logger: &WithChannelMonitor, ) where - F::Target: FeeEstimator, L::Target: Logger, { let mut removed_height = None; @@ -6357,38 +6340,36 @@ impl ChannelMonitorImpl { } } -impl chain::Listen +impl chain::Listen for (ChannelMonitor, T, F, L) where - F::Target: FeeEstimator, L::Target: Logger, { fn filtered_block_connected(&self, header: &Header, txdata: &TransactionData, height: u32) { - self.0.block_connected(header, txdata, height, &self.1, &*self.2, &self.3); + self.0.block_connected(header, txdata, height, &self.1, &self.2, &self.3); } fn blocks_disconnected(&self, fork_point: BestBlock) { - self.0.blocks_disconnected(fork_point, &self.1, &*self.2, &self.3); + self.0.blocks_disconnected(fork_point, &self.1, &self.2, &self.3); } } -impl chain::Confirm - for (M, T, F, L) +impl + chain::Confirm for (M, T, F, L) where M: Deref>, - F::Target: FeeEstimator, L::Target: Logger, { fn transactions_confirmed(&self, header: &Header, txdata: &TransactionData, height: u32) { - self.0.transactions_confirmed(header, txdata, height, &self.1, &*self.2, &self.3); + self.0.transactions_confirmed(header, txdata, height, &self.1, &self.2, &self.3); } fn transaction_unconfirmed(&self, txid: &Txid) { - self.0.transaction_unconfirmed(txid, &self.1, &*self.2, &self.3); + self.0.transaction_unconfirmed(txid, &self.1, &self.2, &self.3); } fn best_block_updated(&self, header: &Header, height: u32) { - self.0.best_block_updated(header, height, &self.1, &*self.2, &self.3); + self.0.best_block_updated(header, height, &self.1, &self.2, &self.3); } fn get_relevant_txids(&self) -> Vec<(Txid, u32, Option)> { diff --git a/lightning/src/chain/onchaintx.rs b/lightning/src/chain/onchaintx.rs index 321b6008683..cfee63beefd 100644 --- a/lightning/src/chain/onchaintx.rs +++ b/lightning/src/chain/onchaintx.rs @@ -45,7 +45,6 @@ use alloc::collections::BTreeMap; use core::cmp; use core::mem::replace; use core::mem::swap; -use core::ops::Deref; const MAX_ALLOC_SIZE: usize = 64 * 1024; @@ -485,14 +484,11 @@ impl OnchainTxHandler { /// invoking this every 30 seconds, or lower if running in an environment with spotty /// connections, like on mobile. #[rustfmt::skip] - pub(super) fn rebroadcast_pending_claims( + pub(super) fn rebroadcast_pending_claims( &mut self, current_height: u32, feerate_strategy: FeerateStrategy, broadcaster: &B, conf_target: ConfirmationTarget, destination_script: &Script, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, - ) - where - F::Target: FeeEstimator, - { + ) { let mut bump_requests = Vec::with_capacity(self.pending_claim_requests.len()); for (claim_id, request) in self.pending_claim_requests.iter() { let inputs = request.outpoints(); @@ -553,13 +549,11 @@ impl OnchainTxHandler { /// Panics if there are signing errors, because signing operations in reaction to on-chain /// events are not expected to fail, and if they do, we may lose funds. #[rustfmt::skip] - fn generate_claim( + fn generate_claim( &mut self, cur_height: u32, cached_request: &PackageTemplate, feerate_strategy: &FeerateStrategy, conf_target: ConfirmationTarget, destination_script: &Script, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, - ) -> Option<(u32, u64, OnchainClaim)> - where F::Target: FeeEstimator, - { + ) -> Option<(u32, u64, OnchainClaim)> { let request_outpoints = cached_request.outpoints(); if request_outpoints.is_empty() { // Don't prune pending claiming request yet, we may have to resurrect HTLCs. Untractable @@ -760,11 +754,11 @@ impl OnchainTxHandler { /// does not need to equal the current blockchain tip height, which should be provided via /// `cur_height`, however it must never be higher than `cur_height`. #[rustfmt::skip] - pub(super) fn update_claims_view_from_requests( + pub(super) fn update_claims_view_from_requests( &mut self, mut requests: Vec, conf_height: u32, cur_height: u32, broadcaster: &B, conf_target: ConfirmationTarget, destination_script: &Script, - fee_estimator: &LowerBoundedFeeEstimator, logger: &L - ) where F::Target: FeeEstimator, { + fee_estimator: &LowerBoundedFeeEstimator, logger: &L, + ) { if !requests.is_empty() { log_debug!(logger, "Updating claims view at height {} with {} claim requests", cur_height, requests.len()); } @@ -908,13 +902,11 @@ impl OnchainTxHandler { /// confirmed. This does not need to equal the current blockchain tip height, which should be /// provided via `cur_height`, however it must never be higher than `cur_height`. #[rustfmt::skip] - pub(super) fn update_claims_view_from_matched_txn( + pub(super) fn update_claims_view_from_matched_txn( &mut self, txn_matched: &[&Transaction], conf_height: u32, conf_hash: BlockHash, cur_height: u32, broadcaster: &B, conf_target: ConfirmationTarget, - destination_script: &Script, fee_estimator: &LowerBoundedFeeEstimator, logger: &L - ) where - F::Target: FeeEstimator, - { + destination_script: &Script, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, + ) { let mut have_logged_intro = false; let mut maybe_log_intro = || { if !have_logged_intro { @@ -1105,7 +1097,7 @@ impl OnchainTxHandler { } #[rustfmt::skip] - pub(super) fn transaction_unconfirmed( + pub(super) fn transaction_unconfirmed( &mut self, txid: &Txid, broadcaster: &B, @@ -1113,9 +1105,7 @@ impl OnchainTxHandler { destination_script: &Script, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, - ) where - F::Target: FeeEstimator, - { + ) { let mut height = None; for entry in self.onchain_events_awaiting_threshold_conf.iter() { if entry.txid == *txid { @@ -1132,10 +1122,10 @@ impl OnchainTxHandler { } #[rustfmt::skip] - pub(super) fn blocks_disconnected( + pub(super) fn blocks_disconnected( &mut self, new_best_height: u32, broadcaster: &B, conf_target: ConfirmationTarget, destination_script: &Script, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, - ) where F::Target: FeeEstimator, { + ) { let mut bump_candidates = new_hash_map(); let onchain_events_awaiting_threshold_conf = self.onchain_events_awaiting_threshold_conf.drain(..).collect::>(); diff --git a/lightning/src/chain/package.rs b/lightning/src/chain/package.rs index db46f3be60d..0abe3534341 100644 --- a/lightning/src/chain/package.rs +++ b/lightning/src/chain/package.rs @@ -46,7 +46,6 @@ use crate::util::ser::{Readable, ReadableArgs, RequiredWrapper, Writeable, Write use crate::io; use core::cmp; -use core::ops::Deref; #[allow(unused_imports)] use crate::prelude::*; @@ -1512,12 +1511,10 @@ impl PackageTemplate { /// which was used to generate the value. Will not return less than `dust_limit_sats` for the /// value. #[rustfmt::skip] - pub(crate) fn compute_package_output( + pub(crate) fn compute_package_output( &self, predicted_weight: u64, dust_limit_sats: u64, feerate_strategy: &FeerateStrategy, conf_target: ConfirmationTarget, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, - ) -> Option<(u64, u64)> - where F::Target: FeeEstimator, - { + ) -> Option<(u64, u64)> { debug_assert!(matches!(self.malleability, PackageMalleability::Malleable(..)), "The package output is fixed for non-malleable packages"); let input_amounts = self.package_amount(); @@ -1540,10 +1537,10 @@ impl PackageTemplate { /// Computes a feerate based on the given confirmation target and feerate strategy. #[rustfmt::skip] - pub(crate) fn compute_package_feerate( + pub(crate) fn compute_package_feerate( &self, fee_estimator: &LowerBoundedFeeEstimator, conf_target: ConfirmationTarget, feerate_strategy: &FeerateStrategy, - ) -> u32 where F::Target: FeeEstimator { + ) -> u32 { let feerate_estimate = fee_estimator.bounded_sat_per_1000_weight(conf_target); if self.feerate_previous != 0 { let previous_feerate = self.feerate_previous.try_into().unwrap_or(u32::max_value()); @@ -1675,11 +1672,9 @@ impl Readable for PackageTemplate { /// fee and the corresponding updated feerate. If fee is under [`FEERATE_FLOOR_SATS_PER_KW`], /// we return nothing. #[rustfmt::skip] -fn compute_fee_from_spent_amounts( +fn compute_fee_from_spent_amounts( input_amounts: u64, predicted_weight: u64, conf_target: ConfirmationTarget, fee_estimator: &LowerBoundedFeeEstimator, logger: &L -) -> Option<(u64, u64)> - where F::Target: FeeEstimator, -{ +) -> Option<(u64, u64)> { let sweep_feerate = fee_estimator.bounded_sat_per_1000_weight(conf_target); let fee_rate = cmp::min(sweep_feerate, compute_feerate_sat_per_1000_weight(input_amounts / 2, predicted_weight)); let fee = fee_rate as u64 * (predicted_weight) / 1000; @@ -1701,14 +1696,11 @@ fn compute_fee_from_spent_amounts( /// respect BIP125 rules 3) and 4) and if required adjust the new fee to meet the RBF policy /// requirement. #[rustfmt::skip] -fn feerate_bump( +fn feerate_bump( predicted_weight: u64, input_amounts: u64, dust_limit_sats: u64, previous_feerate: u64, feerate_strategy: &FeerateStrategy, conf_target: ConfirmationTarget, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, -) -> Option<(u64, u64)> -where - F::Target: FeeEstimator, -{ +) -> Option<(u64, u64)> { let previous_fee = previous_feerate * predicted_weight / 1000; // If old feerate inferior to actual one given back by Fee Estimator, use it to compute new fee... diff --git a/lightning/src/ln/chan_utils.rs b/lightning/src/ln/chan_utils.rs index 46afa05b2f2..4bb8ffac9ef 100644 --- a/lightning/src/ln/chan_utils.rs +++ b/lightning/src/ln/chan_utils.rs @@ -320,12 +320,9 @@ pub(crate) fn htlc_tx_fees_sat(feerate_per_kw: u32, num_accepted_htlcs: usize, n /// Returns a fee estimate for the commitment transaction that we would ideally like to set, /// depending on channel type. -pub(super) fn selected_commitment_sat_per_1000_weight( +pub(super) fn selected_commitment_sat_per_1000_weight( fee_estimator: &LowerBoundedFeeEstimator, channel_type: &ChannelTypeFeatures, -) -> u32 -where - F::Target: FeeEstimator, -{ +) -> u32 { if channel_type.supports_anchor_zero_fee_commitments() { 0 } else if channel_type.supports_anchors_zero_fee_htlc_tx() { diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs index 7c25fd7e28a..9528fee5b33 100644 --- a/lightning/src/ln/channel.rs +++ b/lightning/src/ln/channel.rs @@ -1757,12 +1757,11 @@ where } #[rustfmt::skip] - pub fn maybe_handle_error_without_close( + pub fn maybe_handle_error_without_close( &mut self, chain_hash: ChainHash, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, user_config: &UserConfig, their_features: &InitFeatures, ) -> Result, ()> where - F::Target: FeeEstimator, L::Target: Logger, { match &mut self.phase { @@ -2168,11 +2167,10 @@ where } #[rustfmt::skip] - pub fn commitment_signed( + pub fn commitment_signed( &mut self, msg: &msgs::CommitmentSigned, best_block: BestBlock, signer_provider: &SP, fee_estimator: &LowerBoundedFeeEstimator, logger: &L ) -> Result<(Option::EcdsaSigner>>, Option), ChannelError> where - F::Target: FeeEstimator, L::Target: Logger { let phase = core::mem::replace(&mut self.phase, ChannelPhase::Undefined); @@ -2246,12 +2244,9 @@ where /// Doesn't bother handling the /// if-we-removed-it-already-but-haven't-fully-resolved-they-can-still-send-an-inbound-HTLC /// corner case properly. - pub fn get_available_balances( + pub fn get_available_balances( &self, fee_estimator: &LowerBoundedFeeEstimator, - ) -> AvailableBalances - where - F::Target: FeeEstimator, - { + ) -> AvailableBalances { match &self.phase { ChannelPhase::Undefined => unreachable!(), ChannelPhase::Funded(chan) => chan.get_available_balances(fee_estimator), @@ -3376,7 +3371,7 @@ where SP::Target: SignerProvider, { #[rustfmt::skip] - fn new_for_inbound_channel<'a, ES: EntropySource, F: Deref, L: Deref>( + fn new_for_inbound_channel<'a, ES: EntropySource, F: FeeEstimator, L: Deref>( fee_estimator: &'a LowerBoundedFeeEstimator, entropy_source: &'a ES, signer_provider: &'a SP, @@ -3396,7 +3391,6 @@ where open_channel_fields: msgs::CommonOpenChannelFields, ) -> Result<(FundingScope, ChannelContext), ChannelError> where - F::Target: FeeEstimator, L::Target: Logger, SP::Target: SignerProvider, { @@ -3719,7 +3713,7 @@ where } #[rustfmt::skip] - fn new_for_outbound_channel<'a, ES: EntropySource, F: Deref, L: Deref>( + fn new_for_outbound_channel<'a, ES: EntropySource, F: FeeEstimator, L: Deref>( fee_estimator: &'a LowerBoundedFeeEstimator, entropy_source: &'a ES, signer_provider: &'a SP, @@ -3738,7 +3732,6 @@ where _logger: L, ) -> Result<(FundingScope, ChannelContext), APIError> where - F::Target: FeeEstimator, SP::Target: SignerProvider, L::Target: Logger, { @@ -4348,12 +4341,9 @@ where /// Returns a maximum "sane" fee rate used to reason about our dust exposure. /// Will be Some if the `channel_type`'s dust exposure depends on its commitment fee rate, and /// None otherwise. - fn get_dust_exposure_limiting_feerate( + fn get_dust_exposure_limiting_feerate( &self, fee_estimator: &LowerBoundedFeeEstimator, channel_type: &ChannelTypeFeatures, - ) -> Option - where - F::Target: FeeEstimator, - { + ) -> Option { if channel_type.supports_anchor_zero_fee_commitments() { None } else { @@ -4750,13 +4740,10 @@ where Ok(ret) } - fn validate_update_add_htlc( + fn validate_update_add_htlc( &self, funding: &FundingScope, msg: &msgs::UpdateAddHTLC, fee_estimator: &LowerBoundedFeeEstimator, - ) -> Result<(), ChannelError> - where - F::Target: FeeEstimator, - { + ) -> Result<(), ChannelError> { if msg.amount_msat > funding.get_value_satoshis() * 1000 { return Err(ChannelError::close( "Remote side tried to send more than the total value of the channel".to_owned(), @@ -4868,13 +4855,10 @@ where Ok(()) } - fn validate_update_fee( + fn validate_update_fee( &self, funding: &FundingScope, fee_estimator: &LowerBoundedFeeEstimator, new_feerate_per_kw: u32, - ) -> Result<(), ChannelError> - where - F::Target: FeeEstimator, - { + ) -> Result<(), ChannelError> { // Check that we won't be pushed over our dust exposure limit by the feerate increase. let dust_exposure_limiting_feerate = self.get_dust_exposure_limiting_feerate(&fee_estimator, funding.get_channel_type()); @@ -4946,7 +4930,7 @@ where Ok(()) } - fn validate_commitment_signed( + fn validate_commitment_signed( &self, funding: &FundingScope, transaction_number: u64, commitment_point: PublicKey, msg: &msgs::CommitmentSigned, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, ) -> Result< @@ -4954,7 +4938,6 @@ where ChannelError, > where - F::Target: FeeEstimator, L::Target: Logger, { let funding_script = funding.get_funding_redeemscript(); @@ -5078,12 +5061,11 @@ where Ok((holder_commitment_tx, commitment_data.htlcs_included)) } - fn can_send_update_fee( + fn can_send_update_fee( &self, funding: &FundingScope, feerate_per_kw: u32, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, ) -> bool where - F::Target: FeeEstimator, L::Target: Logger, { // Before proposing a feerate update, check that we can actually afford the new fee. @@ -5665,12 +5647,9 @@ where } #[rustfmt::skip] - fn get_available_balances_for_scope( + fn get_available_balances_for_scope( &self, funding: &FundingScope, fee_estimator: &LowerBoundedFeeEstimator, - ) -> AvailableBalances - where - F::Target: FeeEstimator, - { + ) -> AvailableBalances { let context = &self; // Note that we have to handle overflow due to the case mentioned in the docs in general // here. @@ -6189,13 +6168,10 @@ where /// of the channel type we tried, not of our ability to open any channel at all. We can see if a /// downgrade of channel features would be possible so that we can still open the channel. #[rustfmt::skip] - pub(crate) fn maybe_downgrade_channel_features( + pub(crate) fn maybe_downgrade_channel_features( &mut self, funding: &mut FundingScope, fee_estimator: &LowerBoundedFeeEstimator, user_config: &UserConfig, their_features: &InitFeatures, - ) -> Result<(), ()> - where - F::Target: FeeEstimator - { + ) -> Result<(), ()> { if !funding.is_outbound() || !matches!( self.channel_state, ChannelState::NegotiatingFunding(flags) @@ -7115,11 +7091,10 @@ where } #[rustfmt::skip] - fn check_remote_fee( + fn check_remote_fee( channel_type: &ChannelTypeFeatures, fee_estimator: &LowerBoundedFeeEstimator, feerate_per_kw: u32, cur_feerate_per_kw: Option, logger: &L - ) -> Result<(), ChannelError> where F::Target: FeeEstimator, L::Target: Logger, - { + ) -> Result<(), ChannelError> where L::Target: Logger { if channel_type.supports_anchor_zero_fee_commitments() { if feerate_per_kw != 0 { let err = "Zero Fee Channels must never attempt to use a fee".to_owned(); @@ -7725,9 +7700,9 @@ where } #[rustfmt::skip] - pub fn update_add_htlc( + pub fn update_add_htlc( &mut self, msg: &msgs::UpdateAddHTLC, fee_estimator: &LowerBoundedFeeEstimator, - ) -> Result<(), ChannelError> where F::Target: FeeEstimator { + ) -> Result<(), ChannelError> { if self.context.channel_state.is_remote_stfu_sent() || self.context.channel_state.is_quiescent() { return Err(ChannelError::WarnAndDisconnect("Got add HTLC message while quiescent".to_owned())); } @@ -7949,12 +7924,11 @@ where /// Note that our `commitment_signed` send did not include a monitor update. This is due to: /// 1. Updates cannot be made since the state machine is paused until `tx_signatures`. /// 2. We're still able to abort negotiation until `tx_signatures`. - fn splice_initial_commitment_signed( + fn splice_initial_commitment_signed( &mut self, msg: &msgs::CommitmentSigned, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, ) -> Result, ChannelError> where - F::Target: FeeEstimator, L::Target: Logger, { debug_assert!(self @@ -8066,12 +8040,11 @@ where (nondust_htlc_sources, dust_htlcs) } - pub fn commitment_signed( + pub fn commitment_signed( &mut self, msg: &msgs::CommitmentSigned, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, ) -> Result, ChannelError> where - F::Target: FeeEstimator, L::Target: Logger, { self.commitment_signed_check_state()?; @@ -8110,12 +8083,11 @@ where self.commitment_signed_update_monitor(update, logger) } - pub fn commitment_signed_batch( + pub fn commitment_signed_batch( &mut self, batch: Vec, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, ) -> Result, ChannelError> where - F::Target: FeeEstimator, L::Target: Logger, { self.commitment_signed_check_state()?; @@ -8364,11 +8336,10 @@ where /// Public version of the below, checking relevant preconditions first. /// If we're not in a state where freeing the holding cell makes sense, this is a no-op and /// returns `(None, Vec::new())`. - pub fn maybe_free_holding_cell_htlcs( + pub fn maybe_free_holding_cell_htlcs( &mut self, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, ) -> (Option, Vec<(HTLCSource, PaymentHash)>) where - F::Target: FeeEstimator, L::Target: Logger, { if matches!(self.context.channel_state, ChannelState::ChannelReady(_)) @@ -8382,11 +8353,10 @@ where /// Frees any pending commitment updates in the holding cell, generating the relevant messages /// for our counterparty. - fn free_holding_cell_htlcs( + fn free_holding_cell_htlcs( &mut self, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, ) -> (Option, Vec<(HTLCSource, PaymentHash)>) where - F::Target: FeeEstimator, L::Target: Logger, { assert!(matches!(self.context.channel_state, ChannelState::ChannelReady(_))); @@ -8591,7 +8561,7 @@ where /// /// [`HeldHtlcAvailable`]: crate::onion_message::async_payments::HeldHtlcAvailable /// [`ReleaseHeldHtlc`]: crate::onion_message::async_payments::ReleaseHeldHtlc - pub fn revoke_and_ack( + pub fn revoke_and_ack( &mut self, msg: &msgs::RevokeAndACK, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, hold_mon_update: bool, ) -> Result< @@ -8603,7 +8573,6 @@ where ChannelError, > where - F::Target: FeeEstimator, L::Target: Logger, { if self.context.channel_state.is_quiescent() { @@ -9250,10 +9219,9 @@ where /// Queues up an outbound update fee by placing it in the holding cell. You should call /// [`Self::maybe_free_holding_cell_htlcs`] in order to actually generate and send the /// commitment update. - pub fn queue_update_fee( + pub fn queue_update_fee( &mut self, feerate_per_kw: u32, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, ) where - F::Target: FeeEstimator, L::Target: Logger, { let msg_opt = self.send_update_fee(feerate_per_kw, true, fee_estimator, logger); @@ -9268,12 +9236,10 @@ where /// You MUST call [`Self::send_commitment_no_state_update`] prior to any other calls on this /// [`FundedChannel`] if `force_holding_cell` is false. #[rustfmt::skip] - fn send_update_fee( + fn send_update_fee( &mut self, feerate_per_kw: u32, mut force_holding_cell: bool, fee_estimator: &LowerBoundedFeeEstimator, logger: &L - ) -> Option - where F::Target: FeeEstimator, L::Target: Logger - { + ) -> Option where L::Target: Logger { if !self.funding.is_outbound() { panic!("Cannot send fee from inbound channel"); } @@ -9566,8 +9532,8 @@ where } #[rustfmt::skip] - pub fn update_fee(&mut self, fee_estimator: &LowerBoundedFeeEstimator, msg: &msgs::UpdateFee, logger: &L) -> Result<(), ChannelError> - where F::Target: FeeEstimator, L::Target: Logger + pub fn update_fee(&mut self, fee_estimator: &LowerBoundedFeeEstimator, msg: &msgs::UpdateFee, logger: &L) -> Result<(), ChannelError> + where L::Target: Logger { if self.funding.is_outbound() { return Err(ChannelError::close("Non-funding remote tried to update channel fee".to_owned())); @@ -10289,12 +10255,9 @@ where /// Calculates and returns our minimum and maximum closing transaction fee amounts, in whole /// satoshis. The amounts remain consistent unless a peer disconnects/reconnects or we restart, /// at which point they will be recalculated. - fn calculate_closing_fee_limits( + fn calculate_closing_fee_limits( &mut self, fee_estimator: &LowerBoundedFeeEstimator, - ) -> (u64, u64) - where - F::Target: FeeEstimator, - { + ) -> (u64, u64) { if let Some((min, max)) = self.context.closing_fee_limits { return (min, max); } @@ -10381,11 +10344,10 @@ where Ok(()) } - pub fn maybe_propose_closing_signed( + pub fn maybe_propose_closing_signed( &mut self, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, ) -> Result<(Option, Option<(Transaction, ShutdownResult)>), ChannelError> where - F::Target: FeeEstimator, L::Target: Logger, { // If we're waiting on a monitor persistence, that implies we're also waiting to send some @@ -10708,12 +10670,11 @@ where } } - pub fn closing_signed( + pub fn closing_signed( &mut self, fee_estimator: &LowerBoundedFeeEstimator, msg: &msgs::ClosingSigned, logger: &L, ) -> Result<(Option, Option<(Transaction, ShutdownResult)>), ChannelError> where - F::Target: FeeEstimator, L::Target: Logger, { if self.is_shutdown_pending_signature() { @@ -10958,13 +10919,9 @@ where /// When this function is called, the HTLC is already irrevocably committed to the channel; /// this function determines whether to fail the HTLC, or forward / claim it. #[rustfmt::skip] - pub fn can_accept_incoming_htlc( + pub fn can_accept_incoming_htlc( &self, fee_estimator: &LowerBoundedFeeEstimator, logger: L - ) -> Result<(), LocalHTLCFailureReason> - where - F::Target: FeeEstimator, - L::Target: Logger - { + ) -> Result<(), LocalHTLCFailureReason> where L::Target: Logger { if self.context.channel_state.is_local_shutdown_sent() { return Err(LocalHTLCFailureReason::ChannelClosed) } @@ -12642,14 +12599,13 @@ where /// Queues up an outbound HTLC to send by placing it in the holding cell. You should call /// [`Self::maybe_free_holding_cell_htlcs`] in order to actually generate and send the /// commitment update. - pub fn queue_add_htlc( + pub fn queue_add_htlc( &mut self, amount_msat: u64, payment_hash: PaymentHash, cltv_expiry: u32, source: HTLCSource, onion_routing_packet: msgs::OnionPacket, skimmed_fee_msat: Option, blinding_point: Option, accountable: bool, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, ) -> Result<(), (LocalHTLCFailureReason, String)> where - F::Target: FeeEstimator, L::Target: Logger, { self.send_htlc( @@ -12691,14 +12647,13 @@ where /// on this [`FundedChannel`] if `force_holding_cell` is false. /// /// `Err`'s will always be temporary channel failures. - fn send_htlc( + fn send_htlc( &mut self, amount_msat: u64, payment_hash: PaymentHash, cltv_expiry: u32, source: HTLCSource, onion_routing_packet: msgs::OnionPacket, mut force_holding_cell: bool, skimmed_fee_msat: Option, blinding_point: Option, hold_htlc: bool, accountable: bool, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, ) -> Result where - F::Target: FeeEstimator, L::Target: Logger, { if !matches!(self.context.channel_state, ChannelState::ChannelReady(_)) @@ -12808,12 +12763,9 @@ where } #[rustfmt::skip] - pub(super) fn get_available_balances( + pub(super) fn get_available_balances( &self, fee_estimator: &LowerBoundedFeeEstimator, - ) -> AvailableBalances - where - F::Target: FeeEstimator, - { + ) -> AvailableBalances { core::iter::once(&self.funding) .chain(self.pending_funding().iter()) .map(|funding| self.context.get_available_balances_for_scope(funding, fee_estimator)) @@ -13047,14 +12999,13 @@ where /// /// Shorthand for calling [`Self::send_htlc`] followed by a commitment update, see docs on /// [`Self::send_htlc`] and [`Self::build_commitment_no_state_update`] for more info. - pub fn send_htlc_and_commit( + pub fn send_htlc_and_commit( &mut self, amount_msat: u64, payment_hash: PaymentHash, cltv_expiry: u32, source: HTLCSource, onion_routing_packet: msgs::OnionPacket, skimmed_fee_msat: Option, hold_htlc: bool, accountable: bool, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, ) -> Result, ChannelError> where - F::Target: FeeEstimator, L::Target: Logger, { let send_res = self.send_htlc( @@ -13552,14 +13503,11 @@ where #[allow(dead_code)] // TODO(dual_funding): Remove once opending V2 channels is enabled. #[rustfmt::skip] - pub fn new( + pub fn new( fee_estimator: &LowerBoundedFeeEstimator, entropy_source: &ES, signer_provider: &SP, counterparty_node_id: PublicKey, their_features: &InitFeatures, channel_value_satoshis: u64, push_msat: u64, user_id: u128, config: &UserConfig, current_chain_height: u32, outbound_scid_alias: u64, temporary_channel_id: Option, logger: L - ) -> Result, APIError> - where F::Target: FeeEstimator, - L::Target: Logger, - { + ) -> Result, APIError> where L::Target: Logger { let holder_selected_channel_reserve_satoshis = get_holder_selected_channel_reserve_satoshis(channel_value_satoshis, config); if holder_selected_channel_reserve_satoshis < MIN_CHAN_DUST_LIMIT_SATOSHIS { // Protocol level safety check in place, although it should never happen because @@ -13691,14 +13639,10 @@ where /// not of our ability to open any channel at all. Thus, on error, we should first call this /// and see if we get a new `OpenChannel` message, otherwise the channel is failed. #[rustfmt::skip] - pub(crate) fn maybe_handle_error_without_close( + pub(crate) fn maybe_handle_error_without_close( &mut self, chain_hash: ChainHash, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, user_config: &UserConfig, their_features: &InitFeatures, - ) -> Result - where - F::Target: FeeEstimator, - L::Target: Logger, - { + ) -> Result where L::Target: Logger, { self.context.maybe_downgrade_channel_features( &mut self.funding, fee_estimator, user_config, their_features, )?; @@ -13943,15 +13887,12 @@ where /// Creates a new channel from a remote sides' request for one. /// Assumes chain_hash has already been checked and corresponds with what we expect! #[rustfmt::skip] - pub fn new( + pub fn new( fee_estimator: &LowerBoundedFeeEstimator, entropy_source: &ES, signer_provider: &SP, counterparty_node_id: PublicKey, our_supported_features: &ChannelTypeFeatures, their_features: &InitFeatures, msg: &msgs::OpenChannel, user_id: u128, config: &UserConfig, current_chain_height: u32, logger: &L, is_0conf: bool, - ) -> Result, ChannelError> - where F::Target: FeeEstimator, - L::Target: Logger, - { + ) -> Result, ChannelError> where L::Target: Logger { let logger = WithContext::from(logger, Some(counterparty_node_id), Some(msg.common_fields.temporary_channel_id), None); // First check the channel type is known, failing before we do anything else if we don't @@ -14216,16 +14157,13 @@ where { #[allow(dead_code)] // TODO(dual_funding): Remove once creating V2 channels is enabled. #[rustfmt::skip] - pub fn new_outbound( + pub fn new_outbound( fee_estimator: &LowerBoundedFeeEstimator, entropy_source: &ES, signer_provider: &SP, counterparty_node_id: PublicKey, their_features: &InitFeatures, funding_satoshis: u64, funding_inputs: Vec, user_id: u128, config: &UserConfig, current_chain_height: u32, outbound_scid_alias: u64, funding_confirmation_target: ConfirmationTarget, logger: L, - ) -> Result - where F::Target: FeeEstimator, - L::Target: Logger, - { + ) -> Result where L::Target: Logger { let channel_keys_id = signer_provider.generate_channel_keys_id(false, user_id); let holder_signer = signer_provider.derive_channel_signer(channel_keys_id); @@ -14288,13 +14226,10 @@ where /// If we receive an error message, it may only be a rejection of the channel type we tried, /// not of our ability to open any channel at all. Thus, on error, we should first call this /// and see if we get a new `OpenChannelV2` message, otherwise the channel is failed. - pub(crate) fn maybe_handle_error_without_close( + pub(crate) fn maybe_handle_error_without_close( &mut self, chain_hash: ChainHash, fee_estimator: &LowerBoundedFeeEstimator, user_config: &UserConfig, their_features: &InitFeatures, - ) -> Result - where - F::Target: FeeEstimator, - { + ) -> Result { self.context.maybe_downgrade_channel_features( &mut self.funding, fee_estimator, @@ -14364,15 +14299,12 @@ where /// TODO(dual_funding): Allow contributions, pass intended amount and inputs #[allow(dead_code)] // TODO(dual_funding): Remove once V2 channels is enabled. #[rustfmt::skip] - pub fn new_inbound( + pub fn new_inbound( fee_estimator: &LowerBoundedFeeEstimator, entropy_source: &ES, signer_provider: &SP, holder_node_id: PublicKey, counterparty_node_id: PublicKey, our_supported_features: &ChannelTypeFeatures, their_features: &InitFeatures, msg: &msgs::OpenChannelV2, user_id: u128, config: &UserConfig, current_chain_height: u32, logger: &L, - ) -> Result - where F::Target: FeeEstimator, - L::Target: Logger, - { + ) -> Result where L::Target: Logger, { // TODO(dual_funding): Take these as input once supported let (our_funding_contribution, our_funding_contribution_sats) = (SignedAmount::ZERO, 0u64); let our_funding_inputs = Vec::new(); diff --git a/lightning/src/ln/channel_state.rs b/lightning/src/ln/channel_state.rs index d10327b259a..7c591ff2c3b 100644 --- a/lightning/src/ln/channel_state.rs +++ b/lightning/src/ln/channel_state.rs @@ -524,13 +524,12 @@ impl ChannelDetails { } } - pub(super) fn from_channel( + pub(super) fn from_channel( channel: &Channel, best_block_height: u32, latest_features: InitFeatures, fee_estimator: &LowerBoundedFeeEstimator, ) -> Self where SP::Target: SignerProvider, - F::Target: FeeEstimator, { let context = channel.context(); let funding = channel.funding(); diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs index 98dbc97ae31..99c52f16618 100644 --- a/lightning/src/ln/channelmanager.rs +++ b/lightning/src/ln/channelmanager.rs @@ -1788,9 +1788,7 @@ pub trait AChannelManager { /// A type that may be dereferenced to [`Self::SignerProvider`]. type SP: Deref; /// A type implementing [`FeeEstimator`]. - type FeeEstimator: FeeEstimator + ?Sized; - /// A type that may be dereferenced to [`Self::FeeEstimator`]. - type F: Deref; + type FeeEstimator: FeeEstimator; /// A type implementing [`Router`]. type Router: Router + ?Sized; /// A type that may be dereferenced to [`Self::Router`]. @@ -1812,7 +1810,7 @@ pub trait AChannelManager { Self::EntropySource, Self::NodeSigner, Self::SP, - Self::F, + Self::FeeEstimator, Self::R, Self::MR, Self::L, @@ -1825,7 +1823,7 @@ impl< ES: EntropySource, NS: NodeSigner, SP: Deref, - F: Deref, + F: FeeEstimator, R: Deref, MR: Deref, L: Deref, @@ -1833,7 +1831,6 @@ impl< where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - F::Target: FeeEstimator, R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, @@ -1846,8 +1843,7 @@ where type Signer = ::EcdsaSigner; type SignerProvider = SP::Target; type SP = SP; - type FeeEstimator = F::Target; - type F = F; + type FeeEstimator = F; type Router = R::Target; type R = R; type MessageRouter = MR::Target; @@ -2644,14 +2640,13 @@ pub struct ChannelManager< ES: EntropySource, NS: NodeSigner, SP: Deref, - F: Deref, + F: FeeEstimator, R: Deref, MR: Deref, L: Deref, > where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - F::Target: FeeEstimator, R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, @@ -3717,7 +3712,7 @@ impl< ES: EntropySource, NS: NodeSigner, SP: Deref, - F: Deref, + F: FeeEstimator, R: Deref, MR: Deref, L: Deref, @@ -3725,7 +3720,6 @@ impl< where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - F::Target: FeeEstimator, R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, @@ -13189,7 +13183,7 @@ impl< ES: EntropySource, NS: NodeSigner, SP: Deref, - F: Deref, + F: FeeEstimator, R: Deref, MR: Deref, L: Deref, @@ -13197,7 +13191,6 @@ impl< where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - F::Target: FeeEstimator, R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, @@ -14038,7 +14031,7 @@ impl< ES: EntropySource, NS: NodeSigner, SP: Deref, - F: Deref, + F: FeeEstimator, R: Deref, MR: Deref, L: Deref, @@ -14046,7 +14039,6 @@ impl< where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - F::Target: FeeEstimator, R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, @@ -14393,7 +14385,7 @@ impl< ES: EntropySource, NS: NodeSigner, SP: Deref, - F: Deref, + F: FeeEstimator, R: Deref, MR: Deref, L: Deref, @@ -14401,7 +14393,6 @@ impl< where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - F::Target: FeeEstimator, R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, @@ -14425,7 +14416,7 @@ impl< ES: EntropySource, NS: NodeSigner, SP: Deref, - F: Deref, + F: FeeEstimator, R: Deref, MR: Deref, L: Deref, @@ -14433,7 +14424,6 @@ impl< where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - F::Target: FeeEstimator, R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, @@ -14483,7 +14473,7 @@ impl< ES: EntropySource, NS: NodeSigner, SP: Deref, - F: Deref, + F: FeeEstimator, R: Deref, MR: Deref, L: Deref, @@ -14491,7 +14481,6 @@ impl< where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - F::Target: FeeEstimator, R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, @@ -14653,7 +14642,7 @@ impl< ES: EntropySource, NS: NodeSigner, SP: Deref, - F: Deref, + F: FeeEstimator, R: Deref, MR: Deref, L: Deref, @@ -14661,7 +14650,6 @@ impl< where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - F::Target: FeeEstimator, R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, @@ -15012,7 +15000,7 @@ impl< ES: EntropySource, NS: NodeSigner, SP: Deref, - F: Deref, + F: FeeEstimator, R: Deref, MR: Deref, L: Deref, @@ -15020,7 +15008,6 @@ impl< where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - F::Target: FeeEstimator, R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, @@ -15584,7 +15571,7 @@ impl< ES: EntropySource, NS: NodeSigner, SP: Deref, - F: Deref, + F: FeeEstimator, R: Deref, MR: Deref, L: Deref, @@ -15592,7 +15579,6 @@ impl< where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - F::Target: FeeEstimator, R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, @@ -15799,7 +15785,7 @@ impl< ES: EntropySource, NS: NodeSigner, SP: Deref, - F: Deref, + F: FeeEstimator, R: Deref, MR: Deref, L: Deref, @@ -15807,7 +15793,6 @@ impl< where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - F::Target: FeeEstimator, R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, @@ -15998,7 +15983,7 @@ impl< ES: EntropySource, NS: NodeSigner, SP: Deref, - F: Deref, + F: FeeEstimator, R: Deref, MR: Deref, L: Deref, @@ -16006,7 +15991,6 @@ impl< where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - F::Target: FeeEstimator, R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, @@ -16063,7 +16047,7 @@ impl< ES: EntropySource, NS: NodeSigner, SP: Deref, - F: Deref, + F: FeeEstimator, R: Deref, MR: Deref, L: Deref, @@ -16071,7 +16055,6 @@ impl< where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - F::Target: FeeEstimator, R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, @@ -16576,7 +16559,7 @@ impl< ES: EntropySource, NS: NodeSigner, SP: Deref, - F: Deref, + F: FeeEstimator, R: Deref, MR: Deref, L: Deref, @@ -16584,7 +16567,6 @@ impl< where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - F::Target: FeeEstimator, R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, @@ -16940,14 +16922,13 @@ pub struct ChannelManagerReadArgs< ES: EntropySource, NS: NodeSigner, SP: Deref, - F: Deref, + F: FeeEstimator, R: Deref, MR: Deref, L: Deref + Clone, > where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - F::Target: FeeEstimator, R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, @@ -17017,7 +16998,7 @@ impl< ES: EntropySource, NS: NodeSigner, SP: Deref, - F: Deref, + F: FeeEstimator, R: Deref, MR: Deref, L: Deref + Clone, @@ -17025,7 +17006,6 @@ impl< where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - F::Target: FeeEstimator, R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, @@ -17102,7 +17082,7 @@ impl< ES: EntropySource, NS: NodeSigner, SP: Deref, - F: Deref, + F: FeeEstimator, R: Deref, MR: Deref, L: Deref + Clone, @@ -17111,7 +17091,6 @@ impl< where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - F::Target: FeeEstimator, R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, @@ -17132,7 +17111,7 @@ impl< ES: EntropySource, NS: NodeSigner, SP: Deref, - F: Deref, + F: FeeEstimator, R: Deref, MR: Deref, L: Deref + Clone, @@ -17141,7 +17120,6 @@ impl< where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - F::Target: FeeEstimator, 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 2bdb7e0a826..120340686d4 100644 --- a/lightning/src/ln/functional_test_utils.rs +++ b/lightning/src/ln/functional_test_utils.rs @@ -736,7 +736,7 @@ pub trait NodeHolder { ::EntropySource, ::NodeSigner, ::SP, - ::F, + ::FeeEstimator, ::R, ::MR, ::L, @@ -753,7 +753,7 @@ impl NodeHolder for &H { ::EntropySource, ::NodeSigner, ::SP, - ::F, + ::FeeEstimator, ::R, ::MR, ::L, diff --git a/lightning/src/util/anchor_channel_reserves.rs b/lightning/src/util/anchor_channel_reserves.rs index ff29e8adbd4..92c51975e5c 100644 --- a/lightning/src/util/anchor_channel_reserves.rs +++ b/lightning/src/util/anchor_channel_reserves.rs @@ -274,21 +274,11 @@ pub fn can_support_additional_anchor_channel< ChannelSigner: EcdsaChannelSigner, FilterRef: Deref, B: BroadcasterInterface, - EstimatorRef: Deref, + FE: FeeEstimator, LoggerRef: Deref, PersistRef: Deref, ES: EntropySource, - ChainMonitorRef: Deref< - Target = ChainMonitor< - ChannelSigner, - FilterRef, - B, - EstimatorRef, - LoggerRef, - PersistRef, - ES, - >, - >, + ChainMonitorRef: Deref>, >( context: &AnchorChannelReserveContext, utxos: &[Utxo], a_channel_manager: AChannelManagerRef, chain_monitor: ChainMonitorRef, @@ -296,7 +286,6 @@ pub fn can_support_additional_anchor_channel< where AChannelManagerRef::Target: AChannelManager, FilterRef::Target: Filter, - EstimatorRef::Target: FeeEstimator, LoggerRef::Target: Logger, PersistRef::Target: Persist, { diff --git a/lightning/src/util/persist.rs b/lightning/src/util/persist.rs index ecc2d946acd..3a94732fa46 100644 --- a/lightning/src/util/persist.rs +++ b/lightning/src/util/persist.rs @@ -593,21 +593,25 @@ pub struct MonitorUpdatingPersister< ES: EntropySource, SP: Deref, BI: BroadcasterInterface, - FE: Deref, + FE: FeeEstimator, >(MonitorUpdatingPersisterAsync, PanicingSpawner, L, ES, SP, BI, FE>) where K::Target: KVStoreSync, L::Target: Logger, - SP::Target: SignerProvider + Sized, - FE::Target: FeeEstimator; + SP::Target: SignerProvider + Sized; -impl - MonitorUpdatingPersister +impl< + K: Deref, + L: Deref, + ES: EntropySource, + SP: Deref, + BI: BroadcasterInterface, + FE: FeeEstimator, + > MonitorUpdatingPersister where K::Target: KVStoreSync, L::Target: Logger, SP::Target: SignerProvider + Sized, - FE::Target: FeeEstimator, { /// Constructs a new [`MonitorUpdatingPersister`]. /// @@ -698,13 +702,12 @@ impl< ES: EntropySource, SP: Deref, BI: BroadcasterInterface, - FE: Deref, + FE: FeeEstimator, > Persist for MonitorUpdatingPersister where K::Target: KVStoreSync, L::Target: Logger, SP::Target: SignerProvider + Sized, - FE::Target: FeeEstimator, { /// Persists a new channel. This means writing the entire monitor to the /// parametrized [`KVStoreSync`]. @@ -782,13 +785,12 @@ pub struct MonitorUpdatingPersisterAsync< ES: EntropySource, SP: Deref, BI: BroadcasterInterface, - FE: Deref, + FE: FeeEstimator, >(Arc>) where K::Target: KVStore, L::Target: Logger, - SP::Target: SignerProvider + Sized, - FE::Target: FeeEstimator; + SP::Target: SignerProvider + Sized; struct MonitorUpdatingPersisterAsyncInner< K: Deref, @@ -797,12 +799,11 @@ struct MonitorUpdatingPersisterAsyncInner< ES: EntropySource, SP: Deref, BI: BroadcasterInterface, - FE: Deref, + FE: FeeEstimator, > where K::Target: KVStore, L::Target: Logger, SP::Target: SignerProvider + Sized, - FE::Target: FeeEstimator, { kv_store: K, async_completed_updates: Mutex>, @@ -822,13 +823,12 @@ impl< ES: EntropySource, SP: Deref, BI: BroadcasterInterface, - FE: Deref, + FE: FeeEstimator, > MonitorUpdatingPersisterAsync where K::Target: KVStore, L::Target: Logger, SP::Target: SignerProvider + Sized, - FE::Target: FeeEstimator, { /// Constructs a new [`MonitorUpdatingPersisterAsync`]. /// @@ -971,13 +971,12 @@ impl< ES: EntropySource + MaybeSend + MaybeSync + 'static, SP: Deref + MaybeSend + MaybeSync + 'static, BI: BroadcasterInterface + MaybeSend + MaybeSync + 'static, - FE: Deref + MaybeSend + MaybeSync + 'static, + FE: FeeEstimator + MaybeSend + MaybeSync + 'static, > MonitorUpdatingPersisterAsync where K::Target: KVStore + MaybeSync, L::Target: Logger, SP::Target: SignerProvider + Sized, - FE::Target: FeeEstimator, ::EcdsaSigner: MaybeSend + 'static, { pub(crate) fn spawn_async_persist_new_channel( @@ -1061,13 +1060,12 @@ impl< ES: EntropySource, SP: Deref, BI: BroadcasterInterface, - FE: Deref, + FE: FeeEstimator, > MonitorUpdatingPersisterAsyncInner where K::Target: KVStore, L::Target: Logger, SP::Target: SignerProvider + Sized, - FE::Target: FeeEstimator, { pub async fn read_channel_monitor_with_updates( &self, monitor_key: &str, diff --git a/lightning/src/util/sweep.rs b/lightning/src/util/sweep.rs index 6b3ce10edb2..a4088331f68 100644 --- a/lightning/src/util/sweep.rs +++ b/lightning/src/util/sweep.rs @@ -340,14 +340,13 @@ impl_writeable_tlv_based_enum!(OutputSpendStatus, pub struct OutputSweeper< B: BroadcasterInterface, D: Deref, - E: Deref, + E: FeeEstimator, F: Deref, K: Deref, L: Deref, O: Deref, > where D::Target: ChangeDestinationSource, - E::Target: FeeEstimator, F::Target: Filter, K::Target: KVStore, L::Target: Logger, @@ -364,11 +363,17 @@ pub struct OutputSweeper< logger: L, } -impl - OutputSweeper +impl< + B: BroadcasterInterface, + D: Deref, + E: FeeEstimator, + F: Deref, + K: Deref, + L: Deref, + O: Deref, + > OutputSweeper where D::Target: ChangeDestinationSource, - E::Target: FeeEstimator, F::Target: Filter, K::Target: KVStore, L::Target: Logger, @@ -715,11 +720,17 @@ where } } -impl Listen - for OutputSweeper +impl< + B: BroadcasterInterface, + D: Deref, + E: FeeEstimator, + F: Deref, + K: Deref, + L: Deref, + O: Deref, + > Listen for OutputSweeper where D::Target: ChangeDestinationSource, - E::Target: FeeEstimator, F::Target: Filter + Sync + Send, K::Target: KVStore, L::Target: Logger, @@ -755,11 +766,17 @@ where } } -impl Confirm - for OutputSweeper +impl< + B: BroadcasterInterface, + D: Deref, + E: FeeEstimator, + F: Deref, + K: Deref, + L: Deref, + O: Deref, + > Confirm for OutputSweeper where D::Target: ChangeDestinationSource, - E::Target: FeeEstimator, F::Target: Filter + Sync + Send, K::Target: KVStore, L::Target: Logger, @@ -851,11 +868,17 @@ pub enum SpendingDelay { }, } -impl - ReadableArgs<(B, E, Option, O, D, K, L)> for (BestBlock, OutputSweeper) +impl< + B: BroadcasterInterface, + D: Deref, + E: FeeEstimator, + F: Deref, + K: Deref, + L: Deref, + O: Deref, + > ReadableArgs<(B, E, Option, O, D, K, L)> for (BestBlock, OutputSweeper) where D::Target: ChangeDestinationSource, - E::Target: FeeEstimator, F::Target: Filter + Sync + Send, K::Target: KVStore, L::Target: Logger, @@ -923,14 +946,13 @@ where pub struct OutputSweeperSync< B: BroadcasterInterface, D: Deref, - E: Deref, + E: FeeEstimator, F: Deref, K: Deref, L: Deref, O: Deref, > where D::Target: ChangeDestinationSourceSync, - E::Target: FeeEstimator, F::Target: Filter, K::Target: KVStoreSync, L::Target: Logger, @@ -940,11 +962,17 @@ pub struct OutputSweeperSync< OutputSweeper, E, F, KVStoreSyncWrapper, L, O>, } -impl - OutputSweeperSync +impl< + B: BroadcasterInterface, + D: Deref, + E: FeeEstimator, + F: Deref, + K: Deref, + L: Deref, + O: Deref, + > OutputSweeperSync where D::Target: ChangeDestinationSourceSync, - E::Target: FeeEstimator, F::Target: Filter, K::Target: KVStoreSync, L::Target: Logger, @@ -1059,11 +1087,17 @@ where } } -impl Listen - for OutputSweeperSync +impl< + B: BroadcasterInterface, + D: Deref, + E: FeeEstimator, + F: Deref, + K: Deref, + L: Deref, + O: Deref, + > Listen for OutputSweeperSync where D::Target: ChangeDestinationSourceSync, - E::Target: FeeEstimator, F::Target: Filter + Sync + Send, K::Target: KVStoreSync, L::Target: Logger, @@ -1080,11 +1114,17 @@ where } } -impl Confirm - for OutputSweeperSync +impl< + B: BroadcasterInterface, + D: Deref, + E: FeeEstimator, + F: Deref, + K: Deref, + L: Deref, + O: Deref, + > Confirm for OutputSweeperSync where D::Target: ChangeDestinationSourceSync, - E::Target: FeeEstimator, F::Target: Filter + Sync + Send, K::Target: KVStoreSync, L::Target: Logger, @@ -1109,11 +1149,18 @@ where } } -impl - ReadableArgs<(B, E, Option, O, D, K, L)> for (BestBlock, OutputSweeperSync) +impl< + B: BroadcasterInterface, + D: Deref, + E: FeeEstimator, + F: Deref, + K: Deref, + L: Deref, + O: Deref, + > ReadableArgs<(B, E, Option, O, D, K, L)> + for (BestBlock, OutputSweeperSync) where D::Target: ChangeDestinationSourceSync, - E::Target: FeeEstimator, F::Target: Filter + Sync + Send, K::Target: KVStoreSync, L::Target: Logger, From 989fa2e431ea651fc88fc0bbbcee83ca5f8c442c Mon Sep 17 00:00:00 2001 From: Valentine Wallace Date: Wed, 14 Jan 2026 18:46:38 -0500 Subject: [PATCH 06/17] Drop Deref indirection for Router Reduces generics and verbosity across the codebase, should provide equivalent behavior. Co-Authored-By: Claude Opus 4.5 --- lightning/src/ln/channelmanager.rs | 70 ++++++++--------------- lightning/src/ln/functional_test_utils.rs | 4 +- lightning/src/ln/outbound_payment.rs | 33 ++++------- lightning/src/offers/flow.rs | 59 ++++++------------- lightning/src/routing/router.rs | 39 +++++++++++++ 5 files changed, 94 insertions(+), 111 deletions(-) diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs index 99c52f16618..c6208fd9d12 100644 --- a/lightning/src/ln/channelmanager.rs +++ b/lightning/src/ln/channelmanager.rs @@ -1790,9 +1790,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; + type Router: Router; /// A type implementing [`MessageRouter`]. type MessageRouter: MessageRouter + ?Sized; /// A type that may be dereferenced to [`Self::MessageRouter`]. @@ -1811,7 +1809,7 @@ pub trait AChannelManager { Self::NodeSigner, Self::SP, Self::FeeEstimator, - Self::R, + Self::Router, Self::MR, Self::L, >; @@ -1824,14 +1822,13 @@ impl< NS: NodeSigner, SP: Deref, F: FeeEstimator, - R: Deref, + R: Router, MR: Deref, L: Deref, > AChannelManager for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, { @@ -1844,8 +1841,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; @@ -2641,13 +2637,12 @@ pub struct ChannelManager< NS: NodeSigner, SP: Deref, F: FeeEstimator, - R: Deref, + R: Router, MR: Deref, L: Deref, > where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, { @@ -3713,14 +3708,13 @@ impl< NS: NodeSigner, SP: Deref, F: FeeEstimator, - R: Deref, + R: Router, MR: Deref, L: Deref, > ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, { @@ -5754,7 +5748,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, @@ -13184,14 +13178,13 @@ impl< NS: NodeSigner, SP: Deref, F: FeeEstimator, - R: Deref, + R: Router, MR: Deref, L: Deref, > ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, { @@ -14032,14 +14025,13 @@ impl< NS: NodeSigner, SP: Deref, F: FeeEstimator, - R: Deref, + R: Router, MR: Deref, L: Deref, > BaseMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, { @@ -14386,14 +14378,13 @@ impl< NS: NodeSigner, SP: Deref, F: FeeEstimator, - R: Deref, + R: Router, MR: Deref, L: Deref, > EventsProvider for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, { @@ -14417,14 +14408,13 @@ impl< NS: NodeSigner, SP: Deref, F: FeeEstimator, - R: Deref, + R: Router, MR: Deref, L: Deref, > chain::Listen for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, { @@ -14474,14 +14464,13 @@ impl< NS: NodeSigner, SP: Deref, F: FeeEstimator, - R: Deref, + R: Router, MR: Deref, L: Deref, > chain::Confirm for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, { @@ -14643,14 +14632,13 @@ impl< NS: NodeSigner, SP: Deref, F: FeeEstimator, - R: Deref, + R: Router, MR: Deref, L: Deref, > ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, { @@ -15001,14 +14989,13 @@ impl< NS: NodeSigner, SP: Deref, F: FeeEstimator, - R: Deref, + R: Router, MR: Deref, L: Deref, > ChannelMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, { @@ -15572,14 +15559,13 @@ impl< NS: NodeSigner, SP: Deref, F: FeeEstimator, - R: Deref, + R: Router, MR: Deref, L: Deref, > OffersMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, { @@ -15786,14 +15772,13 @@ impl< NS: NodeSigner, SP: Deref, F: FeeEstimator, - R: Deref, + R: Router, MR: Deref, L: Deref, > AsyncPaymentsMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, { @@ -15824,7 +15809,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, @@ -15984,14 +15969,13 @@ impl< NS: NodeSigner, SP: Deref, F: FeeEstimator, - R: Deref, + R: Router, MR: Deref, L: Deref, > DNSResolverMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, { @@ -16048,14 +16032,13 @@ impl< NS: NodeSigner, SP: Deref, F: FeeEstimator, - R: Deref, + R: Router, MR: Deref, L: Deref, > NodeIdLookUp for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, { @@ -16560,14 +16543,13 @@ impl< NS: NodeSigner, SP: Deref, F: FeeEstimator, - R: Deref, + R: Router, MR: Deref, L: Deref, > Writeable for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, { @@ -16923,13 +16905,12 @@ pub struct ChannelManagerReadArgs< NS: NodeSigner, SP: Deref, F: FeeEstimator, - R: Deref, + R: Router, MR: Deref, L: Deref + Clone, > where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, { @@ -16999,14 +16980,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<::EcdsaSigner>, SP::Target: SignerProvider, - R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, { @@ -17083,7 +17063,7 @@ impl< NS: NodeSigner, SP: Deref, F: FeeEstimator, - R: Deref, + R: Router, MR: Deref, L: Deref + Clone, > ReadableArgs> @@ -17091,7 +17071,6 @@ impl< where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - R::Target: Router, MR::Target: MessageRouter, L::Target: Logger, { @@ -17112,7 +17091,7 @@ impl< NS: NodeSigner, SP: Deref, F: FeeEstimator, - R: Deref, + R: Router, MR: Deref, L: Deref + Clone, > ReadableArgs> @@ -17120,7 +17099,6 @@ impl< where M::Target: chain::Watch<::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 120340686d4..cfc9f4317a2 100644 --- a/lightning/src/ln/functional_test_utils.rs +++ b/lightning/src/ln/functional_test_utils.rs @@ -737,7 +737,7 @@ pub trait NodeHolder { ::NodeSigner, ::SP, ::FeeEstimator, - ::R, + ::Router, ::MR, ::L, >; @@ -754,7 +754,7 @@ impl NodeHolder for &H { ::NodeSigner, ::SP, ::FeeEstimator, - ::R, + ::Router, ::MR, ::L, > { diff --git a/lightning/src/ln/outbound_payment.rs b/lightning/src/ln/outbound_payment.rs index ed99da29f6f..d660cd31cca 100644 --- a/lightning/src/ln/outbound_payment.rs +++ b/lightning/src/ln/outbound_payment.rs @@ -872,7 +872,7 @@ where } #[rustfmt::skip] - pub(super) fn send_payment( + pub(super) fn send_payment( &self, payment_hash: PaymentHash, recipient_onion: RecipientOnionFields, payment_id: PaymentId, retry_strategy: Retry, route_params: RouteParameters, router: &R, first_hops: Vec, compute_inflight_htlcs: IH, entropy_source: &ES, @@ -880,7 +880,6 @@ where pending_events: &Mutex)>>, send_payment_along_path: SP, ) -> Result<(), RetryableSendFailure> where - R::Target: Router, IH: Fn() -> InFlightHtlcs, SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, { @@ -890,7 +889,7 @@ where } #[rustfmt::skip] - pub(super) fn send_spontaneous_payment( + pub(super) fn send_spontaneous_payment( &self, payment_preimage: Option, recipient_onion: RecipientOnionFields, payment_id: PaymentId, retry_strategy: Retry, route_params: RouteParameters, router: &R, first_hops: Vec, inflight_htlcs: IH, entropy_source: &ES, @@ -898,7 +897,6 @@ where pending_events: &Mutex)>>, send_payment_along_path: SP ) -> Result where - R::Target: Router, IH: Fn() -> InFlightHtlcs, SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, { @@ -912,7 +910,7 @@ where } #[rustfmt::skip] - pub(super) fn pay_for_bolt11_invoice( + pub(super) fn pay_for_bolt11_invoice( &self, invoice: &Bolt11Invoice, payment_id: PaymentId, amount_msats: Option, route_params_config: RouteParametersConfig, @@ -923,7 +921,6 @@ where pending_events: &Mutex)>>, send_payment_along_path: SP, ) -> Result<(), Bolt11PaymentError> where - R::Target: Router, IH: Fn() -> InFlightHtlcs, SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, { @@ -957,7 +954,7 @@ where #[rustfmt::skip] pub(super) fn send_payment_for_bolt12_invoice< - R: Deref, ES: EntropySource, NS: NodeSigner, NL: Deref, IH, SP + R: Router, ES: EntropySource, NS: NodeSigner, NL: Deref, IH, SP >( &self, invoice: &Bolt12Invoice, payment_id: PaymentId, router: &R, first_hops: Vec, features: Bolt12InvoiceFeatures, inflight_htlcs: IH, @@ -967,7 +964,6 @@ where send_payment_along_path: SP, ) -> Result<(), Bolt12PaymentError> where - R::Target: Router, NL::Target: NodeIdLookUp, IH: Fn() -> InFlightHtlcs, SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, @@ -1000,7 +996,7 @@ where #[rustfmt::skip] fn send_payment_for_bolt12_invoice_internal< - R: Deref, ES: EntropySource, NS: NodeSigner, NL: Deref, IH, SP + R: Router, ES: EntropySource, NS: NodeSigner, NL: Deref, IH, SP >( &self, payment_id: PaymentId, payment_hash: PaymentHash, keysend_preimage: Option, invoice_request: Option<&InvoiceRequest>, @@ -1012,7 +1008,6 @@ where send_payment_along_path: SP, ) -> Result<(), Bolt12PaymentError> where - R::Target: Router, NL::Target: NodeIdLookUp, IH: Fn() -> InFlightHtlcs, SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, @@ -1212,7 +1207,7 @@ where } pub(super) fn send_payment_for_static_invoice< - R: Deref, + R: Router, ES: EntropySource, NS: NodeSigner, NL: Deref, @@ -1226,7 +1221,6 @@ where send_payment_along_path: SP, ) -> Result<(), Bolt12PaymentError> where - R::Target: Router, NL::Target: NodeIdLookUp, IH: Fn() -> InFlightHtlcs, SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, @@ -1292,14 +1286,13 @@ where } // Returns whether the data changed and needs to be repersisted. - pub(super) fn check_retry_payments( + pub(super) fn check_retry_payments( &self, router: &R, first_hops: FH, inflight_htlcs: IH, entropy_source: &ES, node_signer: &NS, best_block_height: u32, pending_events: &Mutex)>>, send_payment_along_path: SP, ) -> bool where - R::Target: Router, SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, IH: Fn() -> InFlightHtlcs, FH: Fn() -> Vec, @@ -1397,14 +1390,13 @@ where } #[rustfmt::skip] - fn find_initial_route( + fn find_initial_route( &self, payment_id: PaymentId, payment_hash: PaymentHash, recipient_onion: &RecipientOnionFields, keysend_preimage: Option, invoice_request: Option<&InvoiceRequest>, route_params: &mut RouteParameters, router: &R, first_hops: &Vec, inflight_htlcs: &IH, node_signer: &NS, best_block_height: u32, ) -> Result where - R::Target: Router, L::Target: Logger, IH: Fn() -> InFlightHtlcs, { @@ -1451,7 +1443,7 @@ where /// [`Event::PaymentPathFailed`]: crate::events::Event::PaymentPathFailed /// [`Event::PaymentFailed`]: crate::events::Event::PaymentFailed #[rustfmt::skip] - fn send_payment_for_non_bolt12_invoice( + fn send_payment_for_non_bolt12_invoice( &self, payment_id: PaymentId, payment_hash: PaymentHash, recipient_onion: RecipientOnionFields, keysend_preimage: Option, retry_strategy: Retry, mut route_params: RouteParameters, router: &R, first_hops: Vec, inflight_htlcs: IH, entropy_source: &ES, @@ -1459,7 +1451,6 @@ where pending_events: &Mutex)>>, send_payment_along_path: SP, ) -> Result<(), RetryableSendFailure> where - R::Target: Router, L::Target: Logger, IH: Fn() -> InFlightHtlcs, SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, @@ -1494,14 +1485,13 @@ where } #[rustfmt::skip] - fn find_route_and_send_payment( + fn find_route_and_send_payment( &self, payment_hash: PaymentHash, payment_id: PaymentId, route_params: RouteParameters, router: &R, first_hops: Vec, inflight_htlcs: &IH, entropy_source: &ES, node_signer: &NS, best_block_height: u32, pending_events: &Mutex)>>, send_payment_along_path: &SP, ) where - R::Target: Router, L::Target: Logger, IH: Fn() -> InFlightHtlcs, SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, @@ -1653,7 +1643,7 @@ where } #[rustfmt::skip] - fn handle_pay_route_err( + fn handle_pay_route_err( &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, inflight_htlcs: &IH, entropy_source: &ES, node_signer: &NS, @@ -1662,7 +1652,6 @@ where send_payment_along_path: &SP, ) where - R::Target: Router, IH: Fn() -> InFlightHtlcs, SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, { diff --git a/lightning/src/offers/flow.rs b/lightning/src/offers/flow.rs index 97e92fdaec5..e22f97cf2d3 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( + fn create_blinded_payment_paths( &self, router: &R, usable_channels: Vec, amount_msats: Option, payment_secret: PaymentSecret, payment_context: PaymentContext, relative_expiry_seconds: u32, - ) -> Result, ()> - where - R::Target: Router, - { + ) -> Result, ()> { 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( + pub(crate) fn test_create_blinded_payment_paths( &self, router: &R, usable_channels: Vec, amount_msats: Option, payment_secret: PaymentSecret, payment_context: PaymentContext, relative_expiry_seconds: u32, - ) -> Result, ()> - where - R::Target: Router, - { + ) -> Result, ()> { 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, peers: Vec, - ) -> Result, Bolt12SemanticError> - where - R::Target: Router, - { + ) -> Result, 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, get_payment_info: F, ) -> Result, 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, usable_channels: Vec, 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, usable_channels: Vec, 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( + pub fn check_refresh_async_receive_offer_cache( &self, peers: Vec, usable_channels: Vec, 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( + fn check_refresh_static_invoices( &self, peers: Vec, usable_channels: Vec, 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( + pub fn handle_offer_paths( &self, message: OfferPaths, context: AsyncPaymentsContext, responder: Responder, peers: Vec, usable_channels: Vec, 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( + fn create_static_invoice_for_server( &self, offer: &Offer, offer_nonce: Nonce, peers: Vec, usable_channels: Vec, 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 2c1c401dcfd..e771baf183a 100644 --- a/lightning/src/routing/router.rs +++ b/lightning/src/routing/router.rs @@ -289,6 +289,45 @@ pub trait Router { ) -> Result, ()>; } +impl> Router for R { + fn find_route( + &self, payer: &PublicKey, route_params: &RouteParameters, + first_hops: Option<&[&ChannelDetails]>, inflight_htlcs: InFlightHtlcs, + ) -> Result { + 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 { + self.deref().find_route_with_id( + payer, + route_params, + first_hops, + inflight_htlcs, + payment_hash, + payment_id, + ) + } + + fn create_blinded_payment_paths( + &self, recipient: PublicKey, local_node_receive_key: ReceiveAuthKey, + first_hops: Vec, tlvs: ReceiveTlvs, amount_msats: Option, + secp_ctx: &Secp256k1, + ) -> Result, ()> { + 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 From cdb591001a54dad5c6dd50a5bf0fa6fce479cb37 Mon Sep 17 00:00:00 2001 From: Valentine Wallace Date: Wed, 14 Jan 2026 19:17:23 -0500 Subject: [PATCH 07/17] Drop Deref indirection for MessageRouter Reduces generics and verbosity across the codebase, should provide equivalent behavior. Co-Authored-By: Claude Opus 4.5 --- lightning-background-processor/src/lib.rs | 3 +- lightning-dns-resolver/src/lib.rs | 6 -- lightning/src/ln/channelmanager.rs | 80 ++++++++--------------- lightning/src/ln/functional_test_utils.rs | 4 +- lightning/src/offers/flow.rs | 26 +++----- lightning/src/onion_message/messenger.rs | 48 +++++++++----- 6 files changed, 67 insertions(+), 100 deletions(-) diff --git a/lightning-background-processor/src/lib.rs b/lightning-background-processor/src/lib.rs index 941de6b3cee..3255d26328f 100644 --- a/lightning-background-processor/src/lib.rs +++ b/lightning-background-processor/src/lib.rs @@ -426,8 +426,7 @@ pub const NO_ONION_MESSENGER: Option< L = &'static (dyn Logger + Send + Sync), NodeIdLookUp = DynChannelManager, NL = &'static DynChannelManager, - MessageRouter = DynMessageRouter, - MR = &'static DynMessageRouter, + MessageRouter = &'static DynMessageRouter, OffersMessageHandler = lightning::ln::peer_handler::IgnoringMessageHandler, OMH = &'static lightning::ln::peer_handler::IgnoringMessageHandler, AsyncPaymentsMessageHandler = lightning::ln::peer_handler::IgnoringMessageHandler, diff --git a/lightning-dns-resolver/src/lib.rs b/lightning-dns-resolver/src/lib.rs index 3c1c51b1fcf..469370f10d5 100644 --- a/lightning-dns-resolver/src/lib.rs +++ b/lightning-dns-resolver/src/lib.rs @@ -242,12 +242,6 @@ mod test { )]) } } - impl Deref for DirectlyConnectedRouter { - type Target = DirectlyConnectedRouter; - fn deref(&self) -> &DirectlyConnectedRouter { - self - } - } struct URIResolver { resolved_uri: Mutex>, diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs index c6208fd9d12..aabeb159849 100644 --- a/lightning/src/ln/channelmanager.rs +++ b/lightning/src/ln/channelmanager.rs @@ -1792,9 +1792,7 @@ pub trait AChannelManager { /// A type implementing [`Router`]. type Router: Router; /// A type implementing [`MessageRouter`]. - type MessageRouter: MessageRouter + ?Sized; - /// A type that may be dereferenced to [`Self::MessageRouter`]. - type MR: Deref; + type MessageRouter: MessageRouter; /// A type implementing [`Logger`]. type Logger: Logger + ?Sized; /// A type that may be dereferenced to [`Self::Logger`]. @@ -1810,7 +1808,7 @@ pub trait AChannelManager { Self::SP, Self::FeeEstimator, Self::Router, - Self::MR, + Self::MessageRouter, Self::L, >; } @@ -1823,13 +1821,12 @@ impl< SP: Deref, F: FeeEstimator, R: Router, - MR: Deref, + MR: MessageRouter, L: Deref, > AChannelManager for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - MR::Target: MessageRouter, L::Target: Logger, { type Watch = M::Target; @@ -1842,8 +1839,7 @@ where type SP = SP; type FeeEstimator = F; type Router = R; - type MessageRouter = MR::Target; - type MR = MR; + type MessageRouter = MR; type Logger = L::Target; type L = L; fn get_cm(&self) -> &ChannelManager { @@ -2638,12 +2634,11 @@ pub struct ChannelManager< SP: Deref, F: FeeEstimator, R: Router, - MR: Deref, + MR: MessageRouter, L: Deref, > where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - MR::Target: MessageRouter, L::Target: Logger, { config: RwLock, @@ -3709,13 +3704,12 @@ impl< SP: Deref, F: FeeEstimator, R: Router, - MR: Deref, + MR: MessageRouter, L: Deref, > ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - MR::Target: MessageRouter, L::Target: Logger, { /// Constructs a new `ChannelManager` to hold several channels and route between them. @@ -13047,13 +13041,10 @@ macro_rules! create_offer_builder { ($self: ident, $builder: ty) => { /// [`BlindedMessagePath`]: crate::blinded_path::message::BlindedMessagePath /// [`Offer`]: crate::offers::offer::Offer /// [`InvoiceRequest`]: crate::offers::invoice_request::InvoiceRequest - pub fn create_offer_builder_using_router( + pub fn create_offer_builder_using_router( &$self, router: ME, - ) -> Result<$builder, Bolt12SemanticError> - where - ME::Target: MessageRouter, - { + ) -> Result<$builder, Bolt12SemanticError> { let builder = $self.flow.create_offer_builder_using_router( router, &$self.entropy_source, $self.get_peers_for_blinded_path() )?; @@ -13144,13 +13135,10 @@ macro_rules! create_refund_builder { ($self: ident, $builder: ty) => { /// [`Refund`]: crate::offers::refund::Refund /// [`BlindedMessagePath`]: crate::blinded_path::message::BlindedMessagePath /// [`Bolt12Invoice`]: crate::offers::invoice::Bolt12Invoice - pub fn create_refund_builder_using_router( + pub fn create_refund_builder_using_router( &$self, router: ME, amount_msats: u64, absolute_expiry: Duration, payment_id: PaymentId, retry_strategy: Retry, route_params_config: RouteParametersConfig - ) -> Result<$builder, Bolt12SemanticError> - where - ME::Target: MessageRouter, - { + ) -> Result<$builder, Bolt12SemanticError> { let entropy = &$self.entropy_source; let builder = $self.flow.create_refund_builder_using_router( @@ -13179,13 +13167,12 @@ impl< SP: Deref, F: FeeEstimator, R: Router, - MR: Deref, + MR: MessageRouter, L: Deref, > ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - MR::Target: MessageRouter, L::Target: Logger, { #[cfg(not(c_bindings))] @@ -14026,13 +14013,12 @@ impl< SP: Deref, F: FeeEstimator, R: Router, - MR: Deref, + MR: MessageRouter, L: Deref, > BaseMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - MR::Target: MessageRouter, L::Target: Logger, { fn provided_node_features(&self) -> NodeFeatures { @@ -14379,13 +14365,12 @@ impl< SP: Deref, F: FeeEstimator, R: Router, - MR: Deref, + MR: MessageRouter, L: Deref, > EventsProvider for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - MR::Target: MessageRouter, L::Target: Logger, { /// Processes events that must be periodically handled. @@ -14409,13 +14394,12 @@ impl< SP: Deref, F: FeeEstimator, R: Router, - MR: Deref, + MR: MessageRouter, L: Deref, > chain::Listen for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - MR::Target: MessageRouter, L::Target: Logger, { fn filtered_block_connected(&self, header: &Header, txdata: &TransactionData, height: u32) { @@ -14465,13 +14449,12 @@ impl< SP: Deref, F: FeeEstimator, R: Router, - MR: Deref, + MR: MessageRouter, L: Deref, > chain::Confirm for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - MR::Target: MessageRouter, L::Target: Logger, { #[rustfmt::skip] @@ -14633,13 +14616,12 @@ impl< SP: Deref, F: FeeEstimator, R: Router, - MR: Deref, + MR: MessageRouter, L: Deref, > ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - MR::Target: MessageRouter, L::Target: Logger, { /// Calls a function which handles an on-chain event (blocks dis/connected, transactions @@ -14990,13 +14972,12 @@ impl< SP: Deref, F: FeeEstimator, R: Router, - MR: Deref, + MR: MessageRouter, L: Deref, > ChannelMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - MR::Target: MessageRouter, L::Target: Logger, { fn handle_open_channel(&self, counterparty_node_id: PublicKey, message: &msgs::OpenChannel) { @@ -15560,13 +15541,12 @@ impl< SP: Deref, F: FeeEstimator, R: Router, - MR: Deref, + MR: MessageRouter, L: Deref, > OffersMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - MR::Target: MessageRouter, L::Target: Logger, { #[rustfmt::skip] @@ -15773,13 +15753,12 @@ impl< SP: Deref, F: FeeEstimator, R: Router, - MR: Deref, + MR: MessageRouter, L: Deref, > AsyncPaymentsMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - MR::Target: MessageRouter, L::Target: Logger, { fn handle_offer_paths_request( @@ -15970,13 +15949,12 @@ impl< SP: Deref, F: FeeEstimator, R: Router, - MR: Deref, + MR: MessageRouter, L: Deref, > DNSResolverMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - MR::Target: MessageRouter, L::Target: Logger, { fn handle_dnssec_query( @@ -16033,13 +16011,12 @@ impl< SP: Deref, F: FeeEstimator, R: Router, - MR: Deref, + MR: MessageRouter, L: Deref, > NodeIdLookUp for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - MR::Target: MessageRouter, L::Target: Logger, { fn next_node_id(&self, short_channel_id: u64) -> Option { @@ -16544,13 +16521,12 @@ impl< SP: Deref, F: FeeEstimator, R: Router, - MR: Deref, + MR: MessageRouter, L: Deref, > Writeable for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - MR::Target: MessageRouter, L::Target: Logger, { #[rustfmt::skip] @@ -16906,12 +16882,11 @@ pub struct ChannelManagerReadArgs< SP: Deref, F: FeeEstimator, R: Router, - MR: Deref, + MR: MessageRouter, L: Deref + Clone, > where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - MR::Target: MessageRouter, L::Target: Logger, { /// A cryptographically secure source of entropy. @@ -16981,13 +16956,12 @@ impl< SP: Deref, F: FeeEstimator, R: Router, - MR: Deref, + MR: MessageRouter, L: Deref + Clone, > ChannelManagerReadArgs<'a, M, T, ES, NS, SP, F, R, MR, L> where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - MR::Target: MessageRouter, L::Target: Logger, { /// Simple utility function to create a ChannelManagerReadArgs which creates the monitor @@ -17064,14 +17038,13 @@ impl< SP: Deref, F: FeeEstimator, R: Router, - MR: Deref, + MR: MessageRouter, L: Deref + Clone, > ReadableArgs> for (BlockHash, Arc>) where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - MR::Target: MessageRouter, L::Target: Logger, { fn read( @@ -17092,14 +17065,13 @@ impl< SP: Deref, F: FeeEstimator, R: Router, - MR: Deref, + MR: MessageRouter, L: Deref + Clone, > ReadableArgs> for (BlockHash, ChannelManager) where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - MR::Target: MessageRouter, L::Target: Logger, { fn read( diff --git a/lightning/src/ln/functional_test_utils.rs b/lightning/src/ln/functional_test_utils.rs index cfc9f4317a2..28acfbaf4e1 100644 --- a/lightning/src/ln/functional_test_utils.rs +++ b/lightning/src/ln/functional_test_utils.rs @@ -738,7 +738,7 @@ pub trait NodeHolder { ::SP, ::FeeEstimator, ::Router, - ::MR, + ::MessageRouter, ::L, >; fn chain_monitor(&self) -> Option<&test_utils::TestChainMonitor<'_>>; @@ -755,7 +755,7 @@ impl NodeHolder for &H { ::SP, ::FeeEstimator, ::Router, - ::MR, + ::MessageRouter, ::L, > { (*self).node() diff --git a/lightning/src/offers/flow.rs b/lightning/src/offers/flow.rs index e22f97cf2d3..3ee57c56c8f 100644 --- a/lightning/src/offers/flow.rs +++ b/lightning/src/offers/flow.rs @@ -74,9 +74,8 @@ use { /// /// [`OffersMessageFlow`] is parameterized by a [`MessageRouter`], which is responsible /// for finding message paths when initiating and retrying onion messages. -pub struct OffersMessageFlow +pub struct OffersMessageFlow where - MR::Target: MessageRouter, L::Target: Logger, { chain_hash: ChainHash, @@ -107,9 +106,8 @@ where logger: L, } -impl OffersMessageFlow +impl OffersMessageFlow where - MR::Target: MessageRouter, L::Target: Logger, { /// Creates a new [`OffersMessageFlow`] @@ -266,9 +264,8 @@ const DEFAULT_ASYNC_RECEIVE_OFFER_EXPIRY: Duration = Duration::from_secs(365 * 2 pub(crate) const TEST_DEFAULT_ASYNC_RECEIVE_OFFER_EXPIRY: Duration = DEFAULT_ASYNC_RECEIVE_OFFER_EXPIRY; -impl OffersMessageFlow +impl OffersMessageFlow where - MR::Target: MessageRouter, L::Target: Logger, { /// [`BlindedMessagePath`]s for an async recipient to communicate with this node and interactively @@ -430,9 +427,8 @@ pub enum HeldHtlcReplyPath { }, } -impl OffersMessageFlow +impl OffersMessageFlow where - MR::Target: MessageRouter, L::Target: Logger, { /// Verifies an [`InvoiceRequest`] using the provided [`OffersContext`] or the [`InvoiceRequest::metadata`]. @@ -620,12 +616,9 @@ where /// This is not exported to bindings users as builder patterns don't map outside of move semantics. /// /// See [`Self::create_offer_builder`] for more details on usage. - pub fn create_offer_builder_using_router( + pub fn create_offer_builder_using_router( &self, router: ME, entropy_source: ES, peers: Vec, - ) -> Result, Bolt12SemanticError> - where - ME::Target: MessageRouter, - { + ) -> Result, Bolt12SemanticError> { let receive_key = self.get_receive_auth_key(); self.create_offer_builder_intern(&entropy_source, |node_id, context, secp_ctx| { router @@ -767,13 +760,10 @@ where /// [`Bolt12Invoice`]: crate::offers::invoice::Bolt12Invoice /// [`Event::PaymentFailed`]: crate::events::Event::PaymentFailed /// [`RouteParameters::from_payment_params_and_value`]: crate::routing::router::RouteParameters::from_payment_params_and_value - pub fn create_refund_builder_using_router( + pub fn create_refund_builder_using_router( &self, router: ME, entropy_source: ES, amount_msats: u64, absolute_expiry: Duration, payment_id: PaymentId, peers: Vec, - ) -> Result, Bolt12SemanticError> - where - ME::Target: MessageRouter, - { + ) -> Result, Bolt12SemanticError> { let receive_key = self.get_receive_auth_key(); self.create_refund_builder_intern( &entropy_source, diff --git a/lightning/src/onion_message/messenger.rs b/lightning/src/onion_message/messenger.rs index 5f4b703618b..525d3a72fee 100644 --- a/lightning/src/onion_message/messenger.rs +++ b/lightning/src/onion_message/messenger.rs @@ -78,9 +78,7 @@ pub trait AOnionMessenger { /// A type that may be dereferenced to [`Self::NodeIdLookUp`] type NL: Deref; /// A type implementing [`MessageRouter`] - type MessageRouter: MessageRouter + ?Sized; - /// A type that may be dereferenced to [`Self::MessageRouter`] - type MR: Deref; + type MessageRouter: MessageRouter; /// A type implementing [`OffersMessageHandler`] type OffersMessageHandler: OffersMessageHandler + ?Sized; /// A type that may be dereferenced to [`Self::OffersMessageHandler`] @@ -105,7 +103,7 @@ pub trait AOnionMessenger { Self::NodeSigner, Self::L, Self::NL, - Self::MR, + Self::MessageRouter, Self::OMH, Self::APH, Self::DRH, @@ -118,7 +116,7 @@ impl< NS: NodeSigner, L: Deref, NL: Deref, - MR: Deref, + MR: MessageRouter, OMH: Deref, APH: Deref, DRH: Deref, @@ -127,7 +125,6 @@ impl< where L::Target: Logger, NL::Target: NodeIdLookUp, - MR::Target: MessageRouter, OMH::Target: OffersMessageHandler, APH::Target: AsyncPaymentsMessageHandler, DRH::Target: DNSResolverMessageHandler, @@ -139,8 +136,7 @@ where type L = L; type NodeIdLookUp = NL::Target; type NL = NL; - type MessageRouter = MR::Target; - type MR = MR; + type MessageRouter = MR; type OffersMessageHandler = OMH::Target; type OMH = OMH; type AsyncPaymentsMessageHandler = APH::Target; @@ -280,7 +276,7 @@ pub struct OnionMessenger< NS: NodeSigner, L: Deref, NL: Deref, - MR: Deref, + MR: MessageRouter, OMH: Deref, APH: Deref, DRH: Deref, @@ -288,7 +284,6 @@ pub struct OnionMessenger< > where L::Target: Logger, NL::Target: NodeIdLookUp, - MR::Target: MessageRouter, OMH::Target: OffersMessageHandler, APH::Target: AsyncPaymentsMessageHandler, DRH::Target: DNSResolverMessageHandler, @@ -512,6 +507,27 @@ pub trait MessageRouter { ) -> Result, ()>; } +impl> MessageRouter for R { + fn find_path( + &self, sender: PublicKey, peers: Vec, destination: Destination, + ) -> Result { + self.deref().find_path(sender, peers, destination) + } + + fn create_blinded_paths( + &self, recipient: PublicKey, local_node_receive_key: ReceiveAuthKey, + context: MessageContext, peers: Vec, secp_ctx: &Secp256k1, + ) -> Result, ()> { + self.deref().create_blinded_paths( + recipient, + local_node_receive_key, + context, + peers, + secp_ctx, + ) + } +} + /// A [`MessageRouter`] that can only route to a directly connected [`Destination`]. /// /// [`DefaultMessageRouter`] tries to construct compact or private [`BlindedMessagePath`]s based on @@ -1377,7 +1393,7 @@ impl< NS: NodeSigner, L: Deref, NL: Deref, - MR: Deref, + MR: MessageRouter, OMH: Deref, APH: Deref, DRH: Deref, @@ -1386,7 +1402,6 @@ impl< where L::Target: Logger, NL::Target: NodeIdLookUp, - MR::Target: MessageRouter, OMH::Target: OffersMessageHandler, APH::Target: AsyncPaymentsMessageHandler, DRH::Target: DNSResolverMessageHandler, @@ -2019,7 +2034,7 @@ impl< NS: NodeSigner, L: Deref, NL: Deref, - MR: Deref, + MR: MessageRouter, OMH: Deref, APH: Deref, DRH: Deref, @@ -2028,7 +2043,6 @@ impl< where L::Target: Logger, NL::Target: NodeIdLookUp, - MR::Target: MessageRouter, OMH::Target: OffersMessageHandler, APH::Target: AsyncPaymentsMessageHandler, DRH::Target: DNSResolverMessageHandler, @@ -2138,7 +2152,7 @@ impl< NS: NodeSigner, L: Deref, NL: Deref, - MR: Deref, + MR: MessageRouter, OMH: Deref, APH: Deref, DRH: Deref, @@ -2147,7 +2161,6 @@ impl< where L::Target: Logger, NL::Target: NodeIdLookUp, - MR::Target: MessageRouter, OMH::Target: OffersMessageHandler, APH::Target: AsyncPaymentsMessageHandler, DRH::Target: DNSResolverMessageHandler, @@ -2208,7 +2221,7 @@ impl< NS: NodeSigner, L: Deref, NL: Deref, - MR: Deref, + MR: MessageRouter, OMH: Deref, APH: Deref, DRH: Deref, @@ -2217,7 +2230,6 @@ impl< where L::Target: Logger, NL::Target: NodeIdLookUp, - MR::Target: MessageRouter, OMH::Target: OffersMessageHandler, APH::Target: AsyncPaymentsMessageHandler, DRH::Target: DNSResolverMessageHandler, From c5a77b096e75d29bb749bfb80e0e646ef08f3fe8 Mon Sep 17 00:00:00 2001 From: Valentine Wallace Date: Thu, 15 Jan 2026 12:13:22 -0500 Subject: [PATCH 08/17] Drop Deref indirection for Logger Reduces generics and verbosity across the codebase, should provide equivalent behavior. Co-Authored-By: Claude Opus 4.5 --- lightning-background-processor/src/lib.rs | 33 +- lightning-dns-resolver/src/lib.rs | 6 - lightning-rapid-gossip-sync/src/lib.rs | 10 +- lightning-rapid-gossip-sync/src/processing.rs | 5 +- lightning-transaction-sync/src/electrum.rs | 15 +- lightning-transaction-sync/src/esplora.rs | 15 +- lightning/src/chain/chainmonitor.rs | 36 +- lightning/src/chain/channelmonitor.rs | 209 +++--- lightning/src/events/bump_transaction/mod.rs | 15 +- lightning/src/events/bump_transaction/sync.rs | 15 +- lightning/src/ln/channel.rs | 594 ++++++------------ lightning/src/ln/channelmanager.rs | 82 +-- lightning/src/ln/functional_test_utils.rs | 4 +- lightning/src/ln/inbound_payment.rs | 9 +- lightning/src/ln/invoice_utils.rs | 55 +- lightning/src/ln/onion_payment.rs | 16 +- lightning/src/ln/onion_utils.rs | 29 +- lightning/src/ln/outbound_payment.rs | 13 +- lightning/src/ln/peer_handler.rs | 23 +- lightning/src/offers/flow.rs | 21 +- lightning/src/onion_message/messenger.rs | 62 +- lightning/src/routing/gossip.rs | 49 +- lightning/src/routing/router.rs | 35 +- lightning/src/routing/scoring.rs | 71 +-- lightning/src/routing/utxo.rs | 13 +- lightning/src/sign/tx_builder.rs | 14 +- lightning/src/util/anchor_channel_reserves.rs | 5 +- lightning/src/util/logger.rs | 21 +- lightning/src/util/persist.rs | 24 +- lightning/src/util/sweep.rs | 30 +- 30 files changed, 475 insertions(+), 1054 deletions(-) diff --git a/lightning-background-processor/src/lib.rs b/lightning-background-processor/src/lib.rs index 3255d26328f..79a3b95463e 100644 --- a/lightning-background-processor/src/lib.rs +++ b/lightning-background-processor/src/lib.rs @@ -201,10 +201,9 @@ pub enum GossipSync< R: Deref>, G: Deref>, U: Deref, - L: Deref, + L: Logger, > where U::Target: UtxoLookup, - L::Target: Logger, { /// Gossip sync via the lightning peer-to-peer network as defined by BOLT 7. P2P(P), @@ -219,11 +218,10 @@ impl< R: Deref>, G: Deref>, U: Deref, - L: Deref, + L: Logger, > GossipSync where U::Target: UtxoLookup, - L::Target: Logger, { fn network_graph(&self) -> Option<&G> { match self { @@ -261,11 +259,10 @@ impl< P: Deref>, G: Deref>, U: Deref, - L: Deref, + L: Logger, > GossipSync, G, U, L> where U::Target: UtxoLookup, - L::Target: Logger, { /// Initializes a new [`GossipSync::P2P`] variant. pub fn p2p(gossip_sync: P) -> Self { @@ -278,7 +275,7 @@ impl< 'a, R: Deref>, G: Deref>, - L: Deref, + L: Logger, > GossipSync< &P2PGossipSync, @@ -286,8 +283,7 @@ impl< G, &'a (dyn UtxoLookup + Send + Sync), L, - > where - L::Target: Logger, + > { /// Initializes a new [`GossipSync::Rapid`] variant. pub fn rapid(gossip_sync: R) -> Self { @@ -296,15 +292,14 @@ impl< } /// This is not exported to bindings users as the bindings concretize everything and have constructors for us -impl<'a, L: Deref> +impl<'a, L: Logger> GossipSync< &P2PGossipSync<&'a NetworkGraph, &'a (dyn UtxoLookup + Send + Sync), L>, &RapidGossipSync<&'a NetworkGraph, L>, &'a NetworkGraph, &'a (dyn UtxoLookup + Send + Sync), L, - > where - L::Target: Logger, + > { /// Initializes a new [`GossipSync::None`] variant. pub fn none() -> Self { @@ -312,10 +307,7 @@ impl<'a, L: Deref> } } -fn handle_network_graph_update(network_graph: &NetworkGraph, event: &Event) -where - L::Target: Logger, -{ +fn handle_network_graph_update(network_graph: &NetworkGraph, event: &Event) { if let Event::PaymentPathFailed { failure: PathFailure::OnPath { network_update: Some(ref upd) }, .. @@ -422,8 +414,7 @@ pub const NO_ONION_MESSENGER: Option< dyn AOnionMessenger< EntropySource = &(dyn EntropySource + Send + Sync), NodeSigner = &(dyn lightning::sign::NodeSigner + Send + Sync), - Logger = dyn Logger + Send + Sync, - L = &'static (dyn Logger + Send + Sync), + Logger = &'static (dyn Logger + Send + Sync), NodeIdLookUp = DynChannelManager, NL = &'static DynChannelManager, MessageRouter = &'static DynMessageRouter, @@ -950,7 +941,7 @@ pub async fn process_events_async< T: BroadcasterInterface, F: FeeEstimator, G: Deref>, - L: Deref, + L: Logger, P: Deref, EventHandlerFuture: core::future::Future>, EventHandler: Fn(Event) -> EventHandlerFuture, @@ -980,7 +971,6 @@ pub async fn process_events_async< where UL::Target: UtxoLookup, CF::Target: chain::Filter, - L::Target: Logger, P::Target: Persist<::Signer>, CM::Target: AChannelManager, OM::Target: AOnionMessenger, @@ -1448,7 +1438,7 @@ pub async fn process_events_async_with_kv_store_sync< T: BroadcasterInterface, F: FeeEstimator, G: Deref>, - L: Deref, + L: Logger, P: Deref, EventHandlerFuture: core::future::Future>, EventHandler: Fn(Event) -> EventHandlerFuture, @@ -1478,7 +1468,6 @@ pub async fn process_events_async_with_kv_store_sync< where UL::Target: UtxoLookup, CF::Target: chain::Filter, - L::Target: Logger, P::Target: Persist<::Signer>, CM::Target: AChannelManager, OM::Target: AOnionMessenger, diff --git a/lightning-dns-resolver/src/lib.rs b/lightning-dns-resolver/src/lib.rs index 469370f10d5..330862966c5 100644 --- a/lightning-dns-resolver/src/lib.rs +++ b/lightning-dns-resolver/src/lib.rs @@ -195,12 +195,6 @@ mod test { eprintln!("{:<8} {}", self.node, record); } } - impl Deref for TestLogger { - type Target = TestLogger; - fn deref(&self) -> &TestLogger { - self - } - } struct DummyNodeLookup {} impl NodeIdLookUp for DummyNodeLookup { diff --git a/lightning-rapid-gossip-sync/src/lib.rs b/lightning-rapid-gossip-sync/src/lib.rs index 429a3560be0..a9653754655 100644 --- a/lightning-rapid-gossip-sync/src/lib.rs +++ b/lightning-rapid-gossip-sync/src/lib.rs @@ -132,19 +132,13 @@ impl From for GraphSyncError { /// See [crate-level documentation] for usage. /// /// [crate-level documentation]: crate -pub struct RapidGossipSync>, L: Deref> -where - L::Target: Logger, -{ +pub struct RapidGossipSync>, L: Logger> { network_graph: NG, logger: L, is_initial_sync_complete: AtomicBool, } -impl>, L: Deref> RapidGossipSync -where - L::Target: Logger, -{ +impl>, L: Logger> RapidGossipSync { /// Instantiate a new [`RapidGossipSync`] instance. pub fn new(network_graph: NG, logger: L) -> Self { Self { network_graph, logger, is_initial_sync_complete: AtomicBool::new(false) } diff --git a/lightning-rapid-gossip-sync/src/processing.rs b/lightning-rapid-gossip-sync/src/processing.rs index 8319506b574..9d3287969f2 100644 --- a/lightning-rapid-gossip-sync/src/processing.rs +++ b/lightning-rapid-gossip-sync/src/processing.rs @@ -37,10 +37,7 @@ const MAX_INITIAL_NODE_ID_VECTOR_CAPACITY: u32 = 50_000; /// suggestion. const STALE_RGS_UPDATE_AGE_LIMIT_SECS: u64 = 60 * 60 * 24 * 14; -impl>, L: Deref> RapidGossipSync -where - L::Target: Logger, -{ +impl>, L: Logger> RapidGossipSync { #[cfg(feature = "std")] pub(crate) fn update_network_graph_from_byte_stream( &self, read_cursor: &mut R, diff --git a/lightning-transaction-sync/src/electrum.rs b/lightning-transaction-sync/src/electrum.rs index 47489df69bb..762f1686c75 100644 --- a/lightning-transaction-sync/src/electrum.rs +++ b/lightning-transaction-sync/src/electrum.rs @@ -37,20 +37,14 @@ use std::time::Instant; /// [`ChainMonitor`]: lightning::chain::chainmonitor::ChainMonitor /// [`Watch::watch_channel`]: lightning::chain::Watch::watch_channel /// [`Filter`]: lightning::chain::Filter -pub struct ElectrumSyncClient -where - L::Target: Logger, -{ +pub struct ElectrumSyncClient { sync_state: Mutex, queue: Mutex, client: Arc, logger: L, } -impl ElectrumSyncClient -where - L::Target: Logger, -{ +impl ElectrumSyncClient { /// Returns a new [`ElectrumSyncClient`] object. pub fn new(server_url: String, logger: L) -> Result { let client = Arc::new(ElectrumClient::new(&server_url).map_err(|e| { @@ -494,10 +488,7 @@ where } } -impl Filter for ElectrumSyncClient -where - L::Target: Logger, -{ +impl Filter for ElectrumSyncClient { fn register_tx(&self, txid: &Txid, _script_pubkey: &Script) { let mut locked_queue = self.queue.lock().unwrap(); locked_queue.transactions.insert(*txid); diff --git a/lightning-transaction-sync/src/esplora.rs b/lightning-transaction-sync/src/esplora.rs index a191260bc01..6caf7a6a7ee 100644 --- a/lightning-transaction-sync/src/esplora.rs +++ b/lightning-transaction-sync/src/esplora.rs @@ -42,20 +42,14 @@ use std::collections::HashSet; /// [`ChainMonitor`]: lightning::chain::chainmonitor::ChainMonitor /// [`Watch::watch_channel`]: lightning::chain::Watch::watch_channel /// [`Filter`]: lightning::chain::Filter -pub struct EsploraSyncClient -where - L::Target: Logger, -{ +pub struct EsploraSyncClient { sync_state: MutexType, queue: std::sync::Mutex, client: EsploraClientType, logger: L, } -impl EsploraSyncClient -where - L::Target: Logger, -{ +impl EsploraSyncClient { /// Returns a new [`EsploraSyncClient`] object. pub fn new(server_url: String, logger: L) -> Self { let builder = Builder::new(&server_url); @@ -472,10 +466,7 @@ type EsploraClientType = AsyncClient; #[cfg(not(feature = "async-interface"))] type EsploraClientType = BlockingClient; -impl Filter for EsploraSyncClient -where - L::Target: Logger, -{ +impl Filter for EsploraSyncClient { fn register_tx(&self, txid: &Txid, _script_pubkey: &Script) { let mut locked_queue = self.queue.lock().unwrap(); locked_queue.transactions.insert(*txid); diff --git a/lightning/src/chain/chainmonitor.rs b/lightning/src/chain/chainmonitor.rs index 30f1d56ab71..87943bdf910 100644 --- a/lightning/src/chain/chainmonitor.rs +++ b/lightning/src/chain/chainmonitor.rs @@ -258,14 +258,13 @@ impl Deref for LockedChannelMonitor<'_, Chann pub struct AsyncPersister< K: Deref + MaybeSend + MaybeSync + 'static, S: FutureSpawner, - L: Deref + MaybeSend + MaybeSync + 'static, + L: Logger + MaybeSend + MaybeSync + 'static, ES: EntropySource + MaybeSend + MaybeSync + 'static, SP: Deref + MaybeSend + MaybeSync + 'static, BI: BroadcasterInterface + MaybeSend + MaybeSync + 'static, FE: FeeEstimator + MaybeSend + MaybeSync + 'static, > where K::Target: KVStore + MaybeSync, - L::Target: Logger, SP::Target: SignerProvider + Sized, { persister: MonitorUpdatingPersisterAsync, @@ -275,7 +274,7 @@ pub struct AsyncPersister< impl< K: Deref + MaybeSend + MaybeSync + 'static, S: FutureSpawner, - L: Deref + MaybeSend + MaybeSync + 'static, + L: Logger + MaybeSend + MaybeSync + 'static, ES: EntropySource + MaybeSend + MaybeSync + 'static, SP: Deref + MaybeSend + MaybeSync + 'static, BI: BroadcasterInterface + MaybeSend + MaybeSync + 'static, @@ -283,7 +282,6 @@ impl< > Deref for AsyncPersister where K::Target: KVStore + MaybeSync, - L::Target: Logger, SP::Target: SignerProvider + Sized, { type Target = Self; @@ -295,7 +293,7 @@ where impl< K: Deref + MaybeSend + MaybeSync + 'static, S: FutureSpawner, - L: Deref + MaybeSend + MaybeSync + 'static, + L: Logger + MaybeSend + MaybeSync + 'static, ES: EntropySource + MaybeSend + MaybeSync + 'static, SP: Deref + MaybeSend + MaybeSync + 'static, BI: BroadcasterInterface + MaybeSend + MaybeSync + 'static, @@ -303,7 +301,6 @@ impl< > Persist<::EcdsaSigner> for AsyncPersister where K::Target: KVStore + MaybeSync, - L::Target: Logger, SP::Target: SignerProvider + Sized, ::EcdsaSigner: MaybeSend + 'static, { @@ -355,12 +352,11 @@ pub struct ChainMonitor< C: Deref, T: BroadcasterInterface, F: FeeEstimator, - L: Deref, + L: Logger, P: Deref, ES: EntropySource, > where C::Target: chain::Filter, - L::Target: Logger, P::Target: Persist, { monitors: RwLock>>, @@ -394,7 +390,7 @@ impl< C: Deref, T: BroadcasterInterface + MaybeSend + MaybeSync + 'static, F: FeeEstimator + MaybeSend + MaybeSync + 'static, - L: Deref + MaybeSend + MaybeSync + 'static, + L: Logger + MaybeSend + MaybeSync + 'static, ES: EntropySource + MaybeSend + MaybeSync + 'static, > ChainMonitor< @@ -409,7 +405,6 @@ impl< K::Target: KVStore + MaybeSync, SP::Target: SignerProvider + Sized, C::Target: chain::Filter, - L::Target: Logger, ::EcdsaSigner: MaybeSend + 'static, { /// Creates a new `ChainMonitor` used to watch on-chain activity pertaining to channels. @@ -449,13 +444,12 @@ impl< C: Deref, T: BroadcasterInterface, F: FeeEstimator, - L: Deref, + L: Logger, P: Deref, ES: EntropySource, > ChainMonitor where C::Target: chain::Filter, - L::Target: Logger, P::Target: Persist, { /// Dispatches to per-channel monitors, which are responsible for updating their on-chain view @@ -1093,13 +1087,12 @@ impl< C: Deref, T: BroadcasterInterface, F: FeeEstimator, - L: Deref, + L: Logger, P: Deref, ES: EntropySource, > BaseMessageHandler for ChainMonitor where C::Target: chain::Filter, - L::Target: Logger, P::Target: Persist, { fn get_and_clear_pending_msg_events(&self) -> Vec { @@ -1129,13 +1122,12 @@ impl< C: Deref, T: BroadcasterInterface, F: FeeEstimator, - L: Deref, + L: Logger, P: Deref, ES: EntropySource, > SendOnlyMessageHandler for ChainMonitor where C::Target: chain::Filter, - L::Target: Logger, P::Target: Persist, { } @@ -1145,13 +1137,12 @@ impl< C: Deref, T: BroadcasterInterface, F: FeeEstimator, - L: Deref, + L: Logger, P: Deref, ES: EntropySource, > chain::Listen for ChainMonitor where C::Target: chain::Filter, - L::Target: Logger, P::Target: Persist, { fn filtered_block_connected(&self, header: &Header, txdata: &TransactionData, height: u32) { @@ -1206,13 +1197,12 @@ impl< C: Deref, T: BroadcasterInterface, F: FeeEstimator, - L: Deref, + L: Logger, P: Deref, ES: EntropySource, > chain::Confirm for ChainMonitor where C::Target: chain::Filter, - L::Target: Logger, P::Target: Persist, { fn transactions_confirmed(&self, header: &Header, txdata: &TransactionData, height: u32) { @@ -1298,13 +1288,12 @@ impl< C: Deref, T: BroadcasterInterface, F: FeeEstimator, - L: Deref, + L: Logger, P: Deref, ES: EntropySource, > chain::Watch for ChainMonitor where C::Target: chain::Filter, - L::Target: Logger, P::Target: Persist, { fn watch_channel( @@ -1491,13 +1480,12 @@ impl< C: Deref, T: BroadcasterInterface, F: FeeEstimator, - L: Deref, + L: Logger, P: Deref, ES: EntropySource, > events::EventsProvider for ChainMonitor where C::Target: chain::Filter, - L::Target: Logger, P::Target: Persist, { /// Processes [`SpendableOutputs`] events produced from each [`ChannelMonitor`] upon maturity. diff --git a/lightning/src/chain/channelmonitor.rs b/lightning/src/chain/channelmonitor.rs index 64208048422..f6d54c958d6 100644 --- a/lightning/src/chain/channelmonitor.rs +++ b/lightning/src/chain/channelmonitor.rs @@ -1825,20 +1825,14 @@ macro_rules! _process_events_body { } pub(super) use _process_events_body as process_events_body; -pub(crate) struct WithChannelMonitor<'a, L: Deref> -where - L::Target: Logger, -{ +pub(crate) struct WithChannelMonitor<'a, L: Logger> { logger: &'a L, peer_id: Option, channel_id: Option, payment_hash: Option, } -impl<'a, L: Deref> Logger for WithChannelMonitor<'a, L> -where - L::Target: Logger, -{ +impl<'a, L: Logger> Logger for WithChannelMonitor<'a, L> { fn log(&self, mut record: Record) { record.peer_id = self.peer_id; record.channel_id = self.channel_id; @@ -1847,10 +1841,7 @@ where } } -impl<'a, L: Deref> WithChannelMonitor<'a, L> -where - L::Target: Logger, -{ +impl<'a, L: Logger> WithChannelMonitor<'a, L> { pub(crate) fn from( logger: &'a L, monitor: &ChannelMonitor, payment_hash: Option, ) -> Self { @@ -2076,16 +2067,14 @@ impl ChannelMonitor { /// /// [`ChannelManager`]: crate::ln::channelmanager::ChannelManager #[rustfmt::skip] - pub(crate) fn provide_payment_preimage_unsafe_legacy( + pub(crate) fn provide_payment_preimage_unsafe_legacy( &self, payment_hash: &PaymentHash, payment_preimage: &PaymentPreimage, broadcaster: &B, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, - ) where - L::Target: Logger, - { + ) { let mut inner = self.inner.lock().unwrap(); let logger = WithChannelMonitor::from_impl(logger, &*inner, Some(*payment_hash)); // Note that we don't pass any MPP claim parts here. This is generally not okay but in this @@ -2099,12 +2088,9 @@ impl ChannelMonitor { /// itself. /// /// panics if the given update is not the next update by update_id. - pub fn update_monitor( + pub fn update_monitor( &self, updates: &ChannelMonitorUpdate, broadcaster: &B, fee_estimator: &F, logger: &L, - ) -> Result<(), ()> - where - L::Target: Logger, - { + ) -> Result<(), ()> { let mut inner = self.inner.lock().unwrap(); let logger = WithChannelMonitor::from_impl(logger, &*inner, None); inner.update_monitor(updates, broadcaster, fee_estimator, &logger) @@ -2154,10 +2140,8 @@ impl ChannelMonitor { /// calling `chain::Filter::register_output` and `chain::Filter::register_tx` until all outputs /// have been registered. #[rustfmt::skip] - pub fn load_outputs_to_watch(&self, filter: &F, logger: &L) - where - F::Target: chain::Filter, L::Target: Logger, - { + pub fn load_outputs_to_watch(&self, filter: &F, logger: &L) + where F::Target: chain::Filter { let lock = self.inner.lock().unwrap(); let logger = WithChannelMonitor::from_impl(logger, &*lock, None); for funding in core::iter::once(&lock.funding).chain(&lock.pending_funding) { @@ -2201,12 +2185,11 @@ impl ChannelMonitor { /// /// [`SpendableOutputs`]: crate::events::Event::SpendableOutputs /// [`BumpTransaction`]: crate::events::Event::BumpTransaction - pub fn process_pending_events( + pub fn process_pending_events( &self, handler: &H, logger: &L, ) -> Result<(), ReplayEvent> where H::Target: EventHandler, - L::Target: Logger, { let mut ev; process_events_body!(Some(self), logger, ev, handler.handle_event(ev)) @@ -2218,13 +2201,10 @@ impl ChannelMonitor { pub async fn process_pending_events_async< Future: core::future::Future>, H: Fn(Event) -> Future, - L: Deref, + L: Logger, >( &self, handler: &H, logger: &L, - ) -> Result<(), ReplayEvent> - where - L::Target: Logger, - { + ) -> Result<(), ReplayEvent> { let mut ev; process_events_body!(Some(self), logger, ev, { handler(ev).await }) } @@ -2355,12 +2335,10 @@ impl ChannelMonitor { pub fn broadcast_latest_holder_commitment_txn< B: BroadcasterInterface, F: FeeEstimator, - L: Deref, + L: Logger, >( &self, broadcaster: &B, fee_estimator: &F, logger: &L, - ) where - L::Target: Logger, - { + ) { let mut inner = self.inner.lock().unwrap(); let fee_estimator = LowerBoundedFeeEstimator::new(fee_estimator); let logger = WithChannelMonitor::from_impl(logger, &*inner, None); @@ -2377,10 +2355,9 @@ impl ChannelMonitor { /// to bypass HolderCommitmentTransaction state update lockdown after signature and generate /// revoked commitment transaction. #[cfg(any(test, feature = "_test_utils", feature = "unsafe_revoked_tx_signing"))] - pub fn unsafe_get_latest_holder_commitment_txn(&self, logger: &L) -> Vec - where - L::Target: Logger, - { + pub fn unsafe_get_latest_holder_commitment_txn( + &self, logger: &L, + ) -> Vec { let mut inner = self.inner.lock().unwrap(); let logger = WithChannelMonitor::from_impl(logger, &*inner, None); inner.unsafe_get_latest_holder_commitment_txn(&logger) @@ -2398,7 +2375,7 @@ impl ChannelMonitor { /// /// [`get_outputs_to_watch`]: #method.get_outputs_to_watch #[rustfmt::skip] - pub fn block_connected( + pub fn block_connected( &self, header: &Header, txdata: &TransactionData, @@ -2406,10 +2383,7 @@ impl ChannelMonitor { broadcaster: B, fee_estimator: F, logger: &L, - ) -> Vec - where - L::Target: Logger, - { + ) -> Vec { let mut inner = self.inner.lock().unwrap(); let logger = WithChannelMonitor::from_impl(logger, &*inner, None); inner.block_connected( @@ -2418,11 +2392,9 @@ impl ChannelMonitor { /// Determines if the disconnected block contained any transactions of interest and updates /// appropriately. - pub fn blocks_disconnected( + pub fn blocks_disconnected( &self, fork_point: BestBlock, broadcaster: B, fee_estimator: F, logger: &L, - ) where - L::Target: Logger, - { + ) { let mut inner = self.inner.lock().unwrap(); let logger = WithChannelMonitor::from_impl(logger, &*inner, None); inner.blocks_disconnected(fork_point, broadcaster, fee_estimator, &logger) @@ -2436,7 +2408,7 @@ impl ChannelMonitor { /// /// [`block_connected`]: Self::block_connected #[rustfmt::skip] - pub fn transactions_confirmed( + pub fn transactions_confirmed( &self, header: &Header, txdata: &TransactionData, @@ -2444,10 +2416,7 @@ impl ChannelMonitor { broadcaster: B, fee_estimator: F, logger: &L, - ) -> Vec - where - L::Target: Logger, - { + ) -> Vec { let bounded_fee_estimator = LowerBoundedFeeEstimator::new(fee_estimator); let mut inner = self.inner.lock().unwrap(); let logger = WithChannelMonitor::from_impl(logger, &*inner, None); @@ -2462,15 +2431,13 @@ impl ChannelMonitor { /// /// [`blocks_disconnected`]: Self::blocks_disconnected #[rustfmt::skip] - pub fn transaction_unconfirmed( + pub fn transaction_unconfirmed( &self, txid: &Txid, broadcaster: B, fee_estimator: F, logger: &L, - ) where - L::Target: Logger, - { + ) { let bounded_fee_estimator = LowerBoundedFeeEstimator::new(fee_estimator); let mut inner = self.inner.lock().unwrap(); let logger = WithChannelMonitor::from_impl(logger, &*inner, None); @@ -2487,17 +2454,14 @@ impl ChannelMonitor { /// /// [`block_connected`]: Self::block_connected #[rustfmt::skip] - pub fn best_block_updated( + pub fn best_block_updated( &self, header: &Header, height: u32, broadcaster: B, fee_estimator: F, logger: &L, - ) -> Vec - where - L::Target: Logger, - { + ) -> Vec { let bounded_fee_estimator = LowerBoundedFeeEstimator::new(fee_estimator); let mut inner = self.inner.lock().unwrap(); let logger = WithChannelMonitor::from_impl(logger, &*inner, None); @@ -2532,12 +2496,9 @@ impl ChannelMonitor { /// invoking this every 30 seconds, or lower if running in an environment with spotty /// connections, like on mobile. #[rustfmt::skip] - pub fn rebroadcast_pending_claims( + pub fn rebroadcast_pending_claims( &self, broadcaster: B, fee_estimator: F, logger: &L, - ) - where - L::Target: Logger, - { + ) { let fee_estimator = LowerBoundedFeeEstimator::new(fee_estimator); let mut lock = self.inner.lock().unwrap(); let inner = &mut *lock; @@ -2558,12 +2519,9 @@ impl ChannelMonitor { /// Triggers rebroadcasts of pending claims from a force-closed channel after a transaction /// signature generation failure. #[rustfmt::skip] - pub fn signer_unblocked( + pub fn signer_unblocked( &self, broadcaster: B, fee_estimator: F, logger: &L, - ) - where - L::Target: Logger, - { + ) { let fee_estimator = LowerBoundedFeeEstimator::new(fee_estimator); let mut lock = self.inner.lock().unwrap(); let inner = &mut *lock; @@ -3810,12 +3768,11 @@ impl ChannelMonitorImpl { /// /// Note that this is often called multiple times for the same payment and must be idempotent. #[rustfmt::skip] - fn provide_payment_preimage( + fn provide_payment_preimage( &mut self, payment_hash: &PaymentHash, payment_preimage: &PaymentPreimage, payment_info: &Option, broadcaster: &B, - fee_estimator: &LowerBoundedFeeEstimator, logger: &WithChannelMonitor) - where L::Target: Logger, - { + fee_estimator: &LowerBoundedFeeEstimator, logger: &WithChannelMonitor + ) { self.payment_preimages.entry(payment_hash.clone()) .and_modify(|(_, payment_infos)| { if let Some(payment_info) = payment_info { @@ -3987,13 +3944,10 @@ impl ChannelMonitorImpl { /// See also [`ChannelMonitor::broadcast_latest_holder_commitment_txn`]. /// /// [`ChannelMonitor::broadcast_latest_holder_commitment_txn`]: crate::chain::channelmonitor::ChannelMonitor::broadcast_latest_holder_commitment_txn - pub(crate) fn queue_latest_holder_commitment_txn_for_broadcast( + pub(crate) fn queue_latest_holder_commitment_txn_for_broadcast( &mut self, broadcaster: &B, fee_estimator: &LowerBoundedFeeEstimator, logger: &WithChannelMonitor, require_funding_seen: bool, - ) - where - L::Target: Logger, - { + ) { let reason = ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(true), message: "ChannelMonitor-initiated commitment transaction broadcast".to_owned(), @@ -4013,15 +3967,12 @@ impl ChannelMonitorImpl { ); } - fn renegotiated_funding( + fn renegotiated_funding( &mut self, logger: &WithChannelMonitor, channel_parameters: &ChannelTransactionParameters, alternative_holder_commitment_tx: &HolderCommitmentTransaction, alternative_counterparty_commitment_tx: &CommitmentTransaction, - ) -> Result<(), ()> - where - L::Target: Logger, - { + ) -> Result<(), ()> { let alternative_counterparty_commitment_txid = alternative_counterparty_commitment_tx.trust().txid(); @@ -4189,11 +4140,9 @@ impl ChannelMonitorImpl { } #[rustfmt::skip] - fn update_monitor( + fn update_monitor( &mut self, updates: &ChannelMonitorUpdate, broadcaster: &B, fee_estimator: &F, logger: &WithChannelMonitor - ) -> Result<(), ()> - where L::Target: Logger, - { + ) -> Result<(), ()> { if self.latest_update_id == LEGACY_CLOSED_CHANNEL_UPDATE_ID && updates.update_id == LEGACY_CLOSED_CHANNEL_UPDATE_ID { log_info!(logger, "Applying pre-0.1 post-force-closed update to monitor {} with {} change(s).", log_funding_info!(self), updates.updates.len()); @@ -4655,9 +4604,9 @@ impl ChannelMonitorImpl { /// Returns packages to claim the revoked output(s) and general information about the output that /// is to the counterparty in the commitment transaction. #[rustfmt::skip] - fn check_spend_counterparty_transaction(&mut self, commitment_txid: Txid, commitment_tx: &Transaction, height: u32, block_hash: &BlockHash, logger: &L) + fn check_spend_counterparty_transaction(&mut self, commitment_txid: Txid, commitment_tx: &Transaction, height: u32, block_hash: &BlockHash, logger: &L) -> (Vec, CommitmentTxCounterpartyOutputInfo) - where L::Target: Logger { + { // Most secp and related errors trying to create keys means we have no hope of constructing // a spend transaction...so we return no transactions to broadcast let mut claimable_outpoints = Vec::new(); @@ -4945,9 +4894,9 @@ impl ChannelMonitorImpl { /// Attempts to claim a counterparty HTLC-Success/HTLC-Timeout's outputs using the revocation key #[rustfmt::skip] - fn check_spend_counterparty_htlc( + fn check_spend_counterparty_htlc( &mut self, tx: &Transaction, commitment_number: u64, commitment_txid: &Txid, height: u32, logger: &L - ) -> (Vec, Option) where L::Target: Logger { + ) -> (Vec, Option) { let secret = if let Some(secret) = self.get_secret(commitment_number) { secret } else { return (Vec::new(), None); }; let per_commitment_key = match SecretKey::from_slice(&secret) { Ok(key) => key, @@ -5088,13 +5037,10 @@ impl ChannelMonitorImpl { /// revoked using data in holder_claimable_outpoints. /// Should not be used if check_spend_revoked_transaction succeeds. /// Returns None unless the transaction is definitely one of our commitment transactions. - fn check_spend_holder_transaction( + fn check_spend_holder_transaction( &mut self, commitment_txid: Txid, commitment_tx: &Transaction, height: u32, block_hash: &BlockHash, logger: &L, - ) -> Option<(Vec, TransactionOutputs)> - where - L::Target: Logger, - { + ) -> Option<(Vec, TransactionOutputs)> { let funding_spent = get_confirmed_funding_scope!(self); // HTLCs set may differ between last and previous holder commitment txn, in case of one them hitting chain, ensure we cancel all HTLCs backward @@ -5157,9 +5103,9 @@ impl ChannelMonitorImpl { /// Cancels any existing pending claims for a commitment that previously confirmed and has now /// been replaced by another. #[rustfmt::skip] - pub fn cancel_prev_commitment_claims( + pub fn cancel_prev_commitment_claims( &mut self, logger: &L, confirmed_commitment_txid: &Txid - ) where L::Target: Logger { + ) { for (counterparty_commitment_txid, _) in &self.counterparty_commitment_txn_on_chain { // Cancel any pending claims for counterparty commitments we've seen confirm. if counterparty_commitment_txid == confirmed_commitment_txid { @@ -5231,9 +5177,9 @@ impl ChannelMonitorImpl { #[cfg(any(test, feature = "_test_utils", feature = "unsafe_revoked_tx_signing"))] /// Note that this includes possibly-locktimed-in-the-future transactions! #[rustfmt::skip] - fn unsafe_get_latest_holder_commitment_txn( + fn unsafe_get_latest_holder_commitment_txn( &mut self, logger: &WithChannelMonitor - ) -> Vec where L::Target: Logger { + ) -> Vec { log_debug!(logger, "Getting signed copy of latest holder commitment transaction!"); let commitment_tx = { let sig = self.onchain_tx_handler.signer.unsafe_sign_holder_commitment( @@ -5283,10 +5229,10 @@ impl ChannelMonitorImpl { } #[rustfmt::skip] - fn block_connected( + fn block_connected( &mut self, header: &Header, txdata: &TransactionData, height: u32, broadcaster: B, fee_estimator: F, logger: &WithChannelMonitor, - ) -> Vec where L::Target: Logger, { + ) -> Vec { let block_hash = header.block_hash(); self.best_block = BestBlock::new(block_hash, height); @@ -5295,17 +5241,14 @@ impl ChannelMonitorImpl { } #[rustfmt::skip] - fn best_block_updated( + fn best_block_updated( &mut self, header: &Header, height: u32, broadcaster: B, fee_estimator: &LowerBoundedFeeEstimator, logger: &WithChannelMonitor, - ) -> Vec - where - L::Target: Logger, - { + ) -> Vec { let block_hash = header.block_hash(); if height > self.best_block.height { @@ -5325,7 +5268,7 @@ impl ChannelMonitorImpl { } #[rustfmt::skip] - fn transactions_confirmed( + fn transactions_confirmed( &mut self, header: &Header, txdata: &TransactionData, @@ -5333,10 +5276,7 @@ impl ChannelMonitorImpl { broadcaster: B, fee_estimator: &LowerBoundedFeeEstimator, logger: &WithChannelMonitor, - ) -> Vec - where - L::Target: Logger, - { + ) -> Vec { let funding_seen_before = self.funding_seen_onchain; let txn_matched = self.filter_block(txdata); @@ -5608,7 +5548,7 @@ impl ChannelMonitorImpl { /// `conf_height` should be set to the height at which any new transaction(s)/block(s) were /// confirmed at, even if it is not the current best height. #[rustfmt::skip] - fn block_confirmed( + fn block_confirmed( &mut self, conf_height: u32, conf_hash: BlockHash, @@ -5618,10 +5558,7 @@ impl ChannelMonitorImpl { broadcaster: &B, fee_estimator: &LowerBoundedFeeEstimator, logger: &WithChannelMonitor, - ) -> Vec - where - L::Target: Logger, - { + ) -> Vec { log_trace!(logger, "Processing {} matched transactions for block at height {}.", txn_matched.len(), conf_height); debug_assert!(self.best_block.height >= conf_height); @@ -5834,10 +5771,9 @@ impl ChannelMonitorImpl { } #[rustfmt::skip] - fn blocks_disconnected( + fn blocks_disconnected( &mut self, fork_point: BestBlock, broadcaster: B, fee_estimator: F, logger: &WithChannelMonitor - ) where L::Target: Logger, - { + ) { let new_height = fork_point.height; log_trace!(logger, "Block(s) disconnected to height {}", new_height); assert!(self.best_block.height > fork_point.height, @@ -5881,15 +5817,13 @@ impl ChannelMonitorImpl { } #[rustfmt::skip] - fn transaction_unconfirmed( + fn transaction_unconfirmed( &mut self, txid: &Txid, broadcaster: B, fee_estimator: &LowerBoundedFeeEstimator, logger: &WithChannelMonitor, - ) where - L::Target: Logger, - { + ) { let mut removed_height = None; for entry in self.onchain_events_awaiting_threshold_conf.iter() { if entry.txid == *txid { @@ -5994,9 +5928,9 @@ impl ChannelMonitorImpl { } #[rustfmt::skip] - fn should_broadcast_holder_commitment_txn( + fn should_broadcast_holder_commitment_txn( &self, logger: &WithChannelMonitor - ) -> Option where L::Target: Logger { + ) -> Option { // There's no need to broadcast our commitment transaction if we've seen one confirmed (even // with 1 confirmation) as it'll be rejected as duplicate/conflicting. if self.funding_spend_confirmed.is_some() || @@ -6061,9 +5995,9 @@ impl ChannelMonitorImpl { /// Check if any transaction broadcasted is resolving HTLC output by a success or timeout on a holder /// or counterparty commitment tx, if so send back the source, preimage if found and payment_hash of resolved HTLC #[rustfmt::skip] - fn is_resolving_htlc_output( + fn is_resolving_htlc_output( &mut self, tx: &Transaction, height: u32, block_hash: &BlockHash, logger: &WithChannelMonitor, - ) where L::Target: Logger { + ) { let funding_spent = get_confirmed_funding_scope!(self); 'outer_loop: for input in &tx.input { @@ -6318,9 +6252,9 @@ impl ChannelMonitorImpl { /// Checks if the confirmed transaction is paying funds back to some address we can assume to /// own. #[rustfmt::skip] - fn check_tx_and_push_spendable_outputs( + fn check_tx_and_push_spendable_outputs( &mut self, tx: &Transaction, height: u32, block_hash: &BlockHash, logger: &WithChannelMonitor, - ) where L::Target: Logger { + ) { let funding_spent = get_confirmed_funding_scope!(self); for spendable_output in self.get_spendable_outputs(funding_spent, tx) { let entry = OnchainEventEntry { @@ -6340,10 +6274,8 @@ impl ChannelMonitorImpl { } } -impl chain::Listen +impl chain::Listen for (ChannelMonitor, T, F, L) -where - L::Target: Logger, { fn filtered_block_connected(&self, header: &Header, txdata: &TransactionData, height: u32) { self.0.block_connected(header, txdata, height, &self.1, &self.2, &self.3); @@ -6354,11 +6286,10 @@ where } } -impl +impl chain::Confirm for (M, T, F, L) where M: Deref>, - L::Target: Logger, { fn transactions_confirmed(&self, header: &Header, txdata: &TransactionData, height: u32) { self.0.transactions_confirmed(header, txdata, height, &self.1, &self.2, &self.3); diff --git a/lightning/src/events/bump_transaction/mod.rs b/lightning/src/events/bump_transaction/mod.rs index b45b65940ee..bc912124410 100644 --- a/lightning/src/events/bump_transaction/mod.rs +++ b/lightning/src/events/bump_transaction/mod.rs @@ -442,10 +442,9 @@ pub trait WalletSource { /// /// This is not exported to bindings users as async is only supported in Rust. // Note that updates to documentation on this struct should be copied to the synchronous version. -pub struct Wallet +pub struct Wallet where W::Target: WalletSource + MaybeSend, - L::Target: Logger + MaybeSend, { source: W, logger: L, @@ -455,10 +454,9 @@ where locked_utxos: Mutex>, } -impl Wallet +impl Wallet where W::Target: WalletSource + MaybeSend, - L::Target: Logger + MaybeSend, { /// Returns a new instance backed by the given [`WalletSource`] that serves as an implementation /// of [`CoinSelectionSource`]. @@ -617,11 +615,10 @@ where } } -impl CoinSelectionSource +impl CoinSelectionSource for Wallet where W::Target: WalletSource + MaybeSend + MaybeSync, - L::Target: Logger + MaybeSend + MaybeSync, { fn select_confirmed_utxos<'a>( &'a self, claim_id: ClaimId, must_spend: Vec, must_pay_to: &'a [TxOut], @@ -694,11 +691,10 @@ where /// /// [`Event::BumpTransaction`]: crate::events::Event::BumpTransaction // Note that updates to documentation on this struct should be copied to the synchronous version. -pub struct BumpTransactionEventHandler +pub struct BumpTransactionEventHandler where C::Target: CoinSelectionSource, SP::Target: SignerProvider, - L::Target: Logger, { broadcaster: B, utxo_source: C, @@ -707,12 +703,11 @@ where secp: Secp256k1, } -impl +impl BumpTransactionEventHandler where C::Target: CoinSelectionSource, SP::Target: SignerProvider, - L::Target: Logger, { /// Returns a new instance capable of handling [`Event::BumpTransaction`] events. /// diff --git a/lightning/src/events/bump_transaction/sync.rs b/lightning/src/events/bump_transaction/sync.rs index bf0668ccba3..e19ab3d7804 100644 --- a/lightning/src/events/bump_transaction/sync.rs +++ b/lightning/src/events/bump_transaction/sync.rs @@ -100,18 +100,16 @@ where /// /// For an asynchronous version of this wrapper, see [`Wallet`]. // Note that updates to documentation on this struct should be copied to the asynchronous version. -pub struct WalletSync +pub struct WalletSync where W::Target: WalletSourceSync + MaybeSend, - L::Target: Logger + MaybeSend, { wallet: Wallet, L>, } -impl WalletSync +impl WalletSync where W::Target: WalletSourceSync + MaybeSend, - L::Target: Logger + MaybeSend, { /// Constructs a new [`WalletSync`] instance. pub fn new(source: W, logger: L) -> Self { @@ -119,11 +117,10 @@ where } } -impl CoinSelectionSourceSync +impl CoinSelectionSourceSync for WalletSync where W::Target: WalletSourceSync + MaybeSend + MaybeSync, - L::Target: Logger + MaybeSend + MaybeSync, { fn select_confirmed_utxos( &self, claim_id: ClaimId, must_spend: Vec, must_pay_to: &[TxOut], @@ -267,22 +264,20 @@ where /// /// [`Event::BumpTransaction`]: crate::events::Event::BumpTransaction // Note that updates to documentation on this struct should be copied to the synchronous version. -pub struct BumpTransactionEventHandlerSync +pub struct BumpTransactionEventHandlerSync where C::Target: CoinSelectionSourceSync, SP::Target: SignerProvider, - L::Target: Logger, { bump_transaction_event_handler: BumpTransactionEventHandler, SP, L>, } -impl +impl BumpTransactionEventHandlerSync where C::Target: CoinSelectionSourceSync, SP::Target: SignerProvider, - L::Target: Logger, { /// Constructs a new instance of [`BumpTransactionEventHandlerSync`]. pub fn new(broadcaster: B, utxo_source: C, signer_provider: SP, logger: L) -> Self { diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs index 9528fee5b33..4377982959c 100644 --- a/lightning/src/ln/channel.rs +++ b/lightning/src/ln/channel.rs @@ -985,20 +985,14 @@ impl ChannelError { } } -pub(super) struct WithChannelContext<'a, L: Deref> -where - L::Target: Logger, -{ +pub(super) struct WithChannelContext<'a, L: Logger> { pub logger: &'a L, pub peer_id: Option, pub channel_id: Option, pub payment_hash: Option, } -impl<'a, L: Deref> Logger for WithChannelContext<'a, L> -where - L::Target: Logger, -{ +impl<'a, L: Logger> Logger for WithChannelContext<'a, L> { fn log(&self, mut record: Record) { record.peer_id = self.peer_id; record.channel_id = self.channel_id; @@ -1007,10 +1001,7 @@ where } } -impl<'a, 'b, L: Deref> WithChannelContext<'a, L> -where - L::Target: Logger, -{ +impl<'a, 'b, L: Logger> WithChannelContext<'a, L> { pub(super) fn from( logger: &'a L, context: &'b ChannelContext, payment_hash: Option, ) -> Self @@ -1294,11 +1285,10 @@ impl HolderCommitmentPoint { /// If we are pending advancing the next commitment point, this method tries asking the signer /// again. - pub fn try_resolve_pending( + pub fn try_resolve_pending( &mut self, signer: &ChannelSignerType, secp_ctx: &Secp256k1, logger: &L, ) where SP::Target: SignerProvider, - L::Target: Logger, { if !self.can_advance() { let pending_next_point = signer @@ -1331,12 +1321,11 @@ impl HolderCommitmentPoint { /// /// If our signer is ready to provide the next commitment point, the next call to `advance` will /// succeed. - pub fn advance( + pub fn advance( &mut self, signer: &ChannelSignerType, secp_ctx: &Secp256k1, logger: &L, ) -> Result<(), ()> where SP::Target: SignerProvider, - L::Target: Logger, { if let Some(next_point) = self.pending_next_point { *self = Self { @@ -1619,9 +1608,9 @@ where } #[rustfmt::skip] - pub fn signer_maybe_unblocked( + pub fn signer_maybe_unblocked( &mut self, chain_hash: ChainHash, logger: &L, path_for_release_htlc: CBP - ) -> Result, ChannelError> where L::Target: Logger, CBP: Fn(u64) -> BlindedMessagePath { + ) -> Result, ChannelError> where CBP: Fn(u64) -> BlindedMessagePath { match &mut self.phase { ChannelPhase::Undefined => unreachable!(), ChannelPhase::Funded(chan) => chan.signer_maybe_unblocked(logger, path_for_release_htlc).map(|r| Some(r)), @@ -1664,10 +1653,7 @@ where /// Should be called when the peer is disconnected. Returns true if the channel can be resumed /// when the peer reconnects (via [`Self::peer_connected_get_handshake`]). If not, the channel /// must be immediately closed. - pub fn peer_disconnected_is_resumable(&mut self, logger: &L) -> DisconnectResult - where - L::Target: Logger, - { + pub fn peer_disconnected_is_resumable(&mut self, logger: &L) -> DisconnectResult { let is_resumable = match &mut self.phase { ChannelPhase::Undefined => unreachable!(), ChannelPhase::Funded(chan) => { @@ -1721,9 +1707,9 @@ where /// Should be called when the peer re-connects, returning an initial message which we should /// send our peer to begin the channel reconnection process. #[rustfmt::skip] - pub fn peer_connected_get_handshake( + pub fn peer_connected_get_handshake( &mut self, chain_hash: ChainHash, logger: &L, - ) -> ReconnectionMsg where L::Target: Logger { + ) -> ReconnectionMsg { match &mut self.phase { ChannelPhase::Undefined => unreachable!(), ChannelPhase::Funded(chan) => @@ -1757,13 +1743,10 @@ where } #[rustfmt::skip] - pub fn maybe_handle_error_without_close( + pub fn maybe_handle_error_without_close( &mut self, chain_hash: ChainHash, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, user_config: &UserConfig, their_features: &InitFeatures, - ) -> Result, ()> - where - L::Target: Logger, - { + ) -> Result, ()> { match &mut self.phase { ChannelPhase::Undefined => unreachable!(), ChannelPhase::Funded(_) => Ok(None), @@ -1796,12 +1779,9 @@ where } } - fn fail_interactive_tx_negotiation( + fn fail_interactive_tx_negotiation( &mut self, reason: AbortReason, logger: &L, - ) -> (ChannelError, Option) - where - L::Target: Logger, - { + ) -> (ChannelError, Option) { let logger = WithChannelContext::from(logger, &self.context(), None); log_info!(logger, "Failed interactive transaction negotiation: {reason}"); @@ -1825,12 +1805,9 @@ where (ChannelError::Abort(reason), splice_funding_failed) } - pub fn tx_add_input( + pub fn tx_add_input( &mut self, msg: &msgs::TxAddInput, logger: &L, - ) -> Result)> - where - L::Target: Logger, - { + ) -> Result)> { match self.interactive_tx_constructor_mut() { Some(interactive_tx_constructor) => interactive_tx_constructor .handle_tx_add_input(msg) @@ -1844,12 +1821,9 @@ where } } - pub fn tx_add_output( + pub fn tx_add_output( &mut self, msg: &msgs::TxAddOutput, logger: &L, - ) -> Result)> - where - L::Target: Logger, - { + ) -> Result)> { match self.interactive_tx_constructor_mut() { Some(interactive_tx_constructor) => interactive_tx_constructor .handle_tx_add_output(msg) @@ -1863,12 +1837,9 @@ where } } - pub fn tx_remove_input( + pub fn tx_remove_input( &mut self, msg: &msgs::TxRemoveInput, logger: &L, - ) -> Result)> - where - L::Target: Logger, - { + ) -> Result)> { match self.interactive_tx_constructor_mut() { Some(interactive_tx_constructor) => interactive_tx_constructor .handle_tx_remove_input(msg) @@ -1882,12 +1853,9 @@ where } } - pub fn tx_remove_output( + pub fn tx_remove_output( &mut self, msg: &msgs::TxRemoveOutput, logger: &L, - ) -> Result)> - where - L::Target: Logger, - { + ) -> Result)> { match self.interactive_tx_constructor_mut() { Some(interactive_tx_constructor) => interactive_tx_constructor .handle_tx_remove_output(msg) @@ -1901,15 +1869,12 @@ where } } - pub fn tx_complete( + pub fn tx_complete( &mut self, msg: &msgs::TxComplete, logger: &L, ) -> Result< (Option, Option), (ChannelError, Option), - > - where - L::Target: Logger, - { + > { let tx_complete_action = match self.interactive_tx_constructor_mut() { Some(interactive_tx_constructor) => interactive_tx_constructor .handle_tx_complete(msg) @@ -1942,12 +1907,9 @@ where Ok((interactive_tx_msg_send, Some(commitment_signed))) } - pub fn tx_abort( + pub fn tx_abort( &mut self, msg: &msgs::TxAbort, logger: &L, - ) -> Result<(Option, Option), ChannelError> - where - L::Target: Logger, - { + ) -> Result<(Option, Option), ChannelError> { // If we have not sent a `tx_abort` message for this negotiation previously, we need to echo // back a tx_abort message according to the spec: // https://github.com/lightning/bolts/blob/247e83d/02-peer-protocol.md?plain=1#L560-L561 @@ -2014,12 +1976,9 @@ where } #[rustfmt::skip] - pub fn funding_signed( + pub fn funding_signed( &mut self, msg: &msgs::FundingSigned, best_block: BestBlock, signer_provider: &SP, logger: &L - ) -> Result<(&mut FundedChannel, ChannelMonitor<::EcdsaSigner>), ChannelError> - where - L::Target: Logger - { + ) -> Result<(&mut FundedChannel, ChannelMonitor<::EcdsaSigner>), ChannelError> { let phase = core::mem::replace(&mut self.phase, ChannelPhase::Undefined); let result = if let ChannelPhase::UnfundedOutboundV1(chan) = phase { let channel_state = chan.context.channel_state; @@ -2045,12 +2004,9 @@ where result.map(|monitor| (self.as_funded_mut().expect("Channel should be funded"), monitor)) } - fn funding_tx_constructed( + fn funding_tx_constructed( &mut self, funding_outpoint: OutPoint, logger: &L, - ) -> Result - where - L::Target: Logger, - { + ) -> Result { let logger = WithChannelContext::from(logger, self.context(), None); let (interactive_tx_constructor, commitment_signed) = match &mut self.phase { ChannelPhase::UnfundedV2(chan) => { @@ -2167,12 +2123,9 @@ where } #[rustfmt::skip] - pub fn commitment_signed( + pub fn commitment_signed( &mut self, msg: &msgs::CommitmentSigned, best_block: BestBlock, signer_provider: &SP, fee_estimator: &LowerBoundedFeeEstimator, logger: &L - ) -> Result<(Option::EcdsaSigner>>, Option), ChannelError> - where - L::Target: Logger - { + ) -> Result<(Option::EcdsaSigner>>, Option), ChannelError> { let phase = core::mem::replace(&mut self.phase, ChannelPhase::Undefined); match phase { ChannelPhase::UnfundedV2(chan) => { @@ -3153,9 +3106,9 @@ where fn received_msg(&self) -> &'static str; #[rustfmt::skip] - fn check_counterparty_commitment_signature( + fn check_counterparty_commitment_signature( &self, sig: &Signature, holder_commitment_point: &HolderCommitmentPoint, logger: &L - ) -> Result where L::Target: Logger { + ) -> Result { let funding_script = self.funding().get_funding_redeemscript(); let commitment_data = self.context().build_commitment_transaction(self.funding(), @@ -3176,13 +3129,10 @@ where } #[rustfmt::skip] - fn initial_commitment_signed( + fn initial_commitment_signed( &mut self, channel_id: ChannelId, counterparty_signature: Signature, holder_commitment_point: &mut HolderCommitmentPoint, best_block: BestBlock, signer_provider: &SP, logger: &L, - ) -> Result<(ChannelMonitor<::EcdsaSigner>, CommitmentTransaction), ChannelError> - where - L::Target: Logger - { + ) -> Result<(ChannelMonitor<::EcdsaSigner>, CommitmentTransaction), ChannelError> { let initial_commitment_tx = match self.check_counterparty_commitment_signature(&counterparty_signature, holder_commitment_point, logger) { Ok(res) => res, Err(ChannelError::Close(e)) => { @@ -3371,7 +3321,7 @@ where SP::Target: SignerProvider, { #[rustfmt::skip] - fn new_for_inbound_channel<'a, ES: EntropySource, F: FeeEstimator, L: Deref>( + fn new_for_inbound_channel<'a, ES: EntropySource, F: FeeEstimator, L: Logger>( fee_estimator: &'a LowerBoundedFeeEstimator, entropy_source: &'a ES, signer_provider: &'a SP, @@ -3391,7 +3341,6 @@ where open_channel_fields: msgs::CommonOpenChannelFields, ) -> Result<(FundingScope, ChannelContext), ChannelError> where - L::Target: Logger, SP::Target: SignerProvider, { let logger = WithContext::from(logger, Some(counterparty_node_id), Some(open_channel_fields.temporary_channel_id), None); @@ -3713,7 +3662,7 @@ where } #[rustfmt::skip] - fn new_for_outbound_channel<'a, ES: EntropySource, F: FeeEstimator, L: Deref>( + fn new_for_outbound_channel<'a, ES: EntropySource, F: FeeEstimator, L: Logger>( fee_estimator: &'a LowerBoundedFeeEstimator, entropy_source: &'a ES, signer_provider: &'a SP, @@ -3733,7 +3682,6 @@ where ) -> Result<(FundingScope, ChannelContext), APIError> where SP::Target: SignerProvider, - L::Target: Logger, { // This will be updated with the counterparty contribution if this is a dual-funded channel let channel_value_satoshis = funding_satoshis; @@ -4930,16 +4878,13 @@ where Ok(()) } - fn validate_commitment_signed( + fn validate_commitment_signed( &self, funding: &FundingScope, transaction_number: u64, commitment_point: PublicKey, msg: &msgs::CommitmentSigned, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, ) -> Result< (HolderCommitmentTransaction, Vec<(HTLCOutputInCommitment, Option<&HTLCSource>)>), ChannelError, - > - where - L::Target: Logger, - { + > { let funding_script = funding.get_funding_redeemscript(); let commitment_data = self.build_commitment_transaction( @@ -5061,13 +5006,10 @@ where Ok((holder_commitment_tx, commitment_data.htlcs_included)) } - fn can_send_update_fee( + fn can_send_update_fee( &self, funding: &FundingScope, feerate_per_kw: u32, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, - ) -> bool - where - L::Target: Logger, - { + ) -> bool { // Before proposing a feerate update, check that we can actually afford the new fee. let dust_exposure_limiting_feerate = self.get_dust_exposure_limiting_feerate(&fee_estimator, funding.get_channel_type()); @@ -5142,12 +5084,9 @@ where return true; } - fn can_accept_incoming_htlc( + fn can_accept_incoming_htlc( &self, funding: &FundingScope, dust_exposure_limiting_feerate: Option, logger: &L, - ) -> Result<(), LocalHTLCFailureReason> - where - L::Target: Logger, - { + ) -> Result<(), LocalHTLCFailureReason> { // The fee spike buffer (an additional nondust HTLC) we keep for the remote if the channel // is not zero fee. This deviates from the spec because the fee spike buffer requirement // doesn't exist on the receiver's side, only on the sender's. @@ -5273,9 +5212,7 @@ where /// which peer generated this transaction and "to whom" this transaction flows. #[inline] #[rustfmt::skip] - fn build_commitment_transaction(&self, funding: &FundingScope, commitment_number: u64, per_commitment_point: &PublicKey, local: bool, generated_by_local: bool, logger: &L) -> CommitmentData<'_> - where L::Target: Logger - { + fn build_commitment_transaction(&self, funding: &FundingScope, commitment_number: u64, per_commitment_point: &PublicKey, local: bool, generated_by_local: bool, logger: &L) -> CommitmentData<'_> { let broadcaster_dust_limit_sat = if local { self.holder_dust_limit_satoshis } else { self.counterparty_dust_limit_satoshis }; let feerate_per_kw = self.get_commitment_feerate(funding, generated_by_local); @@ -6128,10 +6065,10 @@ where /// Only allowed after [`FundingScope::channel_transaction_parameters`] is set. #[rustfmt::skip] - fn get_funding_signed_msg( + fn get_funding_signed_msg( &mut self, channel_parameters: &ChannelTransactionParameters, logger: &L, counterparty_initial_commitment_tx: CommitmentTransaction, - ) -> Option where L::Target: Logger { + ) -> Option { let counterparty_trusted_tx = counterparty_initial_commitment_tx.trust(); let counterparty_initial_bitcoin_tx = counterparty_trusted_tx.built_transaction(); log_trace!(logger, "Initial counterparty tx for channel {} is: txid {} tx {}", @@ -6233,12 +6170,11 @@ where } } - fn get_initial_counterparty_commitment_signatures( + fn get_initial_counterparty_commitment_signatures( &self, funding: &FundingScope, logger: &L, ) -> Option<(Signature, Vec)> where SP::Target: SignerProvider, - L::Target: Logger, { let mut commitment_number = self.counterparty_next_commitment_transaction_number; let mut commitment_point = self.counterparty_next_commitment_point.unwrap(); @@ -6278,12 +6214,11 @@ where } } - fn get_initial_commitment_signed_v2( + fn get_initial_commitment_signed_v2( &self, funding: &FundingScope, logger: &L, ) -> Option where SP::Target: SignerProvider, - L::Target: Logger, { let signatures = self.get_initial_counterparty_commitment_signatures(funding, logger); if let Some((signature, htlc_signatures)) = signatures { @@ -6330,13 +6265,10 @@ where } #[rustfmt::skip] - fn check_for_funding_tx_confirmed( + fn check_for_funding_tx_confirmed( &mut self, funding: &mut FundingScope, block_hash: &BlockHash, height: u32, index_in_block: usize, tx: &mut ConfirmedTransaction, logger: &L, - ) -> Result - where - L::Target: Logger, - { + ) -> Result { let funding_txo = match funding.get_funding_txo() { Some(funding_txo) => funding_txo, None => { @@ -7091,10 +7023,10 @@ where } #[rustfmt::skip] - fn check_remote_fee( + fn check_remote_fee( channel_type: &ChannelTypeFeatures, fee_estimator: &LowerBoundedFeeEstimator, feerate_per_kw: u32, cur_feerate_per_kw: Option, logger: &L - ) -> Result<(), ChannelError> where L::Target: Logger { + ) -> Result<(), ChannelError> { if channel_type.supports_anchor_zero_fee_commitments() { if feerate_per_kw != 0 { let err = "Zero Fee Channels must never attempt to use a fee".to_owned(); @@ -7244,11 +7176,9 @@ where /// /// The HTLC claim will end up in the holding cell (because the caller must ensure the peer is /// disconnected). - pub fn claim_htlc_while_disconnected_dropping_mon_update_legacy( + pub fn claim_htlc_while_disconnected_dropping_mon_update_legacy( &mut self, htlc_id_arg: u64, payment_preimage_arg: PaymentPreimage, logger: &L, - ) where - L::Target: Logger, - { + ) { // Assert that we'll add the HTLC claim to the holding cell in `get_update_fulfill_htlc` // (see equivalent if condition there). assert!(!self.context.channel_state.can_generate_new_commitment()); @@ -7261,14 +7191,11 @@ where } } - fn get_update_fulfill_htlc( + fn get_update_fulfill_htlc( &mut self, htlc_id_arg: u64, payment_preimage_arg: PaymentPreimage, payment_info: Option, attribution_data: Option, logger: &L, - ) -> UpdateFulfillFetch - where - L::Target: Logger, - { + ) -> UpdateFulfillFetch { // Either ChannelReady got set (which means it won't be unset) or there is no way any // caller thought we could have something claimed (cause we wouldn't have accepted in an // incoming HTLC anyway). If we got to ShutdownComplete, callers aren't allowed to call us, @@ -7415,14 +7342,11 @@ where UpdateFulfillFetch::NewClaim { monitor_update, htlc_value_msat, update_blocked: false } } - pub fn get_update_fulfill_htlc_and_commit( + pub fn get_update_fulfill_htlc_and_commit( &mut self, htlc_id: u64, payment_preimage: PaymentPreimage, payment_info: Option, attribution_data: Option, logger: &L, - ) -> UpdateFulfillCommitFetch - where - L::Target: Logger, - { + ) -> UpdateFulfillCommitFetch { let release_cs_monitor = self.context.blocked_monitor_updates.is_empty(); match self.get_update_fulfill_htlc( htlc_id, @@ -7482,12 +7406,9 @@ where /// Returns `Err` (always with [`ChannelError::Ignore`]) if the HTLC could not be failed (e.g. /// if it was already resolved). Otherwise returns `Ok`. - pub fn queue_fail_htlc( + pub fn queue_fail_htlc( &mut self, htlc_id_arg: u64, err_packet: msgs::OnionErrorPacket, logger: &L, - ) -> Result<(), ChannelError> - where - L::Target: Logger, - { + ) -> Result<(), ChannelError> { self.fail_htlc(htlc_id_arg, err_packet, true, logger) .map(|msg_opt| assert!(msg_opt.is_none(), "We forced holding cell?")) } @@ -7496,12 +7417,9 @@ where /// want to fail blinded HTLCs where we are not the intro node. /// /// See [`Self::queue_fail_htlc`] for more info. - pub fn queue_fail_malformed_htlc( + pub fn queue_fail_malformed_htlc( &mut self, htlc_id_arg: u64, failure_code: u16, sha256_of_onion: [u8; 32], logger: &L, - ) -> Result<(), ChannelError> - where - L::Target: Logger, - { + ) -> Result<(), ChannelError> { self.fail_htlc(htlc_id_arg, (sha256_of_onion, failure_code), true, logger) .map(|msg_opt| assert!(msg_opt.is_none(), "We forced holding cell?")) } @@ -7509,10 +7427,10 @@ where /// Returns `Err` (always with [`ChannelError::Ignore`]) if the HTLC could not be failed (e.g. /// if it was already resolved). Otherwise returns `Ok`. #[rustfmt::skip] - fn fail_htlc( + fn fail_htlc( &mut self, htlc_id_arg: u64, err_contents: E, mut force_holding_cell: bool, logger: &L - ) -> Result, ChannelError> where L::Target: Logger { + ) -> Result, ChannelError> { if !matches!(self.context.channel_state, ChannelState::ChannelReady(_)) { panic!("Was asked to fail an HTLC when channel was not in an operational state"); } @@ -7619,13 +7537,10 @@ where /// and the channel is now usable (and public), this may generate an announcement_signatures to /// reply with. #[rustfmt::skip] - pub fn channel_ready( + pub fn channel_ready( &mut self, msg: &msgs::ChannelReady, node_signer: &NS, chain_hash: ChainHash, user_config: &UserConfig, best_block: &BestBlock, logger: &L - ) -> Result, ChannelError> - where - L::Target: Logger - { + ) -> Result, ChannelError> { if self.context.channel_state.is_peer_disconnected() { self.context.workaround_lnd_bug_4006 = Some(msg.clone()); return Err(ChannelError::Ignore("Peer sent channel_ready when we needed a channel_reestablish. The peer is likely lnd, see https://github.com/lightningnetwork/lnd/issues/4006".to_owned())); @@ -7854,13 +7769,10 @@ where Ok(()) } - pub fn initial_commitment_signed_v2( + pub fn initial_commitment_signed_v2( &mut self, msg: &msgs::CommitmentSigned, best_block: BestBlock, signer_provider: &SP, logger: &L, - ) -> Result::EcdsaSigner>, ChannelError> - where - L::Target: Logger, - { + ) -> Result::EcdsaSigner>, ChannelError> { if let Some(signing_session) = self.context.interactive_tx_signing_session.as_ref() { if signing_session.has_received_tx_signatures() { let msg = "Received initial commitment_signed after peer's tx_signatures received!"; @@ -7924,13 +7836,10 @@ where /// Note that our `commitment_signed` send did not include a monitor update. This is due to: /// 1. Updates cannot be made since the state machine is paused until `tx_signatures`. /// 2. We're still able to abort negotiation until `tx_signatures`. - fn splice_initial_commitment_signed( + fn splice_initial_commitment_signed( &mut self, msg: &msgs::CommitmentSigned, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, - ) -> Result, ChannelError> - where - L::Target: Logger, - { + ) -> Result, ChannelError> { debug_assert!(self .context .interactive_tx_signing_session @@ -8040,13 +7949,10 @@ where (nondust_htlc_sources, dust_htlcs) } - pub fn commitment_signed( + pub fn commitment_signed( &mut self, msg: &msgs::CommitmentSigned, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, - ) -> Result, ChannelError> - where - L::Target: Logger, - { + ) -> Result, ChannelError> { self.commitment_signed_check_state()?; if !self.pending_funding().is_empty() { @@ -8083,13 +7989,10 @@ where self.commitment_signed_update_monitor(update, logger) } - pub fn commitment_signed_batch( + pub fn commitment_signed_batch( &mut self, batch: Vec, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, - ) -> Result, ChannelError> - where - L::Target: Logger, - { + ) -> Result, ChannelError> { self.commitment_signed_check_state()?; let mut messages = BTreeMap::new(); @@ -8187,12 +8090,9 @@ where Ok(()) } - fn commitment_signed_update_monitor( + fn commitment_signed_update_monitor( &mut self, mut update: ChannelMonitorUpdateStep, logger: &L, - ) -> Result, ChannelError> - where - L::Target: Logger, - { + ) -> Result, ChannelError> { if self .holder_commitment_point .advance(&self.context.holder_signer, &self.context.secp_ctx, logger) @@ -8336,12 +8236,9 @@ where /// Public version of the below, checking relevant preconditions first. /// If we're not in a state where freeing the holding cell makes sense, this is a no-op and /// returns `(None, Vec::new())`. - pub fn maybe_free_holding_cell_htlcs( + pub fn maybe_free_holding_cell_htlcs( &mut self, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, - ) -> (Option, Vec<(HTLCSource, PaymentHash)>) - where - L::Target: Logger, - { + ) -> (Option, Vec<(HTLCSource, PaymentHash)>) { if matches!(self.context.channel_state, ChannelState::ChannelReady(_)) && self.context.channel_state.can_generate_new_commitment() { @@ -8353,12 +8250,9 @@ where /// Frees any pending commitment updates in the holding cell, generating the relevant messages /// for our counterparty. - fn free_holding_cell_htlcs( + fn free_holding_cell_htlcs( &mut self, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, - ) -> (Option, Vec<(HTLCSource, PaymentHash)>) - where - L::Target: Logger, - { + ) -> (Option, Vec<(HTLCSource, PaymentHash)>) { assert!(matches!(self.context.channel_state, ChannelState::ChannelReady(_))); assert!(!self.context.channel_state.is_monitor_update_in_progress()); assert!(!self.context.channel_state.is_quiescent()); @@ -8561,7 +8455,7 @@ where /// /// [`HeldHtlcAvailable`]: crate::onion_message::async_payments::HeldHtlcAvailable /// [`ReleaseHeldHtlc`]: crate::onion_message::async_payments::ReleaseHeldHtlc - pub fn revoke_and_ack( + pub fn revoke_and_ack( &mut self, msg: &msgs::RevokeAndACK, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, hold_mon_update: bool, ) -> Result< @@ -8571,10 +8465,7 @@ where Option, ), ChannelError, - > - where - L::Target: Logger, - { + > { if self.context.channel_state.is_quiescent() { return Err(ChannelError::WarnAndDisconnect( "Got revoke_and_ack message while quiescent".to_owned(), @@ -8985,13 +8876,10 @@ where } } - fn on_tx_signatures_exchange<'a, L: Deref>( + fn on_tx_signatures_exchange<'a, L: Logger>( &mut self, funding_tx: Transaction, best_block_height: u32, logger: &WithChannelContext<'a, L>, - ) -> (Option, Option) - where - L::Target: Logger, - { + ) -> (Option, Option) { debug_assert!(!self.context.channel_state.is_monitor_update_in_progress()); debug_assert!(!self.context.channel_state.is_awaiting_remote_revoke()); @@ -9043,13 +8931,10 @@ where } } - pub fn funding_transaction_signed( + pub fn funding_transaction_signed( &mut self, funding_txid_signed: Txid, witnesses: Vec, best_block_height: u32, logger: &L, - ) -> Result - where - L::Target: Logger, - { + ) -> Result { let signing_session = if let Some(signing_session) = self.context.interactive_tx_signing_session.as_mut() { if let Some(pending_splice) = self.pending_splice.as_ref() { @@ -9144,12 +9029,9 @@ where Ok(FundingTxSigned { tx_signatures, funding_tx, splice_negotiated, splice_locked }) } - pub fn tx_signatures( + pub fn tx_signatures( &mut self, msg: &msgs::TxSignatures, best_block_height: u32, logger: &L, - ) -> Result - where - L::Target: Logger, - { + ) -> Result { let signing_session = if let Some(signing_session) = self.context.interactive_tx_signing_session.as_mut() { @@ -9219,11 +9101,9 @@ where /// Queues up an outbound update fee by placing it in the holding cell. You should call /// [`Self::maybe_free_holding_cell_htlcs`] in order to actually generate and send the /// commitment update. - pub fn queue_update_fee( + pub fn queue_update_fee( &mut self, feerate_per_kw: u32, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, - ) where - L::Target: Logger, - { + ) { let msg_opt = self.send_update_fee(feerate_per_kw, true, fee_estimator, logger); assert!(msg_opt.is_none(), "We forced holding cell?"); } @@ -9236,10 +9116,10 @@ where /// You MUST call [`Self::send_commitment_no_state_update`] prior to any other calls on this /// [`FundedChannel`] if `force_holding_cell` is false. #[rustfmt::skip] - fn send_update_fee( + fn send_update_fee( &mut self, feerate_per_kw: u32, mut force_holding_cell: bool, fee_estimator: &LowerBoundedFeeEstimator, logger: &L - ) -> Option where L::Target: Logger { + ) -> Option { if !self.funding.is_outbound() { panic!("Cannot send fee from inbound channel"); } @@ -9289,7 +9169,7 @@ where /// completed. /// May return `Err(())`, which implies [`ChannelContext::force_shutdown`] should be called immediately. #[rustfmt::skip] - fn remove_uncommitted_htlcs_and_mark_paused(&mut self, logger: &L) -> Result<(), ()> where L::Target: Logger { + fn remove_uncommitted_htlcs_and_mark_paused(&mut self, logger: &L) -> Result<(), ()> { assert!(!matches!(self.context.channel_state, ChannelState::ShutdownComplete)); if !self.context.can_resume_on_reconnect() { return Err(()) @@ -9375,14 +9255,12 @@ where /// [`ChannelManager`]: super::channelmanager::ChannelManager /// [`chain::Watch`]: crate::chain::Watch /// [`ChannelMonitorUpdateStatus::InProgress`]: crate::chain::ChannelMonitorUpdateStatus::InProgress - fn monitor_updating_paused( + fn monitor_updating_paused( &mut self, resend_raa: bool, resend_commitment: bool, resend_channel_ready: bool, pending_forwards: Vec<(PendingHTLCInfo, u64)>, pending_fails: Vec<(HTLCSource, PaymentHash, HTLCFailReason)>, pending_finalized_claimed_htlcs: Vec<(HTLCSource, Option)>, logger: &L, - ) where - L::Target: Logger, - { + ) { log_trace!(logger, "Pausing channel monitor updates"); self.context.monitor_pending_revoke_and_ack |= resend_raa; @@ -9398,12 +9276,11 @@ where /// successfully and we should restore normal operation. Returns messages which should be sent /// to the remote side. #[rustfmt::skip] - pub fn monitor_updating_restored( + pub fn monitor_updating_restored( &mut self, logger: &L, node_signer: &NS, chain_hash: ChainHash, user_config: &UserConfig, best_block_height: u32, path_for_release_htlc: CBP ) -> MonitorRestoreUpdates where - L::Target: Logger, CBP: Fn(u64) -> BlindedMessagePath { assert!(self.context.channel_state.is_monitor_update_in_progress()); @@ -9532,9 +9409,7 @@ where } #[rustfmt::skip] - pub fn update_fee(&mut self, fee_estimator: &LowerBoundedFeeEstimator, msg: &msgs::UpdateFee, logger: &L) -> Result<(), ChannelError> - where L::Target: Logger - { + pub fn update_fee(&mut self, fee_estimator: &LowerBoundedFeeEstimator, msg: &msgs::UpdateFee, logger: &L) -> Result<(), ChannelError> { if self.funding.is_outbound() { return Err(ChannelError::close("Non-funding remote tried to update channel fee".to_owned())); } @@ -9560,9 +9435,9 @@ where /// Indicates that the signer may have some signatures for us, so we should retry if we're /// blocked. #[rustfmt::skip] - pub fn signer_maybe_unblocked( + pub fn signer_maybe_unblocked( &mut self, logger: &L, path_for_release_htlc: CBP - ) -> Result where L::Target: Logger, CBP: Fn(u64) -> BlindedMessagePath { + ) -> Result where CBP: Fn(u64) -> BlindedMessagePath { if let Some((commitment_number, commitment_secret)) = self.context.signer_pending_stale_state_verification.clone() { if let Ok(expected_point) = self.context.holder_signer.as_ref() .get_per_commitment_point(commitment_number, &self.context.secp_ctx) @@ -9672,11 +9547,10 @@ where }) } - fn get_last_revoke_and_ack( + fn get_last_revoke_and_ack( &mut self, path_for_release_htlc: CBP, logger: &L, ) -> Option where - L::Target: Logger, CBP: Fn(u64) -> BlindedMessagePath, { debug_assert!( @@ -9731,12 +9605,9 @@ where } /// Gets the last commitment update for immediate sending to our peer. - fn get_last_commitment_update_for_send( + fn get_last_commitment_update_for_send( &mut self, logger: &L, - ) -> Result - where - L::Target: Logger, - { + ) -> Result { let mut update_add_htlcs = Vec::new(); let mut update_fulfill_htlcs = Vec::new(); let mut update_fail_htlcs = Vec::new(); @@ -9848,10 +9719,7 @@ where } } - fn panic_on_stale_state(logger: &L) - where - L::Target: Logger, - { + fn panic_on_stale_state(logger: &L) { macro_rules! log_and_panic { ($err_msg: expr) => { log_error!(logger, $err_msg); @@ -9870,13 +9738,12 @@ where /// May panic if some calls other than message-handling calls (which will all Err immediately) /// have been called between remove_uncommitted_htlcs_and_mark_paused and this call. #[rustfmt::skip] - pub fn channel_reestablish( + pub fn channel_reestablish( &mut self, msg: &msgs::ChannelReestablish, logger: &L, node_signer: &NS, chain_hash: ChainHash, user_config: &UserConfig, best_block: &BestBlock, path_for_release_htlc: CBP, ) -> Result where - L::Target: Logger, CBP: Fn(u64) -> BlindedMessagePath { if !self.context.channel_state.is_peer_disconnected() { @@ -10344,11 +10211,9 @@ where Ok(()) } - pub fn maybe_propose_closing_signed( + pub fn maybe_propose_closing_signed( &mut self, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, ) -> Result<(Option, Option<(Transaction, ShutdownResult)>), ChannelError> - where - L::Target: Logger, { // If we're waiting on a monitor persistence, that implies we're also waiting to send some // message to our counterparty (probably a `revoke_and_ack`). In such a case, we shouldn't @@ -10428,16 +10293,13 @@ where } } - pub fn shutdown( + pub fn shutdown( &mut self, logger: &L, signer_provider: &SP, their_features: &InitFeatures, msg: &msgs::Shutdown, ) -> Result< (Option, Option, Vec<(HTLCSource, PaymentHash)>), ChannelError, - > - where - L::Target: Logger, - { + > { if self.context.channel_state.is_peer_disconnected() { return Err(ChannelError::close( "Peer sent shutdown when we needed a channel_reestablish".to_owned(), @@ -10609,13 +10471,10 @@ where tx } - fn get_closing_signed_msg( + fn get_closing_signed_msg( &mut self, closing_tx: &ClosingTransaction, skip_remote_output: bool, fee_satoshis: u64, min_fee_satoshis: u64, max_fee_satoshis: u64, logger: &L, - ) -> Option - where - L::Target: Logger, - { + ) -> Option { let sig = match &self.context.holder_signer { ChannelSignerType::Ecdsa(ecdsa) => ecdsa .sign_closing_transaction( @@ -10670,12 +10529,10 @@ where } } - pub fn closing_signed( + pub fn closing_signed( &mut self, fee_estimator: &LowerBoundedFeeEstimator, msg: &msgs::ClosingSigned, logger: &L, ) -> Result<(Option, Option<(Transaction, ShutdownResult)>), ChannelError> - where - L::Target: Logger, { if self.is_shutdown_pending_signature() { return Err(ChannelError::Warn(String::from("Remote end sent us a closing_signed while fully shutdown and just waiting on the final closing signature"))); @@ -10919,9 +10776,9 @@ where /// When this function is called, the HTLC is already irrevocably committed to the channel; /// this function determines whether to fail the HTLC, or forward / claim it. #[rustfmt::skip] - pub fn can_accept_incoming_htlc( + pub fn can_accept_incoming_htlc( &self, fee_estimator: &LowerBoundedFeeEstimator, logger: L - ) -> Result<(), LocalHTLCFailureReason> where L::Target: Logger { + ) -> Result<(), LocalHTLCFailureReason> { if self.context.channel_state.is_local_shutdown_sent() { return Err(LocalHTLCFailureReason::ChannelClosed) } @@ -11132,9 +10989,7 @@ where } #[rustfmt::skip] - fn check_get_channel_ready(&mut self, height: u32, logger: &L) -> Option - where L::Target: Logger - { + fn check_get_channel_ready(&mut self, height: u32, logger: &L) -> Option { // Called: // * always when a new block/transactions are confirmed with the new height // * when funding is signed with a height of 0 @@ -11191,9 +11046,9 @@ where } #[rustfmt::skip] - fn get_channel_ready( + fn get_channel_ready( &mut self, logger: &L - ) -> Option where L::Target: Logger { + ) -> Option { if self.holder_commitment_point.can_advance() { self.context.signer_pending_channel_ready = false; Some(msgs::ChannelReady { @@ -11213,13 +11068,10 @@ where } /// Returns `Some` if a splice [`FundingScope`] was promoted. - fn maybe_promote_splice_funding( + fn maybe_promote_splice_funding( &mut self, node_signer: &NS, chain_hash: ChainHash, user_config: &UserConfig, block_height: u32, logger: &L, - ) -> Option - where - L::Target: Logger, - { + ) -> Option { debug_assert!(self.pending_splice.is_some()); let pending_splice = self.pending_splice.as_mut().unwrap(); @@ -11333,13 +11185,10 @@ where /// In the first case, we store the confirmation height and calculating the short channel id. /// In the second, we simply return an Err indicating we need to be force-closed now. #[rustfmt::skip] - pub fn transactions_confirmed( + pub fn transactions_confirmed( &mut self, block_hash: &BlockHash, height: u32, txdata: &TransactionData, chain_hash: ChainHash, node_signer: &NS, user_config: &UserConfig, logger: &L - ) -> Result<(Option, Option), ClosureReason> - where - L::Target: Logger - { + ) -> Result<(Option, Option), ClosureReason> { for &(index_in_block, tx) in txdata.iter() { let mut confirmed_tx = ConfirmedTransaction::from(tx); @@ -11430,13 +11279,10 @@ where /// /// May return some HTLCs (and their payment_hash) which have timed out and should be failed /// back. - pub fn best_block_updated( + pub fn best_block_updated( &mut self, height: u32, highest_header_time: Option, chain_hash: ChainHash, node_signer: &NS, user_config: &UserConfig, logger: &L, - ) -> Result - where - L::Target: Logger, - { + ) -> Result { self.do_best_block_updated( height, highest_header_time, @@ -11446,13 +11292,10 @@ where } #[rustfmt::skip] - fn do_best_block_updated( + fn do_best_block_updated( &mut self, height: u32, highest_header_time: Option, chain_node_signer: Option<(ChainHash, &NS, &UserConfig)>, logger: &L - ) -> Result<(Option, Vec<(HTLCSource, PaymentHash)>, Option), ClosureReason> - where - L::Target: Logger - { + ) -> Result<(Option, Vec<(HTLCSource, PaymentHash)>, Option), ClosureReason> { let mut timed_out_htlcs = Vec::new(); // This mirrors the check in ChannelManager::decode_update_add_htlc_onion, refusing to // forward an HTLC when our counterparty should almost certainly just fail it for expiring @@ -11628,12 +11471,9 @@ where /// before the channel has reached channel_ready or splice_locked, and we can just wait for more /// blocks. #[rustfmt::skip] - pub fn transaction_unconfirmed( + pub fn transaction_unconfirmed( &mut self, txid: &Txid, logger: &L, - ) -> Result<(), ClosureReason> - where - L::Target: Logger, - { + ) -> Result<(), ClosureReason> { let unconfirmed_funding = self .funding_and_pending_funding_iter_mut() .find(|funding| funding.get_funding_txid() == Some(*txid)); @@ -11710,13 +11550,10 @@ where } #[rustfmt::skip] - fn get_announcement_sigs( + fn get_announcement_sigs( &mut self, node_signer: &NS, chain_hash: ChainHash, user_config: &UserConfig, best_block_height: u32, logger: &L - ) -> Option - where - L::Target: Logger - { + ) -> Option { if self.funding.funding_tx_confirmation_height == 0 || self.funding.funding_tx_confirmation_height + 5 > best_block_height { return None; } @@ -11923,7 +11760,7 @@ where /// May panic if called on a channel that wasn't immediately-previously /// self.remove_uncommitted_htlcs_and_mark_paused()'d #[rustfmt::skip] - fn get_channel_reestablish(&mut self, logger: &L) -> msgs::ChannelReestablish where L::Target: Logger { + fn get_channel_reestablish(&mut self, logger: &L) -> msgs::ChannelReestablish { assert!(self.context.channel_state.is_peer_disconnected()); assert_ne!(self.context.counterparty_next_commitment_transaction_number, INITIAL_COMMITMENT_NUMBER); // This is generally the first function which gets called on any given channel once we're @@ -11980,13 +11817,10 @@ where /// Includes the witness weight for this input (e.g. P2WPKH_WITNESS_WEIGHT=109 for typical P2WPKH inputs). /// - `change_script`: an option change output script. If `None` and needed, one will be /// generated by `SignerProvider::get_destination_script`. - pub fn splice_channel( + pub fn splice_channel( &mut self, contribution: SpliceContribution, funding_feerate_per_kw: u32, locktime: u32, logger: &L, - ) -> Result, APIError> - where - L::Target: Logger, - { + ) -> Result, APIError> { if self.holder_commitment_point.current_point().is_none() { return Err(APIError::APIMisuseError { err: format!( @@ -12329,13 +12163,10 @@ where Ok(()) } - pub(crate) fn splice_init( + pub(crate) fn splice_init( &mut self, msg: &msgs::SpliceInit, our_funding_contribution_satoshis: i64, signer_provider: &SP, entropy_source: &ES, holder_node_id: &PublicKey, logger: &L, - ) -> Result - where - L::Target: Logger, - { + ) -> Result { let our_funding_contribution = SignedAmount::from_sat(our_funding_contribution_satoshis); let splice_funding = self.validate_splice_init(msg, our_funding_contribution)?; @@ -12399,13 +12230,10 @@ where }) } - pub(crate) fn splice_ack( + pub(crate) fn splice_ack( &mut self, msg: &msgs::SpliceAck, signer_provider: &SP, entropy_source: &ES, holder_node_id: &PublicKey, logger: &L, - ) -> Result, ChannelError> - where - L::Target: Logger, - { + ) -> Result, ChannelError> { let splice_funding = self.validate_splice_ack(msg)?; log_info!( @@ -12552,13 +12380,10 @@ where Ok((holder_balance_floor, counterparty_balance_floor)) } - pub fn splice_locked( + pub fn splice_locked( &mut self, msg: &msgs::SpliceLocked, node_signer: &NS, chain_hash: ChainHash, user_config: &UserConfig, block_height: u32, logger: &L, - ) -> Result, ChannelError> - where - L::Target: Logger, - { + ) -> Result, ChannelError> { log_info!(logger, "Received splice_locked txid {} from our peer", msg.splice_txid,); let pending_splice = match self.pending_splice.as_mut() { @@ -12599,15 +12424,12 @@ where /// Queues up an outbound HTLC to send by placing it in the holding cell. You should call /// [`Self::maybe_free_holding_cell_htlcs`] in order to actually generate and send the /// commitment update. - pub fn queue_add_htlc( + pub fn queue_add_htlc( &mut self, amount_msat: u64, payment_hash: PaymentHash, cltv_expiry: u32, source: HTLCSource, onion_routing_packet: msgs::OnionPacket, skimmed_fee_msat: Option, blinding_point: Option, accountable: bool, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, - ) -> Result<(), (LocalHTLCFailureReason, String)> - where - L::Target: Logger, - { + ) -> Result<(), (LocalHTLCFailureReason, String)> { self.send_htlc( amount_msat, payment_hash, @@ -12647,15 +12469,12 @@ where /// on this [`FundedChannel`] if `force_holding_cell` is false. /// /// `Err`'s will always be temporary channel failures. - fn send_htlc( + fn send_htlc( &mut self, amount_msat: u64, payment_hash: PaymentHash, cltv_expiry: u32, source: HTLCSource, onion_routing_packet: msgs::OnionPacket, mut force_holding_cell: bool, skimmed_fee_msat: Option, blinding_point: Option, hold_htlc: bool, accountable: bool, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, - ) -> Result - where - L::Target: Logger, - { + ) -> Result { if !matches!(self.context.channel_state, ChannelState::ChannelReady(_)) || self.context.channel_state.is_local_shutdown_sent() || self.context.channel_state.is_remote_shutdown_sent() @@ -12780,10 +12599,7 @@ where .expect("At least one FundingScope is always provided") } - fn build_commitment_no_status_check(&mut self, logger: &L) -> ChannelMonitorUpdate - where - L::Target: Logger, - { + fn build_commitment_no_status_check(&mut self, logger: &L) -> ChannelMonitorUpdate { log_trace!(logger, "Updating HTLC state for a newly-sent commitment_signed..."); // We can upgrade the status of some HTLCs that are waiting on a commitment, even if we // fail to generate this, we still are at least at a position where upgrading their status @@ -12901,12 +12717,9 @@ where } #[rustfmt::skip] - fn build_commitment_no_state_update( + fn build_commitment_no_state_update( &self, funding: &FundingScope, logger: &L, - ) -> (Vec<(HTLCOutputInCommitment, Option<&HTLCSource>)>, CommitmentTransaction) - where - L::Target: Logger, - { + ) -> (Vec<(HTLCOutputInCommitment, Option<&HTLCSource>)>, CommitmentTransaction) { let commitment_data = self.context.build_commitment_transaction( funding, self.context.counterparty_next_commitment_transaction_number, &self.context.counterparty_next_commitment_point.unwrap(), false, true, logger, @@ -12918,12 +12731,9 @@ where /// Only fails in case of signer rejection. Used for channel_reestablish commitment_signed /// generation when we shouldn't change HTLC/channel state. - fn send_commitment_no_state_update( + fn send_commitment_no_state_update( &self, logger: &L, - ) -> Result, ChannelError> - where - L::Target: Logger, - { + ) -> Result, ChannelError> { core::iter::once(&self.funding) .chain(self.pending_funding().iter()) .map(|funding| self.send_commitment_no_state_update_for_funding(funding, logger)) @@ -12931,12 +12741,9 @@ where } #[rustfmt::skip] - fn send_commitment_no_state_update_for_funding( + fn send_commitment_no_state_update_for_funding( &self, funding: &FundingScope, logger: &L, - ) -> Result - where - L::Target: Logger, - { + ) -> Result { // Get the fee tests from `build_commitment_no_state_update` #[cfg(any(test, fuzzing))] self.build_commitment_no_state_update(funding, logger); @@ -12999,15 +12806,12 @@ where /// /// Shorthand for calling [`Self::send_htlc`] followed by a commitment update, see docs on /// [`Self::send_htlc`] and [`Self::build_commitment_no_state_update`] for more info. - pub fn send_htlc_and_commit( + pub fn send_htlc_and_commit( &mut self, amount_msat: u64, payment_hash: PaymentHash, cltv_expiry: u32, source: HTLCSource, onion_routing_packet: msgs::OnionPacket, skimmed_fee_msat: Option, hold_htlc: bool, accountable: bool, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, - ) -> Result, ChannelError> - where - L::Target: Logger, - { + ) -> Result, ChannelError> { let send_res = self.send_htlc( amount_msat, payment_hash, @@ -13060,17 +12864,14 @@ where /// Begins the shutdown process, getting a message for the remote peer and returning all /// holding cell HTLCs for payment failure. - pub fn get_shutdown( + pub fn get_shutdown( &mut self, signer_provider: &SP, their_features: &InitFeatures, target_feerate_sats_per_kw: Option, override_shutdown_script: Option, logger: &L, ) -> Result< (msgs::Shutdown, Option, Vec<(HTLCSource, PaymentHash)>), APIError, - > - where - L::Target: Logger, - { + > { let logger = WithChannelContext::from(logger, &self.context, None); if self.context.channel_state.is_local_stfu_sent() @@ -13222,12 +13023,9 @@ where } #[rustfmt::skip] - pub fn propose_quiescence( + pub fn propose_quiescence( &mut self, logger: &L, action: QuiescentAction, - ) -> Result, &'static str> - where - L::Target: Logger, - { + ) -> Result, &'static str> { log_debug!(logger, "Attempting to initiate quiescence"); if !self.context.is_usable() { @@ -13263,10 +13061,7 @@ where // Assumes we are either awaiting quiescence or our counterparty has requested quiescence. #[rustfmt::skip] - pub fn send_stfu(&mut self, logger: &L) -> Result - where - L::Target: Logger, - { + pub fn send_stfu(&mut self, logger: &L) -> Result { debug_assert!(!self.context.channel_state.is_local_stfu_sent()); debug_assert!( self.context.channel_state.is_awaiting_quiescence() @@ -13301,9 +13096,9 @@ where } #[rustfmt::skip] - pub fn stfu( + pub fn stfu( &mut self, msg: &msgs::Stfu, logger: &L - ) -> Result, ChannelError> where L::Target: Logger { + ) -> Result, ChannelError> { if self.context.channel_state.is_quiescent() { return Err(ChannelError::Warn("Channel is already quiescent".to_owned())); } @@ -13404,12 +13199,9 @@ where Ok(None) } - pub fn try_send_stfu( + pub fn try_send_stfu( &mut self, logger: &L, - ) -> Result, ChannelError> - where - L::Target: Logger, - { + ) -> Result, ChannelError> { // We must never see both stfu flags set, we always set the quiescent flag instead. debug_assert!( !(self.context.channel_state.is_local_stfu_sent() @@ -13503,11 +13295,11 @@ where #[allow(dead_code)] // TODO(dual_funding): Remove once opending V2 channels is enabled. #[rustfmt::skip] - pub fn new( + pub fn new( fee_estimator: &LowerBoundedFeeEstimator, entropy_source: &ES, signer_provider: &SP, counterparty_node_id: PublicKey, their_features: &InitFeatures, channel_value_satoshis: u64, push_msat: u64, user_id: u128, config: &UserConfig, current_chain_height: u32, outbound_scid_alias: u64, temporary_channel_id: Option, logger: L - ) -> Result, APIError> where L::Target: Logger { + ) -> Result, APIError> { let holder_selected_channel_reserve_satoshis = get_holder_selected_channel_reserve_satoshis(channel_value_satoshis, config); if holder_selected_channel_reserve_satoshis < MIN_CHAN_DUST_LIMIT_SATOSHIS { // Protocol level safety check in place, although it should never happen because @@ -13554,7 +13346,7 @@ where /// Only allowed after [`FundingScope::channel_transaction_parameters`] is set. #[rustfmt::skip] - fn get_funding_created_msg(&mut self, logger: &L) -> Option where L::Target: Logger { + fn get_funding_created_msg(&mut self, logger: &L) -> Option { let commitment_data = self.context.build_commitment_transaction(&self.funding, self.context.counterparty_next_commitment_transaction_number, &self.context.counterparty_next_commitment_point.unwrap(), false, false, logger); @@ -13599,8 +13391,8 @@ where /// Do NOT broadcast the funding transaction until after a successful funding_signed call! /// If an Err is returned, it is a ChannelError::Close. #[rustfmt::skip] - pub fn get_funding_created(&mut self, funding_transaction: Transaction, funding_txo: OutPoint, is_batch_funding: bool, logger: &L) - -> Result, (Self, ChannelError)> where L::Target: Logger { + pub fn get_funding_created(&mut self, funding_transaction: Transaction, funding_txo: OutPoint, is_batch_funding: bool, logger: &L) + -> Result, (Self, ChannelError)> { if !self.funding.is_outbound() { panic!("Tried to create outbound funding_created message on an inbound channel!"); } @@ -13639,10 +13431,10 @@ where /// not of our ability to open any channel at all. Thus, on error, we should first call this /// and see if we get a new `OpenChannel` message, otherwise the channel is failed. #[rustfmt::skip] - pub(crate) fn maybe_handle_error_without_close( + pub(crate) fn maybe_handle_error_without_close( &mut self, chain_hash: ChainHash, fee_estimator: &LowerBoundedFeeEstimator, logger: &L, user_config: &UserConfig, their_features: &InitFeatures, - ) -> Result where L::Target: Logger, { + ) -> Result { self.context.maybe_downgrade_channel_features( &mut self.funding, fee_estimator, user_config, their_features, )?; @@ -13656,9 +13448,9 @@ where } #[rustfmt::skip] - pub fn get_open_channel( + pub fn get_open_channel( &mut self, chain_hash: ChainHash, _logger: &L - ) -> Option where L::Target: Logger { + ) -> Option { if !self.funding.is_outbound() { panic!("Tried to open a channel for an inbound channel?"); } @@ -13728,16 +13520,13 @@ where /// Handles a funding_signed message from the remote end. /// If this call is successful, broadcast the funding transaction (and not before!) - pub fn funding_signed( + pub fn funding_signed( mut self, msg: &msgs::FundingSigned, best_block: BestBlock, signer_provider: &SP, logger: &L, ) -> Result< (FundedChannel, ChannelMonitor<::EcdsaSigner>), (OutboundV1Channel, ChannelError), - > - where - L::Target: Logger, - { + > { if !self.funding.is_outbound() { let err = "Received funding_signed for an inbound channel?"; return Err((self, ChannelError::close(err.to_owned()))); @@ -13801,9 +13590,9 @@ where /// Indicates that the signer may have some signatures for us, so we should retry if we're /// blocked. #[rustfmt::skip] - pub fn signer_maybe_unblocked( + pub fn signer_maybe_unblocked( &mut self, chain_hash: ChainHash, logger: &L - ) -> (Option, Option) where L::Target: Logger { + ) -> (Option, Option) { // If we were pending a commitment point, retry the signer and advance to an // available state. if self.unfunded_context.holder_commitment_point.is_none() { @@ -13887,12 +13676,12 @@ where /// Creates a new channel from a remote sides' request for one. /// Assumes chain_hash has already been checked and corresponds with what we expect! #[rustfmt::skip] - pub fn new( + pub fn new( fee_estimator: &LowerBoundedFeeEstimator, entropy_source: &ES, signer_provider: &SP, counterparty_node_id: PublicKey, our_supported_features: &ChannelTypeFeatures, their_features: &InitFeatures, msg: &msgs::OpenChannel, user_id: u128, config: &UserConfig, current_chain_height: u32, logger: &L, is_0conf: bool, - ) -> Result, ChannelError> where L::Target: Logger { + ) -> Result, ChannelError> { let logger = WithContext::from(logger, Some(counterparty_node_id), Some(msg.common_fields.temporary_channel_id), None); // First check the channel type is known, failing before we do anything else if we don't @@ -13940,10 +13729,7 @@ where /// should be sent back to the counterparty node. /// /// [`msgs::AcceptChannel`]: crate::ln::msgs::AcceptChannel - pub fn accept_inbound_channel(&mut self, logger: &L) -> Option - where - L::Target: Logger, - { + pub fn accept_inbound_channel(&mut self, logger: &L) -> Option { if self.funding.is_outbound() { panic!("Tried to send accept_channel for an outbound channel?"); } @@ -13966,9 +13752,9 @@ where /// /// [`msgs::AcceptChannel`]: crate::ln::msgs::AcceptChannel #[rustfmt::skip] - fn generate_accept_channel_message( + fn generate_accept_channel_message( &mut self, _logger: &L - ) -> Option where L::Target: Logger { + ) -> Option { let first_per_commitment_point = match self.unfunded_context.holder_commitment_point { Some(holder_commitment_point) if holder_commitment_point.can_advance() => { self.signer_pending_accept_channel = false; @@ -14014,16 +13800,13 @@ where /// /// [`msgs::AcceptChannel`]: crate::ln::msgs::AcceptChannel #[cfg(test)] - pub fn get_accept_channel_message( + pub fn get_accept_channel_message( &mut self, logger: &L, - ) -> Option - where - L::Target: Logger, - { + ) -> Option { self.generate_accept_channel_message(logger) } - pub fn funding_created( + pub fn funding_created( mut self, msg: &msgs::FundingCreated, best_block: BestBlock, signer_provider: &SP, logger: &L, ) -> Result< @@ -14033,10 +13816,7 @@ where ChannelMonitor<::EcdsaSigner>, ), (Self, ChannelError), - > - where - L::Target: Logger, - { + > { if self.funding.is_outbound() { let err = "Received funding_created for an outbound channel?"; return Err((self, ChannelError::close(err.to_owned()))); @@ -14120,9 +13900,9 @@ where /// Indicates that the signer may have some signatures for us, so we should retry if we're /// blocked. #[rustfmt::skip] - pub fn signer_maybe_unblocked( + pub fn signer_maybe_unblocked( &mut self, logger: &L - ) -> Option where L::Target: Logger { + ) -> Option { if self.unfunded_context.holder_commitment_point.is_none() { self.unfunded_context.holder_commitment_point = HolderCommitmentPoint::new(&self.context.holder_signer, &self.context.secp_ctx); } @@ -14157,13 +13937,13 @@ where { #[allow(dead_code)] // TODO(dual_funding): Remove once creating V2 channels is enabled. #[rustfmt::skip] - pub fn new_outbound( + pub fn new_outbound( fee_estimator: &LowerBoundedFeeEstimator, entropy_source: &ES, signer_provider: &SP, counterparty_node_id: PublicKey, their_features: &InitFeatures, funding_satoshis: u64, funding_inputs: Vec, user_id: u128, config: &UserConfig, current_chain_height: u32, outbound_scid_alias: u64, funding_confirmation_target: ConfirmationTarget, logger: L, - ) -> Result where L::Target: Logger { + ) -> Result { let channel_keys_id = signer_provider.generate_channel_keys_id(false, user_id); let holder_signer = signer_provider.derive_channel_signer(channel_keys_id); @@ -14299,12 +14079,12 @@ where /// TODO(dual_funding): Allow contributions, pass intended amount and inputs #[allow(dead_code)] // TODO(dual_funding): Remove once V2 channels is enabled. #[rustfmt::skip] - pub fn new_inbound( + pub fn new_inbound( fee_estimator: &LowerBoundedFeeEstimator, entropy_source: &ES, signer_provider: &SP, holder_node_id: PublicKey, counterparty_node_id: PublicKey, our_supported_features: &ChannelTypeFeatures, their_features: &InitFeatures, msg: &msgs::OpenChannelV2, user_id: u128, config: &UserConfig, current_chain_height: u32, logger: &L, - ) -> Result where L::Target: Logger, { + ) -> Result { // TODO(dual_funding): Take these as input once supported let (our_funding_contribution, our_funding_contribution_sats) = (SignedAmount::ZERO, 0u64); let our_funding_inputs = Vec::new(); diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs index aabeb159849..74a3330ba6b 100644 --- a/lightning/src/ln/channelmanager.rs +++ b/lightning/src/ln/channelmanager.rs @@ -1169,12 +1169,10 @@ impl ClaimablePayments { /// /// If no payment is found, `Err(Vec::new())` is returned. #[rustfmt::skip] - fn begin_claiming_payment( + fn begin_claiming_payment( &mut self, payment_hash: PaymentHash, node_signer: &S, logger: &L, inbound_payment_id_secret: &[u8; 32], custom_tlvs_known: bool, - ) -> Result<(Vec, ClaimingPayment), Vec> - where L::Target: Logger, - { + ) -> Result<(Vec, ClaimingPayment), Vec> { match self.claimable_payments.remove(&payment_hash) { Some(payment) => { let mut receiver_node_id = node_signer.get_node_id(Recipient::Node) @@ -1794,9 +1792,7 @@ pub trait AChannelManager { /// A type implementing [`MessageRouter`]. type MessageRouter: MessageRouter; /// A type implementing [`Logger`]. - type Logger: Logger + ?Sized; - /// A type that may be dereferenced to [`Self::Logger`]. - type L: Deref; + type Logger: Logger; /// Returns a reference to the actual [`ChannelManager`] object. fn get_cm( &self, @@ -1809,7 +1805,7 @@ pub trait AChannelManager { Self::FeeEstimator, Self::Router, Self::MessageRouter, - Self::L, + Self::Logger, >; } @@ -1822,12 +1818,11 @@ impl< F: FeeEstimator, R: Router, MR: MessageRouter, - L: Deref, + L: Logger, > AChannelManager for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - L::Target: Logger, { type Watch = M::Target; type M = M; @@ -1840,8 +1835,7 @@ where type FeeEstimator = F; type Router = R; type MessageRouter = MR; - type Logger = L::Target; - type L = L; + type Logger = L; fn get_cm(&self) -> &ChannelManager { self } @@ -2635,11 +2629,10 @@ pub struct ChannelManager< F: FeeEstimator, R: Router, MR: MessageRouter, - L: Deref, + L: Logger, > where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - L::Target: Logger, { config: RwLock, chain_hash: ChainHash, @@ -3705,12 +3698,11 @@ impl< F: FeeEstimator, R: Router, MR: MessageRouter, - L: Deref, + L: Logger, > ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - L::Target: Logger, { /// Constructs a new `ChannelManager` to hold several channels and route between them. /// @@ -3948,7 +3940,7 @@ where }; match OutboundV1Channel::new(&self.fee_estimator, &self.entropy_source, &self.signer_provider, their_network_key, their_features, channel_value_satoshis, push_msat, user_channel_id, config, - self.best_block.read().unwrap().height, outbound_scid_alias, temporary_channel_id, &*self.logger) + self.best_block.read().unwrap().height, outbound_scid_alias, temporary_channel_id, &self.logger) { Ok(res) => res, Err(e) => { @@ -7052,7 +7044,7 @@ where match decode_incoming_update_add_htlc_onion( &update_add_htlc, &self.node_signer, - &*self.logger, + &self.logger, &self.secp_ctx, ) { Ok(decoded_onion) => decoded_onion, @@ -13168,12 +13160,11 @@ impl< F: FeeEstimator, R: Router, MR: MessageRouter, - L: Deref, + L: Logger, > ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - L::Target: Logger, { #[cfg(not(c_bindings))] create_offer_builder!(self, OfferBuilder<'_, DerivedMetadata, secp256k1::All>); @@ -14014,12 +14005,11 @@ impl< F: FeeEstimator, R: Router, MR: MessageRouter, - L: Deref, + L: Logger, > BaseMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - L::Target: Logger, { fn provided_node_features(&self) -> NodeFeatures { provided_node_features(&self.config.read().unwrap()) @@ -14366,12 +14356,11 @@ impl< F: FeeEstimator, R: Router, MR: MessageRouter, - L: Deref, + L: Logger, > EventsProvider for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - L::Target: Logger, { /// Processes events that must be periodically handled. /// @@ -14395,12 +14384,11 @@ impl< F: FeeEstimator, R: Router, MR: MessageRouter, - L: Deref, + L: Logger, > chain::Listen for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - L::Target: Logger, { fn filtered_block_connected(&self, header: &Header, txdata: &TransactionData, height: u32) { { @@ -14450,12 +14438,11 @@ impl< F: FeeEstimator, R: Router, MR: MessageRouter, - L: Deref, + L: Logger, > chain::Confirm for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - L::Target: Logger, { #[rustfmt::skip] fn transactions_confirmed(&self, header: &Header, txdata: &TransactionData, height: u32) { @@ -14617,12 +14604,11 @@ impl< F: FeeEstimator, R: Router, MR: MessageRouter, - L: Deref, + L: Logger, > ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - L::Target: Logger, { /// Calls a function which handles an on-chain event (blocks dis/connected, transactions /// un/confirmed, etc) on each channel, handling any resulting errors or messages generated by @@ -14973,12 +14959,11 @@ impl< F: FeeEstimator, R: Router, MR: MessageRouter, - L: Deref, + L: Logger, > ChannelMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - L::Target: Logger, { fn handle_open_channel(&self, counterparty_node_id: PublicKey, message: &msgs::OpenChannel) { // Note that we never need to persist the updated ChannelManager for an inbound @@ -15542,12 +15527,11 @@ impl< F: FeeEstimator, R: Router, MR: MessageRouter, - L: Deref, + L: Logger, > OffersMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - L::Target: Logger, { #[rustfmt::skip] fn handle_message( @@ -15754,12 +15738,11 @@ impl< F: FeeEstimator, R: Router, MR: MessageRouter, - L: Deref, + L: Logger, > AsyncPaymentsMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - L::Target: Logger, { fn handle_offer_paths_request( &self, message: OfferPathsRequest, context: AsyncPaymentsContext, @@ -15950,12 +15933,11 @@ impl< F: FeeEstimator, R: Router, MR: MessageRouter, - L: Deref, + L: Logger, > DNSResolverMessageHandler for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - L::Target: Logger, { fn handle_dnssec_query( &self, _message: DNSSECQuery, _responder: Option, @@ -16012,12 +15994,11 @@ impl< F: FeeEstimator, R: Router, MR: MessageRouter, - L: Deref, + L: Logger, > NodeIdLookUp for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - L::Target: Logger, { fn next_node_id(&self, short_channel_id: u64) -> Option { self.short_to_chan_info.read().unwrap().get(&short_channel_id).map(|(pubkey, _)| *pubkey) @@ -16522,12 +16503,11 @@ impl< F: FeeEstimator, R: Router, MR: MessageRouter, - L: Deref, + L: Logger, > Writeable for ChannelManager where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - L::Target: Logger, { #[rustfmt::skip] fn write(&self, writer: &mut W) -> Result<(), io::Error> { @@ -16883,11 +16863,10 @@ pub struct ChannelManagerReadArgs< F: FeeEstimator, R: Router, MR: MessageRouter, - L: Deref + Clone, + L: Logger + Clone, > where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - L::Target: Logger, { /// A cryptographically secure source of entropy. pub entropy_source: ES, @@ -16957,12 +16936,11 @@ impl< F: FeeEstimator, R: Router, MR: MessageRouter, - L: Deref + Clone, + L: Logger + Clone, > ChannelManagerReadArgs<'a, M, T, ES, NS, SP, F, R, MR, L> where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - L::Target: Logger, { /// Simple utility function to create a ChannelManagerReadArgs which creates the monitor /// HashMap for you. This is primarily useful for C bindings where it is not practical to @@ -16993,12 +16971,10 @@ where // If the HTLC corresponding to `prev_hop_data` is present in `decode_update_add_htlcs`, remove it // from the map as it is already being stored and processed elsewhere. -fn dedup_decode_update_add_htlcs( +fn dedup_decode_update_add_htlcs( decode_update_add_htlcs: &mut HashMap>, prev_hop_data: &HTLCPreviousHopData, removal_reason: &'static str, logger: &L, -) where - L::Target: Logger, -{ +) { match decode_update_add_htlcs.entry(prev_hop_data.prev_outbound_scid_alias) { hash_map::Entry::Occupied(mut update_add_htlcs) => { update_add_htlcs.get_mut().retain(|update_add| { @@ -17039,13 +17015,12 @@ impl< F: FeeEstimator, R: Router, MR: MessageRouter, - L: Deref + Clone, + L: Logger + Clone, > ReadableArgs> for (BlockHash, Arc>) where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - L::Target: Logger, { fn read( reader: &mut Reader, args: ChannelManagerReadArgs<'a, M, T, ES, NS, SP, F, R, MR, L>, @@ -17066,13 +17041,12 @@ impl< F: FeeEstimator, R: Router, MR: MessageRouter, - L: Deref + Clone, + L: Logger + Clone, > ReadableArgs> for (BlockHash, ChannelManager) where M::Target: chain::Watch<::EcdsaSigner>, SP::Target: SignerProvider, - L::Target: Logger, { fn read( reader: &mut Reader, mut args: ChannelManagerReadArgs<'a, M, T, ES, NS, SP, F, R, MR, L>, diff --git a/lightning/src/ln/functional_test_utils.rs b/lightning/src/ln/functional_test_utils.rs index 28acfbaf4e1..122bb37e07a 100644 --- a/lightning/src/ln/functional_test_utils.rs +++ b/lightning/src/ln/functional_test_utils.rs @@ -739,7 +739,7 @@ pub trait NodeHolder { ::FeeEstimator, ::Router, ::MessageRouter, - ::L, + ::Logger, >; fn chain_monitor(&self) -> Option<&test_utils::TestChainMonitor<'_>>; } @@ -756,7 +756,7 @@ impl NodeHolder for &H { ::FeeEstimator, ::Router, ::MessageRouter, - ::L, + ::Logger, > { (*self).node() } diff --git a/lightning/src/ln/inbound_payment.rs b/lightning/src/ln/inbound_payment.rs index 03e271d196d..51f8b7bfce9 100644 --- a/lightning/src/ln/inbound_payment.rs +++ b/lightning/src/ln/inbound_payment.rs @@ -27,8 +27,6 @@ use crate::util::logger::Logger; #[allow(unused_imports)] use crate::prelude::*; -use core::ops::Deref; - pub(crate) const IV_LEN: usize = 16; const METADATA_LEN: usize = 16; const METADATA_KEY_LEN: usize = 32; @@ -342,13 +340,10 @@ fn construct_payment_secret( /// [`NodeSigner::get_expanded_key`]: crate::sign::NodeSigner::get_expanded_key /// [`create_inbound_payment`]: crate::ln::channelmanager::ChannelManager::create_inbound_payment /// [`create_inbound_payment_for_hash`]: crate::ln::channelmanager::ChannelManager::create_inbound_payment_for_hash -pub(super) fn verify( +pub(super) fn verify( payment_hash: PaymentHash, payment_data: &msgs::FinalOnionHopData, highest_seen_timestamp: u64, keys: &ExpandedKey, logger: &L, -) -> Result<(Option, Option), ()> -where - L::Target: Logger, -{ +) -> Result<(Option, Option), ()> { let (iv_bytes, metadata_bytes) = decrypt_metadata(payment_data.payment_secret, keys); let payment_type_res = diff --git a/lightning/src/ln/invoice_utils.rs b/lightning/src/ln/invoice_utils.rs index 1136b36fcb6..ff22d77273c 100644 --- a/lightning/src/ln/invoice_utils.rs +++ b/lightning/src/ln/invoice_utils.rs @@ -22,7 +22,6 @@ use bitcoin::hashes::Hash; use bitcoin::secp256k1::PublicKey; #[cfg(not(feature = "std"))] use core::iter::Iterator; -use core::ops::Deref; use core::time::Duration; /// Utility to create an invoice that can be paid to one of multiple nodes, or a "phantom invoice." @@ -67,15 +66,12 @@ use core::time::Duration; feature = "std", doc = "This can be used in a `no_std` environment, where [`std::time::SystemTime`] is not available and the current time is supplied by the caller." )] -pub fn create_phantom_invoice( +pub fn create_phantom_invoice( amt_msat: Option, payment_hash: Option, description: String, invoice_expiry_delta_secs: u32, phantom_route_hints: Vec, entropy_source: ES, node_signer: NS, logger: L, network: Currency, min_final_cltv_expiry_delta: Option, duration_since_epoch: Duration, -) -> Result> -where - L::Target: Logger, -{ +) -> Result> { let description = Description::new(description).map_err(SignOrCreationError::CreationError)?; let description = Bolt11InvoiceDescription::Direct(description); _create_phantom_invoice::( @@ -133,15 +129,16 @@ where feature = "std", doc = "This version can be used in a `no_std` environment, where [`std::time::SystemTime`] is not available and the current time is supplied by the caller." )] -pub fn create_phantom_invoice_with_description_hash( +pub fn create_phantom_invoice_with_description_hash< + ES: EntropySource, + NS: NodeSigner, + L: Logger, +>( amt_msat: Option, payment_hash: Option, invoice_expiry_delta_secs: u32, description_hash: Sha256, phantom_route_hints: Vec, entropy_source: ES, node_signer: NS, logger: L, network: Currency, min_final_cltv_expiry_delta: Option, duration_since_epoch: Duration, -) -> Result> -where - L::Target: Logger, -{ +) -> Result> { _create_phantom_invoice::( amt_msat, payment_hash, @@ -159,15 +156,12 @@ where const MAX_CHANNEL_HINTS: usize = 3; -fn _create_phantom_invoice( +fn _create_phantom_invoice( amt_msat: Option, payment_hash: Option, description: Bolt11InvoiceDescription, invoice_expiry_delta_secs: u32, phantom_route_hints: Vec, entropy_source: ES, node_signer: NS, logger: L, network: Currency, min_final_cltv_expiry_delta: Option, duration_since_epoch: Duration, -) -> Result> -where - L::Target: Logger, -{ +) -> Result> { if phantom_route_hints.is_empty() { return Err(SignOrCreationError::CreationError(CreationError::MissingRouteHints)); } @@ -262,12 +256,9 @@ where /// * Select one hint from each node, up to three hints or until we run out of hints. /// /// [`PhantomKeysManager`]: crate::sign::PhantomKeysManager -fn select_phantom_hints( +fn select_phantom_hints( amt_msat: Option, phantom_route_hints: Vec, logger: L, -) -> impl Iterator -where - L::Target: Logger, -{ +) -> impl Iterator { let mut phantom_hints: Vec<_> = Vec::new(); for PhantomRouteHints { channels, phantom_scid, real_node_pubkey } in phantom_route_hints { @@ -363,12 +354,9 @@ fn rotate_through_iterators>(mut vecs: Vec) -> impl /// * Limited to a total of 3 channels. /// * Sorted by lowest inbound capacity if an online channel with the minimum amount requested exists, /// otherwise sort by highest inbound capacity to give the payment the best chance of succeeding. -pub(super) fn sort_and_filter_channels( +pub(super) fn sort_and_filter_channels( channels: Vec, min_inbound_capacity_msat: Option, logger: &L, -) -> impl ExactSizeIterator -where - L::Target: Logger, -{ +) -> impl ExactSizeIterator { let mut filtered_channels: BTreeMap = BTreeMap::new(); let min_inbound_capacity = min_inbound_capacity_msat.unwrap_or(0); let mut min_capacity_channel_exists = false; @@ -574,20 +562,14 @@ fn prefer_current_channel( } /// Adds relevant context to a [`Record`] before passing it to the wrapped [`Logger`]. -struct WithChannelDetails<'a, 'b, L: Deref> -where - L::Target: Logger, -{ +struct WithChannelDetails<'a, 'b, L: Logger> { /// The logger to delegate to after adding context to the record. logger: &'a L, /// The [`ChannelDetails`] for adding relevant context to the logged record. details: &'b ChannelDetails, } -impl<'a, 'b, L: Deref> Logger for WithChannelDetails<'a, 'b, L> -where - L::Target: Logger, -{ +impl<'a, 'b, L: Logger> Logger for WithChannelDetails<'a, 'b, L> { fn log(&self, mut record: Record) { record.peer_id = Some(self.details.counterparty.node_id); record.channel_id = Some(self.details.channel_id); @@ -595,10 +577,7 @@ where } } -impl<'a, 'b, L: Deref> WithChannelDetails<'a, 'b, L> -where - L::Target: Logger, -{ +impl<'a, 'b, L: Logger> WithChannelDetails<'a, 'b, L> { fn from(logger: &'a L, details: &'b ChannelDetails) -> Self { Self { logger, details } } diff --git a/lightning/src/ln/onion_payment.rs b/lightning/src/ln/onion_payment.rs index 04562ebed59..b116ca3d49a 100644 --- a/lightning/src/ln/onion_payment.rs +++ b/lightning/src/ln/onion_payment.rs @@ -26,8 +26,6 @@ use crate::util::logger::Logger; #[allow(unused_imports)] use crate::prelude::*; -use core::ops::Deref; - /// Invalid inbound onion payment. #[derive(Clone, Debug, Hash, PartialEq, Eq)] pub struct InboundHTLCErr { @@ -471,13 +469,10 @@ pub(super) fn create_recv_pending_htlc_info( /// /// [`Event::PaymentClaimable`]: crate::events::Event::PaymentClaimable #[rustfmt::skip] -pub fn peel_payment_onion( +pub fn peel_payment_onion( msg: &msgs::UpdateAddHTLC, node_signer: NS, logger: L, secp_ctx: &Secp256k1, cur_height: u32, allow_skimmed_fees: bool, -) -> Result -where - L::Target: Logger, -{ +) -> Result { let (hop, next_packet_details_opt) = decode_incoming_update_add_htlc_onion(msg, node_signer, logger, secp_ctx ).map_err(|(msg, failure_reason)| { @@ -544,12 +539,9 @@ pub(super) struct NextPacketDetails { } #[rustfmt::skip] -pub(super) fn decode_incoming_update_add_htlc_onion( +pub(super) fn decode_incoming_update_add_htlc_onion( msg: &msgs::UpdateAddHTLC, node_signer: NS, logger: L, secp_ctx: &Secp256k1, -) -> Result<(onion_utils::Hop, Option), (HTLCFailureMsg, LocalHTLCFailureReason)> -where - L::Target: Logger, -{ +) -> Result<(onion_utils::Hop, Option), (HTLCFailureMsg, LocalHTLCFailureReason)> { let encode_malformed_error = |message: &str, failure_reason: LocalHTLCFailureReason| { log_info!(logger, "Failed to accept/forward incoming HTLC: {}", message); let (sha256_of_onion, failure_reason) = if msg.blinding_point.is_some() || failure_reason == LocalHTLCFailureReason::InvalidOnionBlinding { diff --git a/lightning/src/ln/onion_utils.rs b/lightning/src/ln/onion_utils.rs index 5d17d1591b8..3cd4e77d73d 100644 --- a/lightning/src/ln/onion_utils.rs +++ b/lightning/src/ln/onion_utils.rs @@ -39,7 +39,6 @@ use bitcoin::secp256k1::ecdh::SharedSecret; use bitcoin::secp256k1::{PublicKey, Scalar, Secp256k1, SecretKey}; use crate::io::{Cursor, Read}; -use core::ops::Deref; #[allow(unused_imports)] use crate::prelude::*; @@ -982,13 +981,10 @@ mod fuzzy_onion_utils { pub(crate) attribution_failed_channel: Option, } - pub fn process_onion_failure( + pub fn process_onion_failure( secp_ctx: &Secp256k1, logger: &L, htlc_source: &HTLCSource, encrypted_packet: OnionErrorPacket, - ) -> DecodedOnionFailure - where - L::Target: Logger, - { + ) -> DecodedOnionFailure { let (path, session_priv) = match htlc_source { HTLCSource::OutboundRoute { ref path, ref session_priv, .. } => (path, session_priv), _ => unreachable!(), @@ -998,13 +994,10 @@ mod fuzzy_onion_utils { } /// Decodes the attribution data that we got back from upstream on a payment we sent. - pub fn decode_fulfill_attribution_data( + pub fn decode_fulfill_attribution_data( secp_ctx: &Secp256k1, logger: &L, path: &Path, outer_session_priv: &SecretKey, mut attribution_data: AttributionData, - ) -> Vec - where - L::Target: Logger, - { + ) -> Vec { let mut hold_times = Vec::new(); // Only consider hops in the regular path for attribution data. Blinded path attribution data isn't accessible. @@ -1056,13 +1049,10 @@ pub(crate) use self::fuzzy_onion_utils::*; /// Process failure we got back from upstream on a payment we sent (implying htlc_source is an /// OutboundRoute). -fn process_onion_failure_inner( +fn process_onion_failure_inner( secp_ctx: &Secp256k1, logger: &L, path: &Path, session_priv: &SecretKey, trampoline_session_priv_override: Option, mut encrypted_packet: OnionErrorPacket, -) -> DecodedOnionFailure -where - L::Target: Logger, -{ +) -> DecodedOnionFailure { // Check that there is at least enough data for an hmac, otherwise none of the checking that we may do makes sense. // Also prevent slice out of bounds further down. if encrypted_packet.data.len() < 32 { @@ -2122,12 +2112,9 @@ impl HTLCFailReason { } } - pub(super) fn decode_onion_failure( + pub(super) fn decode_onion_failure( &self, secp_ctx: &Secp256k1, logger: &L, htlc_source: &HTLCSource, - ) -> DecodedOnionFailure - where - L::Target: Logger, - { + ) -> DecodedOnionFailure { match self.0 { HTLCFailReasonRepr::LightningError { ref err, .. } => { process_onion_failure(secp_ctx, logger, &htlc_source, err.clone()) diff --git a/lightning/src/ln/outbound_payment.rs b/lightning/src/ln/outbound_payment.rs index d660cd31cca..f5cb2b436c6 100644 --- a/lightning/src/ln/outbound_payment.rs +++ b/lightning/src/ln/outbound_payment.rs @@ -837,20 +837,14 @@ pub(super) struct SendAlongPathArgs<'a> { pub hold_htlc_at_next_hop: bool, } -pub(super) struct OutboundPayments -where - L::Target: Logger, -{ +pub(super) struct OutboundPayments { pub(super) pending_outbound_payments: Mutex>, awaiting_invoice: AtomicBool, retry_lock: Mutex<()>, logger: L, } -impl OutboundPayments -where - L::Target: Logger, -{ +impl OutboundPayments { pub(super) fn new( pending_outbound_payments: HashMap, logger: L, ) -> Self { @@ -1397,7 +1391,6 @@ where inflight_htlcs: &IH, node_signer: &NS, best_block_height: u32, ) -> Result where - L::Target: Logger, IH: Fn() -> InFlightHtlcs, { #[cfg(feature = "std")] { @@ -1451,7 +1444,6 @@ where pending_events: &Mutex)>>, send_payment_along_path: SP, ) -> Result<(), RetryableSendFailure> where - L::Target: Logger, IH: Fn() -> InFlightHtlcs, SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, { @@ -1492,7 +1484,6 @@ where pending_events: &Mutex)>>, send_payment_along_path: &SP, ) where - L::Target: Logger, IH: Fn() -> InFlightHtlcs, SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, { diff --git a/lightning/src/ln/peer_handler.rs b/lightning/src/ln/peer_handler.rs index c2bb0af3103..1891c52928d 100644 --- a/lightning/src/ln/peer_handler.rs +++ b/lightning/src/ln/peer_handler.rs @@ -977,8 +977,7 @@ pub trait APeerManager { type RM: Deref; type OMT: OnionMessageHandler + ?Sized; type OM: Deref; - type LT: Logger + ?Sized; - type L: Deref; + type Logger: Logger; type CMHT: CustomMessageHandler + ?Sized; type CMH: Deref; type NodeSigner: NodeSigner; @@ -992,7 +991,7 @@ pub trait APeerManager { Self::CM, Self::RM, Self::OM, - Self::L, + Self::Logger, Self::CMH, Self::NodeSigner, Self::SM, @@ -1004,7 +1003,7 @@ impl< CM: Deref, RM: Deref, OM: Deref, - L: Deref, + L: Logger, CMH: Deref, NS: NodeSigner, SM: Deref, @@ -1013,7 +1012,6 @@ where CM::Target: ChannelMessageHandler, RM::Target: RoutingMessageHandler, OM::Target: OnionMessageHandler, - L::Target: Logger, CMH::Target: CustomMessageHandler, SM::Target: SendOnlyMessageHandler, { @@ -1024,8 +1022,7 @@ where type RM = RM; type OMT = ::Target; type OM = OM; - type LT = ::Target; - type L = L; + type Logger = L; type CMHT = ::Target; type CMH = CMH; type NodeSigner = NS; @@ -1060,7 +1057,7 @@ pub struct PeerManager< CM: Deref, RM: Deref, OM: Deref, - L: Deref, + L: Logger, CMH: Deref, NS: NodeSigner, SM: Deref, @@ -1068,7 +1065,6 @@ pub struct PeerManager< CM::Target: ChannelMessageHandler, RM::Target: RoutingMessageHandler, OM::Target: OnionMessageHandler, - L::Target: Logger, CMH::Target: CustomMessageHandler, SM::Target: SendOnlyMessageHandler, { @@ -1147,12 +1143,11 @@ fn encode_message(message: wire::Message) -> Vec { buffer.0 } -impl +impl PeerManager where CM::Target: ChannelMessageHandler, OM::Target: OnionMessageHandler, - L::Target: Logger, SM::Target: SendOnlyMessageHandler, { /// Constructs a new `PeerManager` with the given `ChannelMessageHandler` and @@ -1189,7 +1184,7 @@ where } } -impl +impl PeerManager< Descriptor, ErroringMessageHandler, @@ -1201,7 +1196,6 @@ impl IgnoringMessageHandler, > where RM::Target: RoutingMessageHandler, - L::Target: Logger, { /// Constructs a new `PeerManager` with the given `RoutingMessageHandler`. No channel message /// handler or onion message handler is used and onion and channel messages will be ignored (or @@ -1290,7 +1284,7 @@ impl< CM: Deref, RM: Deref, OM: Deref, - L: Deref, + L: Logger, CMH: Deref, NS: NodeSigner, SM: Deref, @@ -1299,7 +1293,6 @@ where CM::Target: ChannelMessageHandler, RM::Target: RoutingMessageHandler, OM::Target: OnionMessageHandler, - L::Target: Logger, CMH::Target: CustomMessageHandler, SM::Target: SendOnlyMessageHandler, { diff --git a/lightning/src/offers/flow.rs b/lightning/src/offers/flow.rs index 3ee57c56c8f..0bb98777227 100644 --- a/lightning/src/offers/flow.rs +++ b/lightning/src/offers/flow.rs @@ -10,7 +10,6 @@ //! Provides data structures and functions for creating and managing Offers messages, //! facilitating communication, and handling BOLT12 messages and payments. -use core::ops::Deref; use core::sync::atomic::{AtomicUsize, Ordering}; use core::time::Duration; @@ -74,10 +73,7 @@ use { /// /// [`OffersMessageFlow`] is parameterized by a [`MessageRouter`], which is responsible /// for finding message paths when initiating and retrying onion messages. -pub struct OffersMessageFlow -where - L::Target: Logger, -{ +pub struct OffersMessageFlow { chain_hash: ChainHash, best_block: RwLock, @@ -106,10 +102,7 @@ where logger: L, } -impl OffersMessageFlow -where - L::Target: Logger, -{ +impl OffersMessageFlow { /// Creates a new [`OffersMessageFlow`] pub fn new( chain_hash: ChainHash, best_block: BestBlock, our_network_pubkey: PublicKey, @@ -264,10 +257,7 @@ const DEFAULT_ASYNC_RECEIVE_OFFER_EXPIRY: Duration = Duration::from_secs(365 * 2 pub(crate) const TEST_DEFAULT_ASYNC_RECEIVE_OFFER_EXPIRY: Duration = DEFAULT_ASYNC_RECEIVE_OFFER_EXPIRY; -impl OffersMessageFlow -where - L::Target: Logger, -{ +impl OffersMessageFlow { /// [`BlindedMessagePath`]s for an async recipient to communicate with this node and interactively /// build [`Offer`]s and [`StaticInvoice`]s for receiving async payments. /// @@ -427,10 +417,7 @@ pub enum HeldHtlcReplyPath { }, } -impl OffersMessageFlow -where - L::Target: Logger, -{ +impl OffersMessageFlow { /// Verifies an [`InvoiceRequest`] using the provided [`OffersContext`] or the [`InvoiceRequest::metadata`]. /// /// - If an [`OffersContext::InvoiceRequest`] with a `nonce` is provided, verification is performed using recipient context data. diff --git a/lightning/src/onion_message/messenger.rs b/lightning/src/onion_message/messenger.rs index 525d3a72fee..0aadc6d6e31 100644 --- a/lightning/src/onion_message/messenger.rs +++ b/lightning/src/onion_message/messenger.rs @@ -70,9 +70,7 @@ pub trait AOnionMessenger { /// A type implementing [`NodeSigner`] type NodeSigner: NodeSigner; /// A type implementing [`Logger`] - type Logger: Logger + ?Sized; - /// A type that may be dereferenced to [`Self::Logger`] - type L: Deref; + type Logger: Logger; /// A type implementing [`NodeIdLookUp`] type NodeIdLookUp: NodeIdLookUp + ?Sized; /// A type that may be dereferenced to [`Self::NodeIdLookUp`] @@ -101,7 +99,7 @@ pub trait AOnionMessenger { ) -> &OnionMessenger< Self::EntropySource, Self::NodeSigner, - Self::L, + Self::Logger, Self::NL, Self::MessageRouter, Self::OMH, @@ -114,7 +112,7 @@ pub trait AOnionMessenger { impl< ES: EntropySource, NS: NodeSigner, - L: Deref, + L: Logger, NL: Deref, MR: MessageRouter, OMH: Deref, @@ -123,7 +121,6 @@ impl< CMH: Deref, > AOnionMessenger for OnionMessenger where - L::Target: Logger, NL::Target: NodeIdLookUp, OMH::Target: OffersMessageHandler, APH::Target: AsyncPaymentsMessageHandler, @@ -132,8 +129,7 @@ where { type EntropySource = ES; type NodeSigner = NS; - type Logger = L::Target; - type L = L; + type Logger = L; type NodeIdLookUp = NL::Target; type NL = NL; type MessageRouter = MR; @@ -274,7 +270,7 @@ where pub struct OnionMessenger< ES: EntropySource, NS: NodeSigner, - L: Deref, + L: Logger, NL: Deref, MR: MessageRouter, OMH: Deref, @@ -282,7 +278,6 @@ pub struct OnionMessenger< DRH: Deref, CMH: Deref, > where - L::Target: Logger, NL::Target: NodeIdLookUp, OMH::Target: OffersMessageHandler, APH::Target: AsyncPaymentsMessageHandler, @@ -555,10 +550,7 @@ impl> MessageRouter for R { /// node. Otherwise, there is no way to find a path to the introduction node in order to send a /// message, and thus an `Err` is returned. The impact of this may be somewhat muted when /// additional dummy hops are added to the blinded path, but this protection is not complete. -pub struct DefaultMessageRouter>, L: Deref, ES: EntropySource> -where - L::Target: Logger, -{ +pub struct DefaultMessageRouter>, L: Logger, ES: EntropySource> { network_graph: G, entropy_source: ES, } @@ -574,9 +566,8 @@ pub(crate) const DUMMY_HOPS_PATH_LENGTH: usize = 4; // We add dummy hops until the path reaches this length (including the recipient). pub(crate) const QR_CODED_DUMMY_HOPS_PATH_LENGTH: usize = 2; -impl>, L: Deref, ES: EntropySource> DefaultMessageRouter -where - L::Target: Logger, +impl>, L: Logger, ES: EntropySource> + DefaultMessageRouter { /// Creates a [`DefaultMessageRouter`] using the given [`NetworkGraph`]. pub fn new(network_graph: G, entropy_source: ES) -> Self { @@ -742,10 +733,8 @@ where } } -impl>, L: Deref, ES: EntropySource> MessageRouter +impl>, L: Logger, ES: EntropySource> MessageRouter for DefaultMessageRouter -where - L::Target: Logger, { fn find_path( &self, sender: PublicKey, peers: Vec, destination: Destination, @@ -787,17 +776,13 @@ where /// node. Otherwise, there is no way to find a path to the introduction node in order to send a /// message, and thus an `Err` is returned. The impact of this may be somewhat muted when /// additional dummy hops are added to the blinded path, but this protection is not complete. -pub struct NodeIdMessageRouter>, L: Deref, ES: EntropySource> -where - L::Target: Logger, -{ +pub struct NodeIdMessageRouter>, L: Logger, ES: EntropySource> { network_graph: G, entropy_source: ES, } -impl>, L: Deref, ES: EntropySource> NodeIdMessageRouter -where - L::Target: Logger, +impl>, L: Logger, ES: EntropySource> + NodeIdMessageRouter { /// Creates a [`NodeIdMessageRouter`] using the given [`NetworkGraph`]. pub fn new(network_graph: G, entropy_source: ES) -> Self { @@ -805,10 +790,8 @@ where } } -impl>, L: Deref, ES: EntropySource> MessageRouter +impl>, L: Logger, ES: EntropySource> MessageRouter for NodeIdMessageRouter -where - L::Target: Logger, { fn find_path( &self, sender: PublicKey, peers: Vec, destination: Destination, @@ -1167,12 +1150,11 @@ where /// /// Returns either the next layer of the onion for forwarding or the decrypted content for the /// receiver. -pub fn peel_onion_message( +pub fn peel_onion_message( msg: &OnionMessage, secp_ctx: &Secp256k1, node_signer: NS, logger: L, custom_handler: CMH, ) -> Result::Target as CustomOnionMessageHandler>::CustomMessage>, ()> where - L::Target: Logger, CMH::Target: CustomOnionMessageHandler, { let control_tlvs_ss = match node_signer.ecdh(Recipient::Node, &msg.blinding_point, None) { @@ -1203,7 +1185,7 @@ where onion_decode_ss, &msg.onion_routing_packet.hop_data[..], msg.onion_routing_packet.hmac, - (control_tlvs_ss, custom_handler.deref(), receiving_context_auth_key, logger.deref()), + (control_tlvs_ss, custom_handler.deref(), receiving_context_auth_key, &logger), ); // Constructs the next onion message using packet data and blinding logic. @@ -1391,7 +1373,7 @@ macro_rules! drop_handled_events_and_abort { impl< ES: EntropySource, NS: NodeSigner, - L: Deref, + L: Logger, NL: Deref, MR: MessageRouter, OMH: Deref, @@ -1400,7 +1382,6 @@ impl< CMH: Deref, > OnionMessenger where - L::Target: Logger, NL::Target: NodeIdLookUp, OMH::Target: OffersMessageHandler, APH::Target: AsyncPaymentsMessageHandler, @@ -1801,7 +1782,7 @@ where msg, &self.secp_ctx, &self.node_signer, - &*self.logger, + &self.logger, &*self.custom_handler, ) } @@ -2032,7 +2013,7 @@ fn outbound_buffer_full( impl< ES: EntropySource, NS: NodeSigner, - L: Deref, + L: Logger, NL: Deref, MR: MessageRouter, OMH: Deref, @@ -2041,7 +2022,6 @@ impl< CMH: Deref, > EventsProvider for OnionMessenger where - L::Target: Logger, NL::Target: NodeIdLookUp, OMH::Target: OffersMessageHandler, APH::Target: AsyncPaymentsMessageHandler, @@ -2150,7 +2130,7 @@ where impl< ES: EntropySource, NS: NodeSigner, - L: Deref, + L: Logger, NL: Deref, MR: MessageRouter, OMH: Deref, @@ -2159,7 +2139,6 @@ impl< CMH: Deref, > BaseMessageHandler for OnionMessenger where - L::Target: Logger, NL::Target: NodeIdLookUp, OMH::Target: OffersMessageHandler, APH::Target: AsyncPaymentsMessageHandler, @@ -2219,7 +2198,7 @@ where impl< ES: EntropySource, NS: NodeSigner, - L: Deref, + L: Logger, NL: Deref, MR: MessageRouter, OMH: Deref, @@ -2228,7 +2207,6 @@ impl< CMH: Deref, > OnionMessageHandler for OnionMessenger where - L::Target: Logger, NL::Target: NodeIdLookUp, OMH::Target: OffersMessageHandler, APH::Target: AsyncPaymentsMessageHandler, diff --git a/lightning/src/routing/gossip.rs b/lightning/src/routing/gossip.rs index 040a28cddae..2dcce844b2b 100644 --- a/lightning/src/routing/gossip.rs +++ b/lightning/src/routing/gossip.rs @@ -184,10 +184,7 @@ impl FromStr for NodeId { } /// Represents the network as nodes and channels between them -pub struct NetworkGraph -where - L::Target: Logger, -{ +pub struct NetworkGraph { secp_ctx: Secp256k1, last_rapid_gossip_sync_timestamp: Mutex>, chain_hash: ChainHash, @@ -322,10 +319,9 @@ impl MaybeReadable for NetworkUpdate { /// This network graph is then used for routing payments. /// Provides interface to help with initial routing sync by /// serving historical announcements. -pub struct P2PGossipSync>, U: Deref, L: Deref> +pub struct P2PGossipSync>, U: Deref, L: Logger> where U::Target: UtxoLookup, - L::Target: Logger, { network_graph: G, #[cfg(any(feature = "_test_utils", test))] @@ -337,10 +333,9 @@ where logger: L, } -impl>, U: Deref, L: Deref> P2PGossipSync +impl>, U: Deref, L: Logger> P2PGossipSync where U::Target: UtxoLookup, - L::Target: Logger, { /// Creates a new tracker of the actual state of the network of channels and nodes, /// assuming an existing [`NetworkGraph`]. @@ -426,10 +421,7 @@ where } } -impl NetworkGraph -where - L::Target: Logger, -{ +impl NetworkGraph { /// Handles any network updates originating from [`Event`]s. /// /// [`Event`]: crate::events::Event @@ -542,11 +534,10 @@ pub fn verify_channel_announcement( Ok(()) } -impl>, U: Deref, L: Deref> RoutingMessageHandler +impl>, U: Deref, L: Logger> RoutingMessageHandler for P2PGossipSync where U::Target: UtxoLookup, - L::Target: Logger, { fn handle_node_announcement( &self, _their_node_id: Option, msg: &msgs::NodeAnnouncement, @@ -770,11 +761,10 @@ where } } -impl>, U: Deref, L: Deref> BaseMessageHandler +impl>, U: Deref, L: Logger> BaseMessageHandler for P2PGossipSync where U::Target: UtxoLookup, - L::Target: Logger, { /// Initiates a stateless sync of routing gossip information with a peer /// using [`gossip_queries`]. The default strategy used by this implementation @@ -1644,10 +1634,7 @@ impl Readable for NodeInfo { const SERIALIZATION_VERSION: u8 = 1; const MIN_SERIALIZATION_VERSION: u8 = 1; -impl Writeable for NetworkGraph -where - L::Target: Logger, -{ +impl Writeable for NetworkGraph { fn write(&self, writer: &mut W) -> Result<(), io::Error> { self.test_node_counter_consistency(); @@ -1675,10 +1662,7 @@ where } } -impl ReadableArgs for NetworkGraph -where - L::Target: Logger, -{ +impl ReadableArgs for NetworkGraph { fn read(reader: &mut R, logger: L) -> Result, DecodeError> { let _ver = read_ver_prefix!(reader, SERIALIZATION_VERSION); @@ -1732,10 +1716,7 @@ where } } -impl fmt::Display for NetworkGraph -where - L::Target: Logger, -{ +impl fmt::Display for NetworkGraph { fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { writeln!(f, "Network map\n[Channels]")?; for (key, val) in self.channels.read().unwrap().unordered_iter() { @@ -1749,11 +1730,8 @@ where } } -impl Eq for NetworkGraph where L::Target: Logger {} -impl PartialEq for NetworkGraph -where - L::Target: Logger, -{ +impl Eq for NetworkGraph {} +impl PartialEq for NetworkGraph { fn eq(&self, other: &Self) -> bool { // For a total lockorder, sort by position in memory and take the inner locks in that order. // (Assumes that we can't move within memory while a lock is held). @@ -1781,10 +1759,7 @@ const CHAN_COUNT_ESTIMATE: usize = 60_000; // too low const NODE_COUNT_ESTIMATE: usize = 20_000; -impl NetworkGraph -where - L::Target: Logger, -{ +impl NetworkGraph { /// Creates a new, empty, network graph. pub fn new(network: Network, logger: L) -> NetworkGraph { Self { diff --git a/lightning/src/routing/router.rs b/lightning/src/routing/router.rs index e771baf183a..703a8173d8f 100644 --- a/lightning/src/routing/router.rs +++ b/lightning/src/routing/router.rs @@ -57,13 +57,12 @@ pub use lightning_types::routing::{RouteHint, RouteHintHop}; /// payment, and thus an `Err` is returned. pub struct DefaultRouter< G: Deref>, - L: Deref, + L: Logger, ES: EntropySource, S: Deref, SP: Sized, Sc: ScoreLookUp, > where - L::Target: Logger, S::Target: for<'a> LockableScore<'a, ScoreLookUp = Sc>, { network_graph: G, @@ -75,14 +74,13 @@ pub struct DefaultRouter< impl< G: Deref>, - L: Deref, + L: Logger, ES: EntropySource, S: Deref, SP: Sized, Sc: ScoreLookUp, > DefaultRouter where - L::Target: Logger, S::Target: for<'a> LockableScore<'a, ScoreLookUp = Sc>, { /// Creates a new router. @@ -95,14 +93,13 @@ where impl< G: Deref>, - L: Deref, + L: Logger, ES: EntropySource, S: Deref, SP: Sized, Sc: ScoreLookUp, > Router for DefaultRouter where - L::Target: Logger, S::Target: for<'a> LockableScore<'a, ScoreLookUp = Sc>, { #[rustfmt::skip] @@ -115,7 +112,7 @@ where ) -> Result { let random_seed_bytes = self.entropy_source.get_secure_random_bytes(); find_route( - payer, params, &self.network_graph, first_hops, &*self.logger, + payer, params, &self.network_graph, first_hops, &self.logger, &ScorerAccountingForInFlightHtlcs::new(self.scorer.read_lock(), &inflight_htlcs), &self.score_params, &random_seed_bytes @@ -1981,12 +1978,11 @@ impl<'a> NodeCounters<'a> { /// Calculates the introduction point for each blinded path in the given [`PaymentParameters`], if /// they can be found. #[rustfmt::skip] -fn calculate_blinded_path_intro_points<'a, L: Deref>( +fn calculate_blinded_path_intro_points<'a, L: Logger>( payment_params: &PaymentParameters, node_counters: &'a NodeCounters, network_graph: &ReadOnlyNetworkGraph, logger: &L, our_node_id: NodeId, first_hop_targets: &HashMap, u32)>, -) -> Result>, &'static str> -where L::Target: Logger { +) -> Result>, &'static str> { let introduction_node_id_cache = payment_params.payee.blinded_route_hints().iter() .map(|path| { match path.introduction_node() { @@ -2487,12 +2483,11 @@ fn sort_first_hop_channels( /// [`Event::PaymentPathFailed`]: crate::events::Event::PaymentPathFailed /// [`NetworkGraph`]: crate::routing::gossip::NetworkGraph #[rustfmt::skip] -pub fn find_route( +pub fn find_route( our_node_pubkey: &PublicKey, route_params: &RouteParameters, network_graph: &NetworkGraph, first_hops: Option<&[&ChannelDetails]>, logger: L, scorer: &S, score_params: &S::ScoreParams, random_seed_bytes: &[u8; 32] -) -> Result -where L::Target: Logger, GL::Target: Logger { +) -> Result { let graph_lock = network_graph.read_only(); let mut route = get_route(our_node_pubkey, &route_params, &graph_lock, first_hops, logger, scorer, score_params, random_seed_bytes)?; @@ -2501,12 +2496,11 @@ where L::Target: Logger, GL::Target: Logger { } #[rustfmt::skip] -pub(crate) fn get_route( +pub(crate) fn get_route( our_node_pubkey: &PublicKey, route_params: &RouteParameters, network_graph: &ReadOnlyNetworkGraph, first_hops: Option<&[&ChannelDetails]>, logger: L, scorer: &S, score_params: &S::ScoreParams, _random_seed_bytes: &[u8; 32] -) -> Result -where L::Target: Logger { +) -> Result { let payment_params = &route_params.payment_params; let max_path_length = core::cmp::min(payment_params.max_path_length, MAX_PATH_LENGTH_ESTIMATE); @@ -3890,11 +3884,10 @@ fn add_random_cltv_offset(route: &mut Route, payment_params: &PaymentParameters, /// /// Re-uses logic from `find_route`, so the restrictions described there also apply here. #[rustfmt::skip] -pub fn build_route_from_hops( +pub fn build_route_from_hops( our_node_pubkey: &PublicKey, hops: &[PublicKey], route_params: &RouteParameters, network_graph: &NetworkGraph, logger: L, random_seed_bytes: &[u8; 32] -) -> Result -where L::Target: Logger, GL::Target: Logger { +) -> Result { let graph_lock = network_graph.read_only(); let mut route = build_route_from_hops_internal(our_node_pubkey, hops, &route_params, &graph_lock, logger, random_seed_bytes)?; @@ -3903,10 +3896,10 @@ where L::Target: Logger, GL::Target: Logger { } #[rustfmt::skip] -fn build_route_from_hops_internal( +fn build_route_from_hops_internal( our_node_pubkey: &PublicKey, hops: &[PublicKey], route_params: &RouteParameters, network_graph: &ReadOnlyNetworkGraph, logger: L, random_seed_bytes: &[u8; 32], -) -> Result where L::Target: Logger { +) -> Result { struct HopScorer { our_node_id: NodeId, diff --git a/lightning/src/routing/scoring.rs b/lightning/src/routing/scoring.rs index d741adf58d3..47621e37380 100644 --- a/lightning/src/routing/scoring.rs +++ b/lightning/src/routing/scoring.rs @@ -479,10 +479,7 @@ impl ReadableArgs for FixedPenaltyScorer { /// [`liquidity_offset_half_life`]: ProbabilisticScoringDecayParameters::liquidity_offset_half_life /// [`historical_liquidity_penalty_multiplier_msat`]: ProbabilisticScoringFeeParameters::historical_liquidity_penalty_multiplier_msat /// [`historical_liquidity_penalty_amount_multiplier_msat`]: ProbabilisticScoringFeeParameters::historical_liquidity_penalty_amount_multiplier_msat -pub struct ProbabilisticScorer>, L: Deref> -where - L::Target: Logger, -{ +pub struct ProbabilisticScorer>, L: Logger> { decay_params: ProbabilisticScoringDecayParameters, network_graph: G, logger: L, @@ -964,10 +961,7 @@ struct DirectedChannelLiquidity< last_datapoint_time: T, } -impl>, L: Deref> ProbabilisticScorer -where - L::Target: Logger, -{ +impl>, L: Logger> ProbabilisticScorer { /// Creates a new scorer using the given scoring parameters for sending payments from a node /// through a network graph. pub fn new( @@ -1593,9 +1587,9 @@ impl< { /// Adjusts the channel liquidity balance bounds when failing to route `amount_msat`. #[rustfmt::skip] - fn failed_at_channel( + fn failed_at_channel( &mut self, amount_msat: u64, duration_since_epoch: Duration, chan_descr: fmt::Arguments, logger: &Log - ) where Log::Target: Logger { + ) { let existing_max_msat = self.max_liquidity_msat(); if amount_msat < existing_max_msat { log_debug!(logger, "Setting max liquidity of {} from {} to {}", chan_descr, existing_max_msat, amount_msat); @@ -1610,9 +1604,9 @@ impl< /// Adjusts the channel liquidity balance bounds when failing to route `amount_msat` downstream. #[rustfmt::skip] - fn failed_downstream( + fn failed_downstream( &mut self, amount_msat: u64, duration_since_epoch: Duration, chan_descr: fmt::Arguments, logger: &Log - ) where Log::Target: Logger { + ) { let existing_min_msat = self.min_liquidity_msat(); if amount_msat > existing_min_msat { log_debug!(logger, "Setting min liquidity of {} from {} to {}", existing_min_msat, chan_descr, amount_msat); @@ -1627,9 +1621,9 @@ impl< /// Adjusts the channel liquidity balance bounds when successfully routing `amount_msat`. #[rustfmt::skip] - fn successful(&mut self, + fn successful(&mut self, amount_msat: u64, duration_since_epoch: Duration, chan_descr: fmt::Arguments, logger: &Log - ) where Log::Target: Logger { + ) { let max_liquidity_msat = self.max_liquidity_msat().checked_sub(amount_msat).unwrap_or(0); log_debug!(logger, "Subtracting {} from max liquidity of {} (setting it to {})", amount_msat, chan_descr, max_liquidity_msat); self.set_max_liquidity_msat(max_liquidity_msat, duration_since_epoch); @@ -1669,10 +1663,7 @@ impl< } } -impl>, L: Deref> ScoreLookUp for ProbabilisticScorer -where - L::Target: Logger, -{ +impl>, L: Logger> ScoreLookUp for ProbabilisticScorer { type ScoreParams = ProbabilisticScoringFeeParameters; #[rustfmt::skip] fn channel_penalty_msat( @@ -1735,10 +1726,7 @@ where } } -impl>, L: Deref> ScoreUpdate for ProbabilisticScorer -where - L::Target: Logger, -{ +impl>, L: Logger> ScoreUpdate for ProbabilisticScorer { #[rustfmt::skip] fn payment_path_failed(&mut self, path: &Path, short_channel_id: u64, duration_since_epoch: Duration) { let amount_msat = path.final_value_msat(); @@ -1836,18 +1824,12 @@ where /// /// Note that only the locally acquired data is persisted. After a restart, the external scores will be lost and must be /// resupplied. -pub struct CombinedScorer>, L: Deref> -where - L::Target: Logger, -{ +pub struct CombinedScorer>, L: Logger> { local_only_scorer: ProbabilisticScorer, scorer: ProbabilisticScorer, } -impl> + Clone, L: Deref + Clone> CombinedScorer -where - L::Target: Logger, -{ +impl> + Clone, L: Logger + Clone> CombinedScorer { /// Create a new combined scorer with the given local scorer. #[rustfmt::skip] pub fn new(local_scorer: ProbabilisticScorer) -> Self { @@ -1889,10 +1871,7 @@ where } } -impl>, L: Deref> ScoreLookUp for CombinedScorer -where - L::Target: Logger, -{ +impl>, L: Logger> ScoreLookUp for CombinedScorer { type ScoreParams = ProbabilisticScoringFeeParameters; fn channel_penalty_msat( @@ -1903,10 +1882,7 @@ where } } -impl>, L: Deref> ScoreUpdate for CombinedScorer -where - L::Target: Logger, -{ +impl>, L: Logger> ScoreUpdate for CombinedScorer { fn payment_path_failed( &mut self, path: &Path, short_channel_id: u64, duration_since_epoch: Duration, ) { @@ -1935,20 +1911,14 @@ where } } -impl>, L: Deref> Writeable for CombinedScorer -where - L::Target: Logger, -{ +impl>, L: Logger> Writeable for CombinedScorer { fn write(&self, writer: &mut W) -> Result<(), crate::io::Error> { self.local_only_scorer.write(writer) } } #[cfg(c_bindings)] -impl>, L: Deref> Score for ProbabilisticScorer where - L::Target: Logger -{ -} +impl>, L: Logger> Score for ProbabilisticScorer {} #[cfg(feature = "std")] #[inline] @@ -2520,20 +2490,15 @@ mod bucketed_history { } } -impl>, L: Deref> Writeable for ProbabilisticScorer -where - L::Target: Logger, -{ +impl>, L: Logger> Writeable for ProbabilisticScorer { #[inline] fn write(&self, w: &mut W) -> Result<(), io::Error> { self.channel_liquidities.write(w) } } -impl>, L: Deref> +impl>, L: Logger> ReadableArgs<(ProbabilisticScoringDecayParameters, G, L)> for ProbabilisticScorer -where - L::Target: Logger, { #[inline] #[rustfmt::skip] diff --git a/lightning/src/routing/utxo.rs b/lightning/src/routing/utxo.rs index f46160f1f14..31f4de5dee0 100644 --- a/lightning/src/routing/utxo.rs +++ b/lightning/src/routing/utxo.rs @@ -439,12 +439,10 @@ impl PendingChecks { } } - fn resolve_single_future( + fn resolve_single_future( &self, graph: &NetworkGraph, entry: Arc>, new_messages: &mut Vec, - ) where - L::Target: Logger, - { + ) { let (announcement, result, announce_a, announce_b, update_a, update_b); { let mut state = entry.lock().unwrap(); @@ -529,12 +527,9 @@ impl PendingChecks { } } - pub(super) fn check_resolved_futures( + pub(super) fn check_resolved_futures( &self, graph: &NetworkGraph, - ) -> Vec - where - L::Target: Logger, - { + ) -> Vec { let mut completed_states = Vec::new(); { let mut lck = self.internal.lock().unwrap(); diff --git a/lightning/src/sign/tx_builder.rs b/lightning/src/sign/tx_builder.rs index 74941ec8a87..27b8b1a9a2b 100644 --- a/lightning/src/sign/tx_builder.rs +++ b/lightning/src/sign/tx_builder.rs @@ -2,7 +2,6 @@ #![allow(dead_code)] use core::cmp; -use core::ops::Deref; use bitcoin::secp256k1::{self, PublicKey, Secp256k1}; @@ -169,14 +168,12 @@ pub(crate) trait TxBuilder { &self, is_outbound_from_holder: bool, value_to_self_after_htlcs: u64, value_to_remote_after_htlcs: u64, channel_type: &ChannelTypeFeatures, ) -> (u64, u64); - fn build_commitment_transaction( + fn build_commitment_transaction( &self, local: bool, commitment_number: u64, per_commitment_point: &PublicKey, channel_parameters: &ChannelTransactionParameters, secp_ctx: &Secp256k1, value_to_self_msat: u64, htlcs_in_tx: Vec, feerate_per_kw: u32, broadcaster_dust_limit_satoshis: u64, logger: &L, - ) -> (CommitmentTransaction, CommitmentStats) - where - L::Target: Logger; + ) -> (CommitmentTransaction, CommitmentStats); } pub(crate) struct SpecTxBuilder {} @@ -322,15 +319,12 @@ impl TxBuilder for SpecTxBuilder { (local_balance_before_fee_msat, remote_balance_before_fee_msat) } - fn build_commitment_transaction( + fn build_commitment_transaction( &self, local: bool, commitment_number: u64, per_commitment_point: &PublicKey, channel_parameters: &ChannelTransactionParameters, secp_ctx: &Secp256k1, value_to_self_msat: u64, mut htlcs_in_tx: Vec, feerate_per_kw: u32, broadcaster_dust_limit_satoshis: u64, logger: &L, - ) -> (CommitmentTransaction, CommitmentStats) - where - L::Target: Logger, - { + ) -> (CommitmentTransaction, CommitmentStats) { let mut local_htlc_total_msat = 0; let mut remote_htlc_total_msat = 0; let channel_type = &channel_parameters.channel_type_features; diff --git a/lightning/src/util/anchor_channel_reserves.rs b/lightning/src/util/anchor_channel_reserves.rs index 92c51975e5c..3e9945f7b87 100644 --- a/lightning/src/util/anchor_channel_reserves.rs +++ b/lightning/src/util/anchor_channel_reserves.rs @@ -275,10 +275,10 @@ pub fn can_support_additional_anchor_channel< FilterRef: Deref, B: BroadcasterInterface, FE: FeeEstimator, - LoggerRef: Deref, + L: Logger, PersistRef: Deref, ES: EntropySource, - ChainMonitorRef: Deref>, + ChainMonitorRef: Deref>, >( context: &AnchorChannelReserveContext, utxos: &[Utxo], a_channel_manager: AChannelManagerRef, chain_monitor: ChainMonitorRef, @@ -286,7 +286,6 @@ pub fn can_support_additional_anchor_channel< where AChannelManagerRef::Target: AChannelManager, FilterRef::Target: Filter, - LoggerRef::Target: Logger, PersistRef::Target: Persist, { let mut anchor_channels = new_hash_set(); diff --git a/lightning/src/util/logger.rs b/lightning/src/util/logger.rs index b49cd32c131..6f36bce0ab0 100644 --- a/lightning/src/util/logger.rs +++ b/lightning/src/util/logger.rs @@ -287,14 +287,17 @@ pub trait Logger { fn log(&self, record: Record); } +impl> Logger for L { + fn log(&self, record: Record) { + self.deref().log(record) + } +} + /// Adds relevant context to a [`Record`] before passing it to the wrapped [`Logger`]. /// /// This is not exported to bindings users as lifetimes are problematic and there's little reason /// for this to be used downstream anyway. -pub struct WithContext<'a, L: Deref> -where - L::Target: Logger, -{ +pub struct WithContext<'a, L: Logger> { /// The logger to delegate to after adding context to the record. logger: &'a L, /// The node id of the peer pertaining to the logged record. @@ -305,10 +308,7 @@ where payment_hash: Option, } -impl<'a, L: Deref> Logger for WithContext<'a, L> -where - L::Target: Logger, -{ +impl<'a, L: Logger> Logger for WithContext<'a, L> { fn log(&self, mut record: Record) { if self.peer_id.is_some() { record.peer_id = self.peer_id @@ -323,10 +323,7 @@ where } } -impl<'a, L: Deref> WithContext<'a, L> -where - L::Target: Logger, -{ +impl<'a, L: Logger> WithContext<'a, L> { /// Wraps the given logger, providing additional context to any logged records. pub fn from( logger: &'a L, peer_id: Option, channel_id: Option, diff --git a/lightning/src/util/persist.rs b/lightning/src/util/persist.rs index 3a94732fa46..a71e634699e 100644 --- a/lightning/src/util/persist.rs +++ b/lightning/src/util/persist.rs @@ -589,7 +589,7 @@ fn poll_sync_future(future: F) -> F::Output { /// [`MonitorUpdatingPersister::cleanup_stale_updates`] function. pub struct MonitorUpdatingPersister< K: Deref, - L: Deref, + L: Logger, ES: EntropySource, SP: Deref, BI: BroadcasterInterface, @@ -597,12 +597,11 @@ pub struct MonitorUpdatingPersister< >(MonitorUpdatingPersisterAsync, PanicingSpawner, L, ES, SP, BI, FE>) where K::Target: KVStoreSync, - L::Target: Logger, SP::Target: SignerProvider + Sized; impl< K: Deref, - L: Deref, + L: Logger, ES: EntropySource, SP: Deref, BI: BroadcasterInterface, @@ -610,7 +609,6 @@ impl< > MonitorUpdatingPersister where K::Target: KVStoreSync, - L::Target: Logger, SP::Target: SignerProvider + Sized, { /// Constructs a new [`MonitorUpdatingPersister`]. @@ -698,7 +696,7 @@ where impl< ChannelSigner: EcdsaChannelSigner, K: Deref, - L: Deref, + L: Logger, ES: EntropySource, SP: Deref, BI: BroadcasterInterface, @@ -706,7 +704,6 @@ impl< > Persist for MonitorUpdatingPersister where K::Target: KVStoreSync, - L::Target: Logger, SP::Target: SignerProvider + Sized, { /// Persists a new channel. This means writing the entire monitor to the @@ -781,7 +778,7 @@ where pub struct MonitorUpdatingPersisterAsync< K: Deref, S: FutureSpawner, - L: Deref, + L: Logger, ES: EntropySource, SP: Deref, BI: BroadcasterInterface, @@ -789,20 +786,18 @@ pub struct MonitorUpdatingPersisterAsync< >(Arc>) where K::Target: KVStore, - L::Target: Logger, SP::Target: SignerProvider + Sized; struct MonitorUpdatingPersisterAsyncInner< K: Deref, S: FutureSpawner, - L: Deref, + L: Logger, ES: EntropySource, SP: Deref, BI: BroadcasterInterface, FE: FeeEstimator, > where K::Target: KVStore, - L::Target: Logger, SP::Target: SignerProvider + Sized, { kv_store: K, @@ -819,7 +814,7 @@ struct MonitorUpdatingPersisterAsyncInner< impl< K: Deref, S: FutureSpawner, - L: Deref, + L: Logger, ES: EntropySource, SP: Deref, BI: BroadcasterInterface, @@ -827,7 +822,6 @@ impl< > MonitorUpdatingPersisterAsync where K::Target: KVStore, - L::Target: Logger, SP::Target: SignerProvider + Sized, { /// Constructs a new [`MonitorUpdatingPersisterAsync`]. @@ -967,7 +961,7 @@ where impl< K: Deref + MaybeSend + MaybeSync + 'static, S: FutureSpawner, - L: Deref + MaybeSend + MaybeSync + 'static, + L: Logger + MaybeSend + MaybeSync + 'static, ES: EntropySource + MaybeSend + MaybeSync + 'static, SP: Deref + MaybeSend + MaybeSync + 'static, BI: BroadcasterInterface + MaybeSend + MaybeSync + 'static, @@ -975,7 +969,6 @@ impl< > MonitorUpdatingPersisterAsync where K::Target: KVStore + MaybeSync, - L::Target: Logger, SP::Target: SignerProvider + Sized, ::EcdsaSigner: MaybeSend + 'static, { @@ -1056,7 +1049,7 @@ impl> + MaybeSend> MaybeSendableFuture impl< K: Deref, S: FutureSpawner, - L: Deref, + L: Logger, ES: EntropySource, SP: Deref, BI: BroadcasterInterface, @@ -1064,7 +1057,6 @@ impl< > MonitorUpdatingPersisterAsyncInner where K::Target: KVStore, - L::Target: Logger, SP::Target: SignerProvider + Sized, { pub async fn read_channel_monitor_with_updates( diff --git a/lightning/src/util/sweep.rs b/lightning/src/util/sweep.rs index a4088331f68..f7cf2771d3c 100644 --- a/lightning/src/util/sweep.rs +++ b/lightning/src/util/sweep.rs @@ -343,13 +343,12 @@ pub struct OutputSweeper< E: FeeEstimator, F: Deref, K: Deref, - L: Deref, + L: Logger, O: Deref, > where D::Target: ChangeDestinationSource, F::Target: Filter, K::Target: KVStore, - L::Target: Logger, O::Target: OutputSpender, { sweeper_state: Mutex, @@ -369,14 +368,13 @@ impl< E: FeeEstimator, F: Deref, K: Deref, - L: Deref, + L: Logger, O: Deref, > OutputSweeper where D::Target: ChangeDestinationSource, F::Target: Filter, K::Target: KVStore, - L::Target: Logger, O::Target: OutputSpender, { /// Constructs a new [`OutputSweeper`]. @@ -726,14 +724,13 @@ impl< E: FeeEstimator, F: Deref, K: Deref, - L: Deref, + L: Logger, O: Deref, > Listen for OutputSweeper where D::Target: ChangeDestinationSource, F::Target: Filter + Sync + Send, K::Target: KVStore, - L::Target: Logger, O::Target: OutputSpender, { fn filtered_block_connected( @@ -772,14 +769,13 @@ impl< E: FeeEstimator, F: Deref, K: Deref, - L: Deref, + L: Logger, O: Deref, > Confirm for OutputSweeper where D::Target: ChangeDestinationSource, F::Target: Filter + Sync + Send, K::Target: KVStore, - L::Target: Logger, O::Target: OutputSpender, { fn transactions_confirmed( @@ -874,14 +870,13 @@ impl< E: FeeEstimator, F: Deref, K: Deref, - L: Deref, + L: Logger, O: Deref, > ReadableArgs<(B, E, Option, O, D, K, L)> for (BestBlock, OutputSweeper) where D::Target: ChangeDestinationSource, F::Target: Filter + Sync + Send, K::Target: KVStore, - L::Target: Logger, O::Target: OutputSpender, { #[inline] @@ -949,13 +944,12 @@ pub struct OutputSweeperSync< E: FeeEstimator, F: Deref, K: Deref, - L: Deref, + L: Logger, O: Deref, > where D::Target: ChangeDestinationSourceSync, F::Target: Filter, K::Target: KVStoreSync, - L::Target: Logger, O::Target: OutputSpender, { sweeper: @@ -968,14 +962,13 @@ impl< E: FeeEstimator, F: Deref, K: Deref, - L: Deref, + L: Logger, O: Deref, > OutputSweeperSync where D::Target: ChangeDestinationSourceSync, F::Target: Filter, K::Target: KVStoreSync, - L::Target: Logger, O::Target: OutputSpender, { /// Constructs a new [`OutputSweeperSync`] instance. @@ -1093,14 +1086,13 @@ impl< E: FeeEstimator, F: Deref, K: Deref, - L: Deref, + L: Logger, O: Deref, > Listen for OutputSweeperSync where D::Target: ChangeDestinationSourceSync, F::Target: Filter + Sync + Send, K::Target: KVStoreSync, - L::Target: Logger, O::Target: OutputSpender, { fn filtered_block_connected( @@ -1120,14 +1112,13 @@ impl< E: FeeEstimator, F: Deref, K: Deref, - L: Deref, + L: Logger, O: Deref, > Confirm for OutputSweeperSync where D::Target: ChangeDestinationSourceSync, F::Target: Filter + Sync + Send, K::Target: KVStoreSync, - L::Target: Logger, O::Target: OutputSpender, { fn transactions_confirmed( @@ -1155,7 +1146,7 @@ impl< E: FeeEstimator, F: Deref, K: Deref, - L: Deref, + L: Logger, O: Deref, > ReadableArgs<(B, E, Option, O, D, K, L)> for (BestBlock, OutputSweeperSync) @@ -1163,7 +1154,6 @@ where D::Target: ChangeDestinationSourceSync, F::Target: Filter + Sync + Send, K::Target: KVStoreSync, - L::Target: Logger, O::Target: OutputSpender, { #[inline] From 902ed6ccac416b8a19b86d87bf712900007d6738 Mon Sep 17 00:00:00 2001 From: Valentine Wallace Date: Thu, 15 Jan 2026 12:37:55 -0500 Subject: [PATCH 09/17] Drop Deref indirection for SignerProvider Reduces generics and verbosity across the codebase, should provide equivalent behavior. Co-Authored-By: Claude Opus 4.5 --- lightning/src/chain/chainmonitor.rs | 35 +--- lightning/src/events/bump_transaction/mod.rs | 12 +- lightning/src/events/bump_transaction/sync.rs | 12 +- lightning/src/ln/channel.rs | 198 +++++------------- lightning/src/ln/channel_state.rs | 9 +- lightning/src/ln/channelmanager.rs | 123 ++++------- lightning/src/sign/mod.rs | 22 ++ lightning/src/sign/type_resolver.rs | 27 +-- lightning/src/util/persist.rs | 85 +++----- 9 files changed, 182 insertions(+), 341 deletions(-) diff --git a/lightning/src/chain/chainmonitor.rs b/lightning/src/chain/chainmonitor.rs index 87943bdf910..8835e9c8185 100644 --- a/lightning/src/chain/chainmonitor.rs +++ b/lightning/src/chain/chainmonitor.rs @@ -260,12 +260,11 @@ pub struct AsyncPersister< S: FutureSpawner, L: Logger + MaybeSend + MaybeSync + 'static, ES: EntropySource + MaybeSend + MaybeSync + 'static, - SP: Deref + MaybeSend + MaybeSync + 'static, + SP: SignerProvider + MaybeSend + MaybeSync + 'static, BI: BroadcasterInterface + MaybeSend + MaybeSync + 'static, FE: FeeEstimator + MaybeSend + MaybeSync + 'static, > where K::Target: KVStore + MaybeSync, - SP::Target: SignerProvider + Sized, { persister: MonitorUpdatingPersisterAsync, event_notifier: Arc, @@ -276,13 +275,12 @@ impl< S: FutureSpawner, L: Logger + MaybeSend + MaybeSync + 'static, ES: EntropySource + MaybeSend + MaybeSync + 'static, - SP: Deref + MaybeSend + MaybeSync + 'static, + SP: SignerProvider + MaybeSend + MaybeSync + 'static, BI: BroadcasterInterface + MaybeSend + MaybeSync + 'static, FE: FeeEstimator + MaybeSend + MaybeSync + 'static, > Deref for AsyncPersister where K::Target: KVStore + MaybeSync, - SP::Target: SignerProvider + Sized, { type Target = Self; fn deref(&self) -> &Self { @@ -295,18 +293,16 @@ impl< S: FutureSpawner, L: Logger + MaybeSend + MaybeSync + 'static, ES: EntropySource + MaybeSend + MaybeSync + 'static, - SP: Deref + MaybeSend + MaybeSync + 'static, + SP: SignerProvider + MaybeSend + MaybeSync + 'static, BI: BroadcasterInterface + MaybeSend + MaybeSync + 'static, FE: FeeEstimator + MaybeSend + MaybeSync + 'static, - > Persist<::EcdsaSigner> for AsyncPersister + > Persist for AsyncPersister where K::Target: KVStore + MaybeSync, - SP::Target: SignerProvider + Sized, - ::EcdsaSigner: MaybeSend + 'static, + SP::EcdsaSigner: MaybeSend + 'static, { fn persist_new_channel( - &self, monitor_name: MonitorName, - monitor: &ChannelMonitor<::EcdsaSigner>, + &self, monitor_name: MonitorName, monitor: &ChannelMonitor, ) -> ChannelMonitorUpdateStatus { let notifier = Arc::clone(&self.event_notifier); self.persister.spawn_async_persist_new_channel(monitor_name, monitor, notifier); @@ -315,7 +311,7 @@ where fn update_persisted_channel( &self, monitor_name: MonitorName, monitor_update: Option<&ChannelMonitorUpdate>, - monitor: &ChannelMonitor<::EcdsaSigner>, + monitor: &ChannelMonitor, ) -> ChannelMonitorUpdateStatus { let notifier = Arc::clone(&self.event_notifier); self.persister.spawn_async_update_channel(monitor_name, monitor_update, monitor, notifier); @@ -386,26 +382,17 @@ pub struct ChainMonitor< impl< K: Deref + MaybeSend + MaybeSync + 'static, S: FutureSpawner, - SP: Deref + MaybeSend + MaybeSync + 'static, + SP: SignerProvider + MaybeSend + MaybeSync + 'static, C: Deref, T: BroadcasterInterface + MaybeSend + MaybeSync + 'static, F: FeeEstimator + MaybeSend + MaybeSync + 'static, L: Logger + MaybeSend + MaybeSync + 'static, ES: EntropySource + MaybeSend + MaybeSync + 'static, - > - ChainMonitor< - ::EcdsaSigner, - C, - T, - F, - L, - AsyncPersister, - ES, - > where + > ChainMonitor, ES> +where K::Target: KVStore + MaybeSync, - SP::Target: SignerProvider + Sized, C::Target: chain::Filter, - ::EcdsaSigner: MaybeSend + 'static, + SP::EcdsaSigner: MaybeSend + 'static, { /// Creates a new `ChainMonitor` used to watch on-chain activity pertaining to channels. /// diff --git a/lightning/src/events/bump_transaction/mod.rs b/lightning/src/events/bump_transaction/mod.rs index bc912124410..1b3496c5eab 100644 --- a/lightning/src/events/bump_transaction/mod.rs +++ b/lightning/src/events/bump_transaction/mod.rs @@ -691,10 +691,13 @@ where /// /// [`Event::BumpTransaction`]: crate::events::Event::BumpTransaction // Note that updates to documentation on this struct should be copied to the synchronous version. -pub struct BumpTransactionEventHandler -where +pub struct BumpTransactionEventHandler< + B: BroadcasterInterface, + C: Deref, + SP: SignerProvider, + L: Logger, +> where C::Target: CoinSelectionSource, - SP::Target: SignerProvider, { broadcaster: B, utxo_source: C, @@ -703,11 +706,10 @@ where secp: Secp256k1, } -impl +impl BumpTransactionEventHandler where C::Target: CoinSelectionSource, - SP::Target: SignerProvider, { /// Returns a new instance capable of handling [`Event::BumpTransaction`] events. /// diff --git a/lightning/src/events/bump_transaction/sync.rs b/lightning/src/events/bump_transaction/sync.rs index e19ab3d7804..f4245cd5194 100644 --- a/lightning/src/events/bump_transaction/sync.rs +++ b/lightning/src/events/bump_transaction/sync.rs @@ -264,20 +264,22 @@ where /// /// [`Event::BumpTransaction`]: crate::events::Event::BumpTransaction // Note that updates to documentation on this struct should be copied to the synchronous version. -pub struct BumpTransactionEventHandlerSync -where +pub struct BumpTransactionEventHandlerSync< + B: BroadcasterInterface, + C: Deref, + SP: SignerProvider, + L: Logger, +> where C::Target: CoinSelectionSourceSync, - SP::Target: SignerProvider, { bump_transaction_event_handler: BumpTransactionEventHandler, SP, L>, } -impl +impl BumpTransactionEventHandlerSync where C::Target: CoinSelectionSourceSync, - SP::Target: SignerProvider, { /// Constructs a new instance of [`BumpTransactionEventHandlerSync`]. pub fn new(broadcaster: B, utxo_source: C, signer_provider: SP, logger: L) -> Self { diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs index 4377982959c..bef77a125f5 100644 --- a/lightning/src/ln/channel.rs +++ b/lightning/src/ln/channel.rs @@ -93,7 +93,6 @@ use crate::prelude::*; use crate::sign::type_resolver::ChannelSignerType; #[cfg(any(test, fuzzing, debug_assertions))] use crate::sync::Mutex; -use core::ops::Deref; use core::time::Duration; use core::{cmp, fmt, mem}; @@ -1002,12 +1001,9 @@ impl<'a, L: Logger> Logger for WithChannelContext<'a, L> { } impl<'a, 'b, L: Logger> WithChannelContext<'a, L> { - pub(super) fn from( + pub(super) fn from( logger: &'a L, context: &'b ChannelContext, payment_hash: Option, - ) -> Self - where - S::Target: SignerProvider, - { + ) -> Self { WithChannelContext { logger, peer_id: Some(context.counterparty_node_id), @@ -1242,9 +1238,7 @@ struct HolderCommitmentPoint { impl HolderCommitmentPoint { #[rustfmt::skip] - pub fn new(signer: &ChannelSignerType, secp_ctx: &Secp256k1) -> Option - where SP::Target: SignerProvider - { + pub fn new(signer: &ChannelSignerType, secp_ctx: &Secp256k1) -> Option { Some(HolderCommitmentPoint { next_transaction_number: INITIAL_COMMITMENT_NUMBER, previous_revoked_point: None, @@ -1285,11 +1279,9 @@ impl HolderCommitmentPoint { /// If we are pending advancing the next commitment point, this method tries asking the signer /// again. - pub fn try_resolve_pending( + pub fn try_resolve_pending( &mut self, signer: &ChannelSignerType, secp_ctx: &Secp256k1, logger: &L, - ) where - SP::Target: SignerProvider, - { + ) { if !self.can_advance() { let pending_next_point = signer .as_ref() @@ -1321,12 +1313,9 @@ impl HolderCommitmentPoint { /// /// If our signer is ready to provide the next commitment point, the next call to `advance` will /// succeed. - pub fn advance( + pub fn advance( &mut self, signer: &ChannelSignerType, secp_ctx: &Secp256k1, logger: &L, - ) -> Result<(), ()> - where - SP::Target: SignerProvider, - { + ) -> Result<(), ()> { if let Some(next_point) = self.pending_next_point { *self = Self { next_transaction_number: self.next_transaction_number - 1, @@ -1442,19 +1431,13 @@ impl_writeable_tlv_based!(PendingChannelMonitorUpdate, { /// A payment channel with a counterparty throughout its life-cycle, encapsulating negotiation and /// funding phases. -pub(super) struct Channel -where - SP::Target: SignerProvider, -{ +pub(super) struct Channel { phase: ChannelPhase, } /// The `ChannelPhase` enum describes the current phase in life of a lightning channel with each of /// its variants containing an appropriate channel struct. -enum ChannelPhase -where - SP::Target: SignerProvider, -{ +enum ChannelPhase { Undefined, UnfundedOutboundV1(OutboundV1Channel), UnfundedInboundV1(InboundV1Channel), @@ -1462,10 +1445,9 @@ where Funded(FundedChannel), } -impl Channel +impl Channel where - SP::Target: SignerProvider, - ::EcdsaSigner: ChannelSigner, + SP::EcdsaSigner: ChannelSigner, { pub fn context(&self) -> &ChannelContext { match &self.phase { @@ -1978,7 +1960,7 @@ where #[rustfmt::skip] pub fn funding_signed( &mut self, msg: &msgs::FundingSigned, best_block: BestBlock, signer_provider: &SP, logger: &L - ) -> Result<(&mut FundedChannel, ChannelMonitor<::EcdsaSigner>), ChannelError> { + ) -> Result<(&mut FundedChannel, ChannelMonitor), ChannelError> { let phase = core::mem::replace(&mut self.phase, ChannelPhase::Undefined); let result = if let ChannelPhase::UnfundedOutboundV1(chan) = phase { let channel_state = chan.context.channel_state; @@ -2125,7 +2107,7 @@ where #[rustfmt::skip] pub fn commitment_signed( &mut self, msg: &msgs::CommitmentSigned, best_block: BestBlock, signer_provider: &SP, fee_estimator: &LowerBoundedFeeEstimator, logger: &L - ) -> Result<(Option::EcdsaSigner>>, Option), ChannelError> { + ) -> Result<(Option>, Option), ChannelError> { let phase = core::mem::replace(&mut self.phase, ChannelPhase::Undefined); match phase { ChannelPhase::UnfundedV2(chan) => { @@ -2220,40 +2202,36 @@ where } } -impl From> for Channel +impl From> for Channel where - SP::Target: SignerProvider, - ::EcdsaSigner: ChannelSigner, + SP::EcdsaSigner: ChannelSigner, { fn from(channel: OutboundV1Channel) -> Self { Channel { phase: ChannelPhase::UnfundedOutboundV1(channel) } } } -impl From> for Channel +impl From> for Channel where - SP::Target: SignerProvider, - ::EcdsaSigner: ChannelSigner, + SP::EcdsaSigner: ChannelSigner, { fn from(channel: InboundV1Channel) -> Self { Channel { phase: ChannelPhase::UnfundedInboundV1(channel) } } } -impl From> for Channel +impl From> for Channel where - SP::Target: SignerProvider, - ::EcdsaSigner: ChannelSigner, + SP::EcdsaSigner: ChannelSigner, { fn from(channel: PendingV2Channel) -> Self { Channel { phase: ChannelPhase::UnfundedV2(channel) } } } -impl From> for Channel +impl From> for Channel where - SP::Target: SignerProvider, - ::EcdsaSigner: ChannelSigner, + SP::EcdsaSigner: ChannelSigner, { fn from(channel: FundedChannel) -> Self { Channel { phase: ChannelPhase::Funded(channel) } @@ -2505,14 +2483,11 @@ impl FundingScope { } /// Constructs a `FundingScope` for splicing a channel. - fn for_splice( + fn for_splice( prev_funding: &Self, context: &ChannelContext, our_funding_contribution: SignedAmount, their_funding_contribution: SignedAmount, counterparty_funding_pubkey: PublicKey, our_new_holder_keys: ChannelPublicKeys, - ) -> Self - where - SP::Target: SignerProvider, - { + ) -> Self { debug_assert!(our_funding_contribution.abs() <= SignedAmount::MAX_MONEY); debug_assert!(their_funding_contribution.abs() <= SignedAmount::MAX_MONEY); @@ -2689,12 +2664,9 @@ impl FundingNegotiation { } impl PendingFunding { - fn check_get_splice_locked( + fn check_get_splice_locked( &mut self, context: &ChannelContext, confirmed_funding_index: usize, height: u32, - ) -> Option - where - SP::Target: SignerProvider, - { + ) -> Option { debug_assert!(confirmed_funding_index < self.negotiated_candidates.len()); let funding = &self.negotiated_candidates[confirmed_funding_index]; @@ -2800,10 +2772,7 @@ impl<'a> From<&'a Transaction> for ConfirmedTransaction<'a> { /// Contains everything about the channel including state, and various flags. #[cfg_attr(test, derive(Debug))] -pub(super) struct ChannelContext -where - SP::Target: SignerProvider, -{ +pub(super) struct ChannelContext { config: LegacyChannelConfig, // Track the previous `ChannelConfig` so that we can continue forwarding HTLCs that were @@ -3091,10 +3060,7 @@ where /// A channel struct implementing this trait can receive an initial counterparty commitment /// transaction signature. -trait InitialRemoteCommitmentReceiver -where - SP::Target: SignerProvider, -{ +trait InitialRemoteCommitmentReceiver { fn context(&self) -> &ChannelContext; fn context_mut(&mut self) -> &mut ChannelContext; @@ -3132,7 +3098,7 @@ where fn initial_commitment_signed( &mut self, channel_id: ChannelId, counterparty_signature: Signature, holder_commitment_point: &mut HolderCommitmentPoint, best_block: BestBlock, signer_provider: &SP, logger: &L, - ) -> Result<(ChannelMonitor<::EcdsaSigner>, CommitmentTransaction), ChannelError> { + ) -> Result<(ChannelMonitor, CommitmentTransaction), ChannelError> { let initial_commitment_tx = match self.check_counterparty_commitment_signature(&counterparty_signature, holder_commitment_point, logger) { Ok(res) => res, Err(ChannelError::Close(e)) => { @@ -3220,10 +3186,7 @@ where fn is_v2_established(&self) -> bool; } -impl InitialRemoteCommitmentReceiver for OutboundV1Channel -where - SP::Target: SignerProvider, -{ +impl InitialRemoteCommitmentReceiver for OutboundV1Channel { fn context(&self) -> &ChannelContext { &self.context } @@ -3249,10 +3212,7 @@ where } } -impl InitialRemoteCommitmentReceiver for InboundV1Channel -where - SP::Target: SignerProvider, -{ +impl InitialRemoteCommitmentReceiver for InboundV1Channel { fn context(&self) -> &ChannelContext { &self.context } @@ -3278,10 +3238,7 @@ where } } -impl InitialRemoteCommitmentReceiver for FundedChannel -where - SP::Target: SignerProvider, -{ +impl InitialRemoteCommitmentReceiver for FundedChannel { fn context(&self) -> &ChannelContext { &self.context } @@ -3316,10 +3273,7 @@ where } } -impl ChannelContext -where - SP::Target: SignerProvider, -{ +impl ChannelContext { #[rustfmt::skip] fn new_for_inbound_channel<'a, ES: EntropySource, F: FeeEstimator, L: Logger>( fee_estimator: &'a LowerBoundedFeeEstimator, @@ -3339,10 +3293,7 @@ where msg_channel_reserve_satoshis: u64, msg_push_msat: u64, open_channel_fields: msgs::CommonOpenChannelFields, - ) -> Result<(FundingScope, ChannelContext), ChannelError> - where - SP::Target: SignerProvider, - { + ) -> Result<(FundingScope, ChannelContext), ChannelError> { let logger = WithContext::from(logger, Some(counterparty_node_id), Some(open_channel_fields.temporary_channel_id), None); let announce_for_forwarding = if (open_channel_fields.channel_flags & 1) == 1 { true } else { false }; @@ -3677,12 +3628,9 @@ where temporary_channel_id_fn: Option ChannelId>, holder_selected_channel_reserve_satoshis: u64, channel_keys_id: [u8; 32], - holder_signer: ::EcdsaSigner, + holder_signer: SP::EcdsaSigner, _logger: L, - ) -> Result<(FundingScope, ChannelContext), APIError> - where - SP::Target: SignerProvider, - { + ) -> Result<(FundingScope, ChannelContext), APIError> { // This will be updated with the counterparty contribution if this is a dual-funded channel let channel_value_satoshis = funding_satoshis; @@ -6172,10 +6120,7 @@ where fn get_initial_counterparty_commitment_signatures( &self, funding: &FundingScope, logger: &L, - ) -> Option<(Signature, Vec)> - where - SP::Target: SignerProvider, - { + ) -> Option<(Signature, Vec)> { let mut commitment_number = self.counterparty_next_commitment_transaction_number; let mut commitment_point = self.counterparty_next_commitment_point.unwrap(); @@ -6216,10 +6161,7 @@ where fn get_initial_commitment_signed_v2( &self, funding: &FundingScope, logger: &L, - ) -> Option - where - SP::Target: SignerProvider, - { + ) -> Option { let signatures = self.get_initial_counterparty_commitment_signatures(funding, logger); if let Some((signature, htlc_signatures)) = signatures { log_info!(logger, "Generated commitment_signed for peer",); @@ -6557,13 +6499,10 @@ pub(super) struct FundingNegotiationContext { impl FundingNegotiationContext { /// Prepare and start interactive transaction negotiation. /// If error occurs, it is caused by our side, not the counterparty. - fn into_interactive_tx_constructor( + fn into_interactive_tx_constructor( mut self, context: &ChannelContext, funding: &FundingScope, signer_provider: &SP, entropy_source: &ES, holder_node_id: PublicKey, - ) -> Result - where - SP::Target: SignerProvider, - { + ) -> Result { debug_assert_eq!( self.shared_funding_input.is_some(), funding.channel_transaction_parameters.splice_parent_funding_txid.is_some(), @@ -6667,10 +6606,7 @@ impl FundingNegotiationContext { // Holder designates channel data owned for the benefit of the user client. // Counterparty designates channel data owned by the another channel participant entity. #[cfg_attr(test, derive(Debug))] -pub(super) struct FundedChannel -where - SP::Target: SignerProvider, -{ +pub(super) struct FundedChannel { pub funding: FundingScope, pub context: ChannelContext, holder_commitment_point: HolderCommitmentPoint, @@ -6853,10 +6789,9 @@ pub struct SpliceFundingPromotion { pub discarded_funding: Vec, } -impl FundedChannel +impl FundedChannel where - SP::Target: SignerProvider, - ::EcdsaSigner: EcdsaChannelSigner, + SP::EcdsaSigner: EcdsaChannelSigner, { pub fn context(&self) -> &ChannelContext { &self.context @@ -7772,7 +7707,7 @@ where pub fn initial_commitment_signed_v2( &mut self, msg: &msgs::CommitmentSigned, best_block: BestBlock, signer_provider: &SP, logger: &L, - ) -> Result::EcdsaSigner>, ChannelError> { + ) -> Result, ChannelError> { if let Some(signing_session) = self.context.interactive_tx_signing_session.as_ref() { if signing_session.has_received_tx_signatures() { let msg = "Received initial commitment_signed after peer's tx_signatures received!"; @@ -13272,10 +13207,7 @@ where } /// A not-yet-funded outbound (from holder) channel using V1 channel establishment. -pub(super) struct OutboundV1Channel -where - SP::Target: SignerProvider, -{ +pub(super) struct OutboundV1Channel { pub funding: FundingScope, pub context: ChannelContext, pub unfunded_context: UnfundedChannelContext, @@ -13285,10 +13217,7 @@ where pub signer_pending_open_channel: bool, } -impl OutboundV1Channel -where - SP::Target: SignerProvider, -{ +impl OutboundV1Channel { pub fn abandon_unfunded_chan(&mut self, closure_reason: ClosureReason) -> ShutdownResult { self.context.force_shutdown(&self.funding, closure_reason) } @@ -13524,7 +13453,7 @@ where mut self, msg: &msgs::FundingSigned, best_block: BestBlock, signer_provider: &SP, logger: &L, ) -> Result< - (FundedChannel, ChannelMonitor<::EcdsaSigner>), + (FundedChannel, ChannelMonitor), (OutboundV1Channel, ChannelError), > { if !self.funding.is_outbound() { @@ -13628,10 +13557,7 @@ where } /// A not-yet-funded inbound (from counterparty) channel using V1 channel establishment. -pub(super) struct InboundV1Channel -where - SP::Target: SignerProvider, -{ +pub(super) struct InboundV1Channel { pub funding: FundingScope, pub context: ChannelContext, pub unfunded_context: UnfundedChannelContext, @@ -13669,10 +13595,7 @@ pub(super) fn channel_type_from_open_channel( Ok(channel_type.clone()) } -impl InboundV1Channel -where - SP::Target: SignerProvider, -{ +impl InboundV1Channel { /// Creates a new channel from a remote sides' request for one. /// Assumes chain_hash has already been checked and corresponds with what we expect! #[rustfmt::skip] @@ -13810,11 +13733,7 @@ where mut self, msg: &msgs::FundingCreated, best_block: BestBlock, signer_provider: &SP, logger: &L, ) -> Result< - ( - FundedChannel, - Option, - ChannelMonitor<::EcdsaSigner>, - ), + (FundedChannel, Option, ChannelMonitor), (Self, ChannelError), > { if self.funding.is_outbound() { @@ -13919,10 +13838,7 @@ where } // A not-yet-funded channel using V2 channel establishment. -pub(super) struct PendingV2Channel -where - SP::Target: SignerProvider, -{ +pub(super) struct PendingV2Channel { pub funding: FundingScope, pub context: ChannelContext, pub unfunded_context: UnfundedChannelContext, @@ -13931,10 +13847,7 @@ where pub interactive_tx_constructor: Option, } -impl PendingV2Channel -where - SP::Target: SignerProvider, -{ +impl PendingV2Channel { #[allow(dead_code)] // TODO(dual_funding): Remove once creating V2 channels is enabled. #[rustfmt::skip] pub fn new_outbound( @@ -14341,10 +14254,7 @@ impl Readable for AnnouncementSigsState { } } -impl Writeable for FundedChannel -where - SP::Target: SignerProvider, -{ +impl Writeable for FundedChannel { fn write(&self, writer: &mut W) -> Result<(), io::Error> { // Note that we write out as if remove_uncommitted_htlcs_and_mark_paused had just been // called. @@ -14829,10 +14739,8 @@ where } } -impl<'a, 'b, 'c, ES: EntropySource, SP: Deref> +impl<'a, 'b, 'c, ES: EntropySource, SP: SignerProvider> ReadableArgs<(&'a ES, &'b SP, &'c ChannelTypeFeatures)> for FundedChannel -where - SP::Target: SignerProvider, { fn read( reader: &mut R, args: (&'a ES, &'b SP, &'c ChannelTypeFeatures), diff --git a/lightning/src/ln/channel_state.rs b/lightning/src/ln/channel_state.rs index 7c591ff2c3b..86e53ba3262 100644 --- a/lightning/src/ln/channel_state.rs +++ b/lightning/src/ln/channel_state.rs @@ -22,8 +22,6 @@ use crate::types::features::{ChannelTypeFeatures, InitFeatures}; use crate::types::payment::PaymentHash; use crate::util::config::ChannelConfig; -use core::ops::Deref; - /// Exposes the state of pending inbound HTLCs. /// /// At a high level, an HTLC being forwarded from one Lightning node to another Lightning node goes @@ -524,13 +522,10 @@ impl ChannelDetails { } } - pub(super) fn from_channel( + pub(super) fn from_channel( channel: &Channel, best_block_height: u32, latest_features: InitFeatures, fee_estimator: &LowerBoundedFeeEstimator, - ) -> Self - where - SP::Target: SignerProvider, - { + ) -> Self { let context = channel.context(); let funding = channel.funding(); let balance = channel.get_available_balances(fee_estimator); diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs index 74a3330ba6b..a9c8aba2058 100644 --- a/lightning/src/ln/channelmanager.rs +++ b/lightning/src/ln/channelmanager.rs @@ -1536,10 +1536,7 @@ impl Readable for Option { } /// State we hold per-peer. -pub(super) struct PeerState -where - SP::Target: SignerProvider, -{ +pub(super) struct PeerState { /// `channel_id` -> `Channel` /// /// Holds all channels where the peer is the counterparty. @@ -1614,10 +1611,7 @@ where peer_storage: Vec, } -impl PeerState -where - SP::Target: SignerProvider, -{ +impl PeerState { /// Indicates that a peer meets the criteria where we're ok to remove it from our storage. /// If true is passed for `require_disconnected`, the function will return false if we haven't /// disconnected from the node already, ie. `PeerState::is_connected` is set to `true`. @@ -1782,9 +1776,7 @@ pub trait AChannelManager { /// A type implementing [`EcdsaChannelSigner`]. type Signer: EcdsaChannelSigner + Sized; /// A type implementing [`SignerProvider`] for [`Self::Signer`]. - type SignerProvider: SignerProvider + ?Sized; - /// A type that may be dereferenced to [`Self::SignerProvider`]. - type SP: Deref; + type SP: SignerProvider; /// A type implementing [`FeeEstimator`]. type FeeEstimator: FeeEstimator; /// A type implementing [`Router`]. @@ -1814,23 +1806,21 @@ impl< T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, - SP: Deref, + SP: SignerProvider, F: FeeEstimator, R: Router, MR: MessageRouter, L: Logger, > AChannelManager for ChannelManager where - M::Target: chain::Watch<::EcdsaSigner>, - SP::Target: SignerProvider, + M::Target: chain::Watch, { type Watch = M::Target; type M = M; type Broadcaster = T; type EntropySource = ES; type NodeSigner = NS; - type Signer = ::EcdsaSigner; - type SignerProvider = SP::Target; + type Signer = SP::EcdsaSigner; type SP = SP; type FeeEstimator = F; type Router = R; @@ -2625,14 +2615,13 @@ pub struct ChannelManager< T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, - SP: Deref, + SP: SignerProvider, F: FeeEstimator, R: Router, MR: MessageRouter, L: Logger, > where - M::Target: chain::Watch<::EcdsaSigner>, - SP::Target: SignerProvider, + M::Target: chain::Watch, { config: RwLock, chain_hash: ChainHash, @@ -3694,15 +3683,14 @@ impl< T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, - SP: Deref, + SP: SignerProvider, F: FeeEstimator, R: Router, MR: MessageRouter, L: Logger, > ChannelManager where - M::Target: chain::Watch<::EcdsaSigner>, - SP::Target: SignerProvider, + M::Target: chain::Watch, { /// Constructs a new `ChannelManager` to hold several channels and route between them. /// @@ -4713,10 +4701,7 @@ where /// The same closure semantics as described in [`ChannelManager::locked_handle_force_close`] apply. fn locked_handle_unfunded_close( &self, err: ChannelError, chan: &mut Channel, - ) -> (bool, MsgHandleErrInternal) - where - SP::Target: SignerProvider, - { + ) -> (bool, MsgHandleErrInternal) { let chan_id = chan.context().channel_id(); convert_channel_err_internal(err, chan_id, |reason, msg| { let logger = WithChannelContext::from(&self.logger, chan.context(), None); @@ -13156,15 +13141,14 @@ impl< T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, - SP: Deref, + SP: SignerProvider, F: FeeEstimator, R: Router, MR: MessageRouter, L: Logger, > ChannelManager where - M::Target: chain::Watch<::EcdsaSigner>, - SP::Target: SignerProvider, + M::Target: chain::Watch, { #[cfg(not(c_bindings))] create_offer_builder!(self, OfferBuilder<'_, DerivedMetadata, secp256k1::All>); @@ -14001,15 +13985,14 @@ impl< T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, - SP: Deref, + SP: SignerProvider, F: FeeEstimator, R: Router, MR: MessageRouter, L: Logger, > BaseMessageHandler for ChannelManager where - M::Target: chain::Watch<::EcdsaSigner>, - SP::Target: SignerProvider, + M::Target: chain::Watch, { fn provided_node_features(&self) -> NodeFeatures { provided_node_features(&self.config.read().unwrap()) @@ -14352,15 +14335,14 @@ impl< T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, - SP: Deref, + SP: SignerProvider, F: FeeEstimator, R: Router, MR: MessageRouter, L: Logger, > EventsProvider for ChannelManager where - M::Target: chain::Watch<::EcdsaSigner>, - SP::Target: SignerProvider, + M::Target: chain::Watch, { /// Processes events that must be periodically handled. /// @@ -14380,15 +14362,14 @@ impl< T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, - SP: Deref, + SP: SignerProvider, F: FeeEstimator, R: Router, MR: MessageRouter, L: Logger, > chain::Listen for ChannelManager where - M::Target: chain::Watch<::EcdsaSigner>, - SP::Target: SignerProvider, + M::Target: chain::Watch, { fn filtered_block_connected(&self, header: &Header, txdata: &TransactionData, height: u32) { { @@ -14434,15 +14415,14 @@ impl< T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, - SP: Deref, + SP: SignerProvider, F: FeeEstimator, R: Router, MR: MessageRouter, L: Logger, > chain::Confirm for ChannelManager where - M::Target: chain::Watch<::EcdsaSigner>, - SP::Target: SignerProvider, + M::Target: chain::Watch, { #[rustfmt::skip] fn transactions_confirmed(&self, header: &Header, txdata: &TransactionData, height: u32) { @@ -14600,15 +14580,14 @@ impl< T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, - SP: Deref, + SP: SignerProvider, F: FeeEstimator, R: Router, MR: MessageRouter, L: Logger, > ChannelManager where - M::Target: chain::Watch<::EcdsaSigner>, - SP::Target: SignerProvider, + M::Target: chain::Watch, { /// Calls a function which handles an on-chain event (blocks dis/connected, transactions /// un/confirmed, etc) on each channel, handling any resulting errors or messages generated by @@ -14955,15 +14934,14 @@ impl< T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, - SP: Deref, + SP: SignerProvider, F: FeeEstimator, R: Router, MR: MessageRouter, L: Logger, > ChannelMessageHandler for ChannelManager where - M::Target: chain::Watch<::EcdsaSigner>, - SP::Target: SignerProvider, + M::Target: chain::Watch, { fn handle_open_channel(&self, counterparty_node_id: PublicKey, message: &msgs::OpenChannel) { // Note that we never need to persist the updated ChannelManager for an inbound @@ -15523,15 +15501,14 @@ impl< T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, - SP: Deref, + SP: SignerProvider, F: FeeEstimator, R: Router, MR: MessageRouter, L: Logger, > OffersMessageHandler for ChannelManager where - M::Target: chain::Watch<::EcdsaSigner>, - SP::Target: SignerProvider, + M::Target: chain::Watch, { #[rustfmt::skip] fn handle_message( @@ -15734,15 +15711,14 @@ impl< T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, - SP: Deref, + SP: SignerProvider, F: FeeEstimator, R: Router, MR: MessageRouter, L: Logger, > AsyncPaymentsMessageHandler for ChannelManager where - M::Target: chain::Watch<::EcdsaSigner>, - SP::Target: SignerProvider, + M::Target: chain::Watch, { fn handle_offer_paths_request( &self, message: OfferPathsRequest, context: AsyncPaymentsContext, @@ -15929,15 +15905,14 @@ impl< T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, - SP: Deref, + SP: SignerProvider, F: FeeEstimator, R: Router, MR: MessageRouter, L: Logger, > DNSResolverMessageHandler for ChannelManager where - M::Target: chain::Watch<::EcdsaSigner>, - SP::Target: SignerProvider, + M::Target: chain::Watch, { fn handle_dnssec_query( &self, _message: DNSSECQuery, _responder: Option, @@ -15990,15 +15965,14 @@ impl< T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, - SP: Deref, + SP: SignerProvider, F: FeeEstimator, R: Router, MR: MessageRouter, L: Logger, > NodeIdLookUp for ChannelManager where - M::Target: chain::Watch<::EcdsaSigner>, - SP::Target: SignerProvider, + M::Target: chain::Watch, { fn next_node_id(&self, short_channel_id: u64) -> Option { self.short_to_chan_info.read().unwrap().get(&short_channel_id).map(|(pubkey, _)| *pubkey) @@ -16499,15 +16473,14 @@ impl< T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, - SP: Deref, + SP: SignerProvider, F: FeeEstimator, R: Router, MR: MessageRouter, L: Logger, > Writeable for ChannelManager where - M::Target: chain::Watch<::EcdsaSigner>, - SP::Target: SignerProvider, + M::Target: chain::Watch, { #[rustfmt::skip] fn write(&self, writer: &mut W) -> Result<(), io::Error> { @@ -16859,14 +16832,13 @@ pub struct ChannelManagerReadArgs< T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, - SP: Deref, + SP: SignerProvider, F: FeeEstimator, R: Router, MR: MessageRouter, L: Logger + Clone, > where - M::Target: chain::Watch<::EcdsaSigner>, - SP::Target: SignerProvider, + M::Target: chain::Watch, { /// A cryptographically secure source of entropy. pub entropy_source: ES, @@ -16922,8 +16894,7 @@ pub struct ChannelManagerReadArgs< /// this struct. /// /// This is not exported to bindings users because we have no HashMap bindings - pub channel_monitors: - HashMap::EcdsaSigner>>, + pub channel_monitors: HashMap>, } impl< @@ -16932,15 +16903,14 @@ impl< T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, - SP: Deref, + SP: SignerProvider, F: FeeEstimator, R: Router, MR: MessageRouter, L: Logger + Clone, > ChannelManagerReadArgs<'a, M, T, ES, NS, SP, F, R, MR, L> where - M::Target: chain::Watch<::EcdsaSigner>, - SP::Target: SignerProvider, + M::Target: chain::Watch, { /// Simple utility function to create a ChannelManagerReadArgs which creates the monitor /// HashMap for you. This is primarily useful for C bindings where it is not practical to @@ -16948,8 +16918,7 @@ where pub fn new( entropy_source: ES, node_signer: NS, signer_provider: SP, fee_estimator: F, chain_monitor: M, tx_broadcaster: T, router: R, message_router: MR, logger: L, - config: UserConfig, - mut channel_monitors: Vec<&'a ChannelMonitor<::EcdsaSigner>>, + config: UserConfig, mut channel_monitors: Vec<&'a ChannelMonitor>, ) -> Self { Self { entropy_source, @@ -17011,7 +16980,7 @@ impl< T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, - SP: Deref, + SP: SignerProvider, F: FeeEstimator, R: Router, MR: MessageRouter, @@ -17019,8 +16988,7 @@ impl< > ReadableArgs> for (BlockHash, Arc>) where - M::Target: chain::Watch<::EcdsaSigner>, - SP::Target: SignerProvider, + M::Target: chain::Watch, { fn read( reader: &mut Reader, args: ChannelManagerReadArgs<'a, M, T, ES, NS, SP, F, R, MR, L>, @@ -17037,7 +17005,7 @@ impl< T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, - SP: Deref, + SP: SignerProvider, F: FeeEstimator, R: Router, MR: MessageRouter, @@ -17045,8 +17013,7 @@ impl< > ReadableArgs> for (BlockHash, ChannelManager) where - M::Target: chain::Watch<::EcdsaSigner>, - SP::Target: SignerProvider, + M::Target: chain::Watch, { fn read( reader: &mut Reader, mut args: ChannelManagerReadArgs<'a, M, T, ES, NS, SP, F, R, MR, L>, diff --git a/lightning/src/sign/mod.rs b/lightning/src/sign/mod.rs index 539432df043..b05f11b35a9 100644 --- a/lightning/src/sign/mod.rs +++ b/lightning/src/sign/mod.rs @@ -1118,6 +1118,28 @@ pub trait SignerProvider { fn get_shutdown_scriptpubkey(&self) -> Result; } +impl> SignerProvider for SP { + type EcdsaSigner = T::EcdsaSigner; + #[cfg(taproot)] + type TaprootSigner = T::TaprootSigner; + + fn generate_channel_keys_id(&self, inbound: bool, user_channel_id: u128) -> [u8; 32] { + self.deref().generate_channel_keys_id(inbound, user_channel_id) + } + + fn derive_channel_signer(&self, channel_keys_id: [u8; 32]) -> Self::EcdsaSigner { + self.deref().derive_channel_signer(channel_keys_id) + } + + fn get_destination_script(&self, channel_keys_id: [u8; 32]) -> Result { + self.deref().get_destination_script(channel_keys_id) + } + + fn get_shutdown_scriptpubkey(&self) -> Result { + self.deref().get_shutdown_scriptpubkey() + } +} + /// A helper trait that describes an on-chain wallet capable of returning a (change) destination /// script. /// diff --git a/lightning/src/sign/type_resolver.rs b/lightning/src/sign/type_resolver.rs index a84886cdee0..405e346dda6 100644 --- a/lightning/src/sign/type_resolver.rs +++ b/lightning/src/sign/type_resolver.rs @@ -1,32 +1,21 @@ use crate::sign::{ChannelSigner, SignerProvider}; -use core::ops::Deref; -pub(crate) enum ChannelSignerType -where - SP::Target: SignerProvider, -{ +pub(crate) enum ChannelSignerType { // in practice, this will only ever be an EcdsaChannelSigner (specifically, Writeable) - Ecdsa(::EcdsaSigner), + Ecdsa(SP::EcdsaSigner), #[cfg(taproot)] #[allow(unused)] - Taproot(::TaprootSigner), + Taproot(SP::TaprootSigner), } #[cfg(test)] -impl std::fmt::Debug for ChannelSignerType -where - SP: Deref, - SP::Target: SignerProvider, -{ +impl std::fmt::Debug for ChannelSignerType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("ChannelSignerType").finish() } } -impl ChannelSignerType -where - SP::Target: SignerProvider, -{ +impl ChannelSignerType { pub(crate) fn as_ref(&self) -> &dyn ChannelSigner { match self { ChannelSignerType::Ecdsa(ecs) => ecs, @@ -37,7 +26,7 @@ where } #[allow(unused)] - pub(crate) fn as_ecdsa(&self) -> Option<&::EcdsaSigner> { + pub(crate) fn as_ecdsa(&self) -> Option<&SP::EcdsaSigner> { match self { ChannelSignerType::Ecdsa(ecs) => Some(ecs), _ => None, @@ -45,9 +34,7 @@ where } #[allow(unused)] - pub(crate) fn as_mut_ecdsa( - &mut self, - ) -> Option<&mut ::EcdsaSigner> { + pub(crate) fn as_mut_ecdsa(&mut self) -> Option<&mut SP::EcdsaSigner> { match self { ChannelSignerType::Ecdsa(ecs) => Some(ecs), _ => None, diff --git a/lightning/src/util/persist.rs b/lightning/src/util/persist.rs index a71e634699e..7742abf4400 100644 --- a/lightning/src/util/persist.rs +++ b/lightning/src/util/persist.rs @@ -445,12 +445,11 @@ impl Persist( +pub fn read_channel_monitors( kv_store: K, entropy_source: ES, signer_provider: SP, -) -> Result::EcdsaSigner>)>, io::Error> +) -> Result)>, io::Error> where K::Target: KVStoreSync, - SP::Target: SignerProvider + Sized, { let mut res = Vec::new(); @@ -458,13 +457,13 @@ where CHANNEL_MONITOR_PERSISTENCE_PRIMARY_NAMESPACE, CHANNEL_MONITOR_PERSISTENCE_SECONDARY_NAMESPACE, )? { - match ::EcdsaSigner>)>>::read( + match )>>::read( &mut io::Cursor::new(kv_store.read( CHANNEL_MONITOR_PERSISTENCE_PRIMARY_NAMESPACE, CHANNEL_MONITOR_PERSISTENCE_SECONDARY_NAMESPACE, &stored_key, )?), - (&entropy_source, &*signer_provider), + (&entropy_source, &signer_provider), ) { Ok(Some((block_hash, channel_monitor))) => { let monitor_name = MonitorName::from_str(&stored_key)?; @@ -591,25 +590,23 @@ pub struct MonitorUpdatingPersister< K: Deref, L: Logger, ES: EntropySource, - SP: Deref, + SP: SignerProvider, BI: BroadcasterInterface, FE: FeeEstimator, >(MonitorUpdatingPersisterAsync, PanicingSpawner, L, ES, SP, BI, FE>) where - K::Target: KVStoreSync, - SP::Target: SignerProvider + Sized; + K::Target: KVStoreSync; impl< K: Deref, L: Logger, ES: EntropySource, - SP: Deref, + SP: SignerProvider, BI: BroadcasterInterface, FE: FeeEstimator, > MonitorUpdatingPersister where K::Target: KVStoreSync, - SP::Target: SignerProvider + Sized, { /// Constructs a new [`MonitorUpdatingPersister`]. /// @@ -653,10 +650,7 @@ where /// Reads all stored channel monitors, along with any stored updates for them. pub fn read_all_channel_monitors_with_updates( &self, - ) -> Result< - Vec<(BlockHash, ChannelMonitor<::EcdsaSigner>)>, - io::Error, - > { + ) -> Result)>, io::Error> { poll_sync_future(self.0.read_all_channel_monitors_with_updates()) } @@ -677,8 +671,7 @@ where /// function to accomplish this. Take care to limit the number of parallel readers. pub fn read_channel_monitor_with_updates( &self, monitor_key: &str, - ) -> Result<(BlockHash, ChannelMonitor<::EcdsaSigner>), io::Error> - { + ) -> Result<(BlockHash, ChannelMonitor), io::Error> { poll_sync_future(self.0.read_channel_monitor_with_updates(monitor_key)) } @@ -698,13 +691,12 @@ impl< K: Deref, L: Logger, ES: EntropySource, - SP: Deref, + SP: SignerProvider, BI: BroadcasterInterface, FE: FeeEstimator, > Persist for MonitorUpdatingPersister where K::Target: KVStoreSync, - SP::Target: SignerProvider + Sized, { /// Persists a new channel. This means writing the entire monitor to the /// parametrized [`KVStoreSync`]. @@ -780,25 +772,23 @@ pub struct MonitorUpdatingPersisterAsync< S: FutureSpawner, L: Logger, ES: EntropySource, - SP: Deref, + SP: SignerProvider, BI: BroadcasterInterface, FE: FeeEstimator, >(Arc>) where - K::Target: KVStore, - SP::Target: SignerProvider + Sized; + K::Target: KVStore; struct MonitorUpdatingPersisterAsyncInner< K: Deref, S: FutureSpawner, L: Logger, ES: EntropySource, - SP: Deref, + SP: SignerProvider, BI: BroadcasterInterface, FE: FeeEstimator, > where K::Target: KVStore, - SP::Target: SignerProvider + Sized, { kv_store: K, async_completed_updates: Mutex>, @@ -816,13 +806,12 @@ impl< S: FutureSpawner, L: Logger, ES: EntropySource, - SP: Deref, + SP: SignerProvider, BI: BroadcasterInterface, FE: FeeEstimator, > MonitorUpdatingPersisterAsync where K::Target: KVStore, - SP::Target: SignerProvider + Sized, { /// Constructs a new [`MonitorUpdatingPersisterAsync`]. /// @@ -855,10 +844,7 @@ where /// deserialization as well. pub async fn read_all_channel_monitors_with_updates( &self, - ) -> Result< - Vec<(BlockHash, ChannelMonitor<::EcdsaSigner>)>, - io::Error, - > { + ) -> Result)>, io::Error> { let primary = CHANNEL_MONITOR_PERSISTENCE_PRIMARY_NAMESPACE; let secondary = CHANNEL_MONITOR_PERSISTENCE_SECONDARY_NAMESPACE; let monitor_list = self.0.kv_store.list(primary, secondary).await?; @@ -889,10 +875,7 @@ where /// `Arc` that can live for `'static` and be sent and accessed across threads. pub async fn read_all_channel_monitors_with_updates_parallel( self: &Arc, - ) -> Result< - Vec<(BlockHash, ChannelMonitor<::EcdsaSigner>)>, - io::Error, - > + ) -> Result)>, io::Error> where K: MaybeSend + MaybeSync + 'static, L: MaybeSend + MaybeSync + 'static, @@ -900,7 +883,7 @@ where SP: MaybeSend + MaybeSync + 'static, BI: MaybeSend + MaybeSync + 'static, FE: MaybeSend + MaybeSync + 'static, - ::EcdsaSigner: MaybeSend, + SP::EcdsaSigner: MaybeSend, { let primary = CHANNEL_MONITOR_PERSISTENCE_PRIMARY_NAMESPACE; let secondary = CHANNEL_MONITOR_PERSISTENCE_SECONDARY_NAMESPACE; @@ -942,8 +925,7 @@ where /// function to accomplish this. Take care to limit the number of parallel readers. pub async fn read_channel_monitor_with_updates( &self, monitor_key: &str, - ) -> Result<(BlockHash, ChannelMonitor<::EcdsaSigner>), io::Error> - { + ) -> Result<(BlockHash, ChannelMonitor), io::Error> { self.0.read_channel_monitor_with_updates(monitor_key).await } @@ -963,18 +945,16 @@ impl< S: FutureSpawner, L: Logger + MaybeSend + MaybeSync + 'static, ES: EntropySource + MaybeSend + MaybeSync + 'static, - SP: Deref + MaybeSend + MaybeSync + 'static, + SP: SignerProvider + MaybeSend + MaybeSync + 'static, BI: BroadcasterInterface + MaybeSend + MaybeSync + 'static, FE: FeeEstimator + MaybeSend + MaybeSync + 'static, > MonitorUpdatingPersisterAsync where K::Target: KVStore + MaybeSync, - SP::Target: SignerProvider + Sized, - ::EcdsaSigner: MaybeSend + 'static, + SP::EcdsaSigner: MaybeSend + 'static, { pub(crate) fn spawn_async_persist_new_channel( - &self, monitor_name: MonitorName, - monitor: &ChannelMonitor<::EcdsaSigner>, + &self, monitor_name: MonitorName, monitor: &ChannelMonitor, notifier: Arc, ) { let inner = Arc::clone(&self.0); @@ -1001,8 +981,7 @@ where pub(crate) fn spawn_async_update_channel( &self, monitor_name: MonitorName, update: Option<&ChannelMonitorUpdate>, - monitor: &ChannelMonitor<::EcdsaSigner>, - notifier: Arc, + monitor: &ChannelMonitor, notifier: Arc, ) { let inner = Arc::clone(&self.0); // Note that `update_persisted_channel` is a sync method which calls all the way through to @@ -1051,18 +1030,16 @@ impl< S: FutureSpawner, L: Logger, ES: EntropySource, - SP: Deref, + SP: SignerProvider, BI: BroadcasterInterface, FE: FeeEstimator, > MonitorUpdatingPersisterAsyncInner where K::Target: KVStore, - SP::Target: SignerProvider + Sized, { pub async fn read_channel_monitor_with_updates( &self, monitor_key: &str, - ) -> Result<(BlockHash, ChannelMonitor<::EcdsaSigner>), io::Error> - { + ) -> Result<(BlockHash, ChannelMonitor), io::Error> { match self.maybe_read_channel_monitor_with_updates(monitor_key).await? { Some(res) => Ok(res), None => Err(io::Error::new( @@ -1079,10 +1056,7 @@ where async fn maybe_read_channel_monitor_with_updates( &self, monitor_key: &str, - ) -> Result< - Option<(BlockHash, ChannelMonitor<::EcdsaSigner>)>, - io::Error, - > { + ) -> Result)>, io::Error> { let monitor_name = MonitorName::from_str(monitor_key)?; let read_future = pin!(self.maybe_read_monitor(&monitor_name, monitor_key)); let list_future = pin!(self @@ -1126,10 +1100,7 @@ where /// Read a channel monitor. async fn maybe_read_monitor( &self, monitor_name: &MonitorName, monitor_key: &str, - ) -> Result< - Option<(BlockHash, ChannelMonitor<::EcdsaSigner>)>, - io::Error, - > { + ) -> Result)>, io::Error> { let primary = CHANNEL_MONITOR_PERSISTENCE_PRIMARY_NAMESPACE; let secondary = CHANNEL_MONITOR_PERSISTENCE_SECONDARY_NAMESPACE; let monitor_bytes = self.kv_store.read(primary, secondary, monitor_key).await?; @@ -1138,9 +1109,9 @@ where if monitor_cursor.get_ref().starts_with(MONITOR_UPDATING_PERSISTER_PREPEND_SENTINEL) { monitor_cursor.set_position(MONITOR_UPDATING_PERSISTER_PREPEND_SENTINEL.len() as u64); } - match ::EcdsaSigner>)>>::read( + match )>>::read( &mut monitor_cursor, - (&self.entropy_source, &*self.signer_provider), + (&self.entropy_source, &self.signer_provider), ) { Ok(None) => Ok(None), Ok(Some((blockhash, channel_monitor))) => { From 8b5aea411936e3af37143692e72b4838aa8922e8 Mon Sep 17 00:00:00 2001 From: Valentine Wallace Date: Thu, 15 Jan 2026 13:35:50 -0500 Subject: [PATCH 10/17] Drop Deref indirection for chain::Watch Reduces generics and verbosity across the codebase, should provide equivalent behavior. Co-Authored-By: Claude Opus 4.5 --- lightning/src/chain/mod.rs | 24 ++++++ lightning/src/ln/channelmanager.rs | 89 ++++++----------------- lightning/src/ln/functional_test_utils.rs | 4 +- 3 files changed, 50 insertions(+), 67 deletions(-) diff --git a/lightning/src/chain/mod.rs b/lightning/src/chain/mod.rs index b4cc6a302ae..9f5c9653f65 100644 --- a/lightning/src/chain/mod.rs +++ b/lightning/src/chain/mod.rs @@ -25,6 +25,8 @@ use crate::ln::types::ChannelId; use crate::sign::ecdsa::EcdsaChannelSigner; use crate::sign::HTLCDescriptor; +use core::ops::Deref; + #[allow(unused_imports)] use crate::prelude::*; @@ -346,6 +348,28 @@ pub trait Watch { ) -> Vec<(OutPoint, ChannelId, Vec, PublicKey)>; } +impl + ?Sized, W: Deref> + Watch for W +{ + fn watch_channel( + &self, channel_id: ChannelId, monitor: ChannelMonitor, + ) -> Result { + self.deref().watch_channel(channel_id, monitor) + } + + fn update_channel( + &self, channel_id: ChannelId, update: &ChannelMonitorUpdate, + ) -> ChannelMonitorUpdateStatus { + self.deref().update_channel(channel_id, update) + } + + fn release_pending_monitor_events( + &self, + ) -> Vec<(OutPoint, ChannelId, Vec, PublicKey)> { + self.deref().release_pending_monitor_events() + } +} + /// The `Filter` trait defines behavior for indicating chain activity of interest pertaining to /// channels. /// diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs index a9c8aba2058..e6fb3e77be8 100644 --- a/lightning/src/ln/channelmanager.rs +++ b/lightning/src/ln/channelmanager.rs @@ -1764,9 +1764,7 @@ pub type SimpleRefChannelManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, 'i, M, T, F, L> /// languages. pub trait AChannelManager { /// A type implementing [`chain::Watch`]. - type Watch: chain::Watch + ?Sized; - /// A type that may be dereferenced to [`Self::Watch`]. - type M: Deref; + type Watch: chain::Watch; /// A type implementing [`BroadcasterInterface`]. type Broadcaster: BroadcasterInterface; /// A type implementing [`EntropySource`]. @@ -1789,7 +1787,7 @@ pub trait AChannelManager { fn get_cm( &self, ) -> &ChannelManager< - Self::M, + Self::Watch, Self::Broadcaster, Self::EntropySource, Self::NodeSigner, @@ -1802,7 +1800,7 @@ pub trait AChannelManager { } impl< - M: Deref, + M: chain::Watch, T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, @@ -1812,11 +1810,8 @@ impl< MR: MessageRouter, L: Logger, > AChannelManager for ChannelManager -where - M::Target: chain::Watch, { - type Watch = M::Target; - type M = M; + type Watch = M; type Broadcaster = T; type EntropySource = ES; type NodeSigner = NS; @@ -2611,7 +2606,7 @@ where // |__`pending_background_events` // pub struct ChannelManager< - M: Deref, + M: chain::Watch, T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, @@ -2620,9 +2615,7 @@ pub struct ChannelManager< R: Router, MR: MessageRouter, L: Logger, -> where - M::Target: chain::Watch, -{ +> { config: RwLock, chain_hash: ChainHash, fee_estimator: LowerBoundedFeeEstimator, @@ -3679,7 +3672,7 @@ fn create_htlc_intercepted_event( } impl< - M: Deref, + M: chain::Watch, T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, @@ -3689,8 +3682,6 @@ impl< MR: MessageRouter, L: Logger, > ChannelManager -where - M::Target: chain::Watch, { /// Constructs a new `ChannelManager` to hold several channels and route between them. /// @@ -13137,7 +13128,7 @@ macro_rules! create_refund_builder { ($self: ident, $builder: ty) => { } } impl< - M: Deref, + M: Watch, T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, @@ -13147,8 +13138,6 @@ impl< MR: MessageRouter, L: Logger, > ChannelManager -where - M::Target: chain::Watch, { #[cfg(not(c_bindings))] create_offer_builder!(self, OfferBuilder<'_, DerivedMetadata, secp256k1::All>); @@ -13981,7 +13970,7 @@ where } impl< - M: Deref, + M: chain::Watch, T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, @@ -13991,8 +13980,6 @@ impl< MR: MessageRouter, L: Logger, > BaseMessageHandler for ChannelManager -where - M::Target: chain::Watch, { fn provided_node_features(&self) -> NodeFeatures { provided_node_features(&self.config.read().unwrap()) @@ -14331,7 +14318,7 @@ where } impl< - M: Deref, + M: chain::Watch, T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, @@ -14341,8 +14328,6 @@ impl< MR: MessageRouter, L: Logger, > EventsProvider for ChannelManager -where - M::Target: chain::Watch, { /// Processes events that must be periodically handled. /// @@ -14358,7 +14343,7 @@ where } impl< - M: Deref, + M: chain::Watch, T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, @@ -14368,8 +14353,6 @@ impl< MR: MessageRouter, L: Logger, > chain::Listen for ChannelManager -where - M::Target: chain::Watch, { fn filtered_block_connected(&self, header: &Header, txdata: &TransactionData, height: u32) { { @@ -14411,7 +14394,7 @@ where } impl< - M: Deref, + M: chain::Watch, T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, @@ -14421,8 +14404,6 @@ impl< MR: MessageRouter, L: Logger, > chain::Confirm for ChannelManager -where - M::Target: chain::Watch, { #[rustfmt::skip] fn transactions_confirmed(&self, header: &Header, txdata: &TransactionData, height: u32) { @@ -14576,7 +14557,7 @@ pub(super) enum FundingConfirmedMessage { } impl< - M: Deref, + M: chain::Watch, T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, @@ -14586,8 +14567,6 @@ impl< MR: MessageRouter, L: Logger, > ChannelManager -where - M::Target: chain::Watch, { /// Calls a function which handles an on-chain event (blocks dis/connected, transactions /// un/confirmed, etc) on each channel, handling any resulting errors or messages generated by @@ -14930,7 +14909,7 @@ where } impl< - M: Deref, + M: chain::Watch, T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, @@ -14940,8 +14919,6 @@ impl< MR: MessageRouter, L: Logger, > ChannelMessageHandler for ChannelManager -where - M::Target: chain::Watch, { fn handle_open_channel(&self, counterparty_node_id: PublicKey, message: &msgs::OpenChannel) { // Note that we never need to persist the updated ChannelManager for an inbound @@ -15497,7 +15474,7 @@ where } impl< - M: Deref, + M: chain::Watch, T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, @@ -15507,8 +15484,6 @@ impl< MR: MessageRouter, L: Logger, > OffersMessageHandler for ChannelManager -where - M::Target: chain::Watch, { #[rustfmt::skip] fn handle_message( @@ -15707,7 +15682,7 @@ where } impl< - M: Deref, + M: chain::Watch, T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, @@ -15717,8 +15692,6 @@ impl< MR: MessageRouter, L: Logger, > AsyncPaymentsMessageHandler for ChannelManager -where - M::Target: chain::Watch, { fn handle_offer_paths_request( &self, message: OfferPathsRequest, context: AsyncPaymentsContext, @@ -15901,7 +15874,7 @@ where #[cfg(feature = "dnssec")] impl< - M: Deref, + M: chain::Watch, T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, @@ -15911,8 +15884,6 @@ impl< MR: MessageRouter, L: Logger, > DNSResolverMessageHandler for ChannelManager -where - M::Target: chain::Watch, { fn handle_dnssec_query( &self, _message: DNSSECQuery, _responder: Option, @@ -15961,7 +15932,7 @@ where } impl< - M: Deref, + M: chain::Watch, T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, @@ -15971,8 +15942,6 @@ impl< MR: MessageRouter, L: Logger, > NodeIdLookUp for ChannelManager -where - M::Target: chain::Watch, { fn next_node_id(&self, short_channel_id: u64) -> Option { self.short_to_chan_info.read().unwrap().get(&short_channel_id).map(|(pubkey, _)| *pubkey) @@ -16469,7 +16438,7 @@ impl_writeable_tlv_based!(PendingInboundPayment, { }); impl< - M: Deref, + M: chain::Watch, T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, @@ -16479,8 +16448,6 @@ impl< MR: MessageRouter, L: Logger, > Writeable for ChannelManager -where - M::Target: chain::Watch, { #[rustfmt::skip] fn write(&self, writer: &mut W) -> Result<(), io::Error> { @@ -16828,7 +16795,7 @@ impl Readable for VecDeque<(Event, Option)> { /// [`ChainMonitor::load_existing_monitor`]: crate::chain::chainmonitor::ChainMonitor::load_existing_monitor pub struct ChannelManagerReadArgs< 'a, - M: Deref, + M: chain::Watch, T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, @@ -16837,9 +16804,7 @@ pub struct ChannelManagerReadArgs< R: Router, MR: MessageRouter, L: Logger + Clone, -> where - M::Target: chain::Watch, -{ +> { /// A cryptographically secure source of entropy. pub entropy_source: ES, @@ -16899,7 +16864,7 @@ pub struct ChannelManagerReadArgs< impl< 'a, - M: Deref, + M: chain::Watch, T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, @@ -16909,8 +16874,6 @@ impl< MR: MessageRouter, L: Logger + Clone, > ChannelManagerReadArgs<'a, M, T, ES, NS, SP, F, R, MR, L> -where - M::Target: chain::Watch, { /// Simple utility function to create a ChannelManagerReadArgs which creates the monitor /// HashMap for you. This is primarily useful for C bindings where it is not practical to @@ -16976,7 +16939,7 @@ fn dedup_decode_update_add_htlcs( // SipmleArcChannelManager type: impl< 'a, - M: Deref, + M: chain::Watch, T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, @@ -16987,8 +16950,6 @@ impl< L: Logger + Clone, > ReadableArgs> for (BlockHash, Arc>) -where - M::Target: chain::Watch, { fn read( reader: &mut Reader, args: ChannelManagerReadArgs<'a, M, T, ES, NS, SP, F, R, MR, L>, @@ -17001,7 +16962,7 @@ where impl< 'a, - M: Deref, + M: chain::Watch, T: BroadcasterInterface, ES: EntropySource, NS: NodeSigner, @@ -17012,8 +16973,6 @@ impl< L: Logger + Clone, > ReadableArgs> for (BlockHash, ChannelManager) -where - M::Target: chain::Watch, { fn read( reader: &mut Reader, mut args: ChannelManagerReadArgs<'a, M, T, ES, NS, SP, F, R, MR, L>, diff --git a/lightning/src/ln/functional_test_utils.rs b/lightning/src/ln/functional_test_utils.rs index 122bb37e07a..89ab92d74dc 100644 --- a/lightning/src/ln/functional_test_utils.rs +++ b/lightning/src/ln/functional_test_utils.rs @@ -731,7 +731,7 @@ pub trait NodeHolder { fn node( &self, ) -> &ChannelManager< - ::M, + ::Watch, ::Broadcaster, ::EntropySource, ::NodeSigner, @@ -748,7 +748,7 @@ impl NodeHolder for &H { fn node( &self, ) -> &ChannelManager< - ::M, + ::Watch, ::Broadcaster, ::EntropySource, ::NodeSigner, From 685bd50bc312102c0179f669d97df958ddb533a6 Mon Sep 17 00:00:00 2001 From: Valentine Wallace Date: Thu, 15 Jan 2026 14:23:59 -0500 Subject: [PATCH 11/17] Drop Deref indirection for KVStore Reduces generics and verbosity across the codebase, should provide equivalent behavior. Unfortunately the same improvement can't be made for KVStoreSync and Persist, due to the blanket implementation where all KVStoreSync traits implement Persist resulting in conflicting implementations. Co-Authored-By: Claude Opus 4.5 --- lightning-background-processor/src/lib.rs | 4 +- lightning-liquidity/src/events/event_queue.rs | 36 +++-------- lightning-liquidity/src/lsps0/client.rs | 17 ++---- lightning-liquidity/src/lsps1/client.rs | 17 ++---- lightning-liquidity/src/lsps1/service.rs | 9 +-- lightning-liquidity/src/lsps2/client.rs | 16 ++--- lightning-liquidity/src/lsps2/service.rs | 21 ++++--- lightning-liquidity/src/lsps5/client.rs | 17 ++---- lightning-liquidity/src/lsps5/service.rs | 9 +-- lightning-liquidity/src/manager.rs | 29 +++------ lightning-liquidity/src/persist.rs | 23 ++------ lightning/src/chain/chainmonitor.rs | 16 ++--- lightning/src/util/persist.rs | 59 +++++++++++-------- lightning/src/util/sweep.rs | 15 ++--- 14 files changed, 99 insertions(+), 189 deletions(-) diff --git a/lightning-background-processor/src/lib.rs b/lightning-background-processor/src/lib.rs index 79a3b95463e..a16933f1cde 100644 --- a/lightning-background-processor/src/lib.rs +++ b/lightning-background-processor/src/lib.rs @@ -474,7 +474,6 @@ pub const NO_LIQUIDITY_MANAGER: Option< CM = &DynChannelManager, Filter = dyn chain::Filter + Send + Sync, C = &(dyn chain::Filter + Send + Sync), - KVStore = DummyKVStore, K = &DummyKVStore, TimeProvider = dyn lightning_liquidity::utils::time::TimeProvider + Send + Sync, TP = &(dyn lightning_liquidity::utils::time::TimeProvider + Send + Sync), @@ -955,7 +954,7 @@ pub async fn process_events_async< LM: Deref, D: Deref, O: Deref, - K: Deref, + K: KVStore, OS: Deref>, S: Deref, SC: for<'b> WriteableScore<'b>, @@ -978,7 +977,6 @@ where LM::Target: ALiquidityManager, O::Target: OutputSpender, D::Target: ChangeDestinationSource, - K::Target: KVStore, { let async_event_handler = |event| { let network_graph = gossip_sync.network_graph(); diff --git a/lightning-liquidity/src/events/event_queue.rs b/lightning-liquidity/src/events/event_queue.rs index 0d6e3a0ec54..9fb8a250a9a 100644 --- a/lightning-liquidity/src/events/event_queue.rs +++ b/lightning-liquidity/src/events/event_queue.rs @@ -12,7 +12,6 @@ use alloc::collections::VecDeque; use alloc::vec::Vec; use core::future::Future; -use core::ops::Deref; use core::task::{Poll, Waker}; use lightning::ln::msgs::DecodeError; @@ -25,10 +24,7 @@ use lightning::util::wakers::Notifier; /// The maximum queue size we allow before starting to drop events. pub const MAX_EVENT_QUEUE_SIZE: usize = 1000; -pub(crate) struct EventQueue -where - K::Target: KVStore, -{ +pub(crate) struct EventQueue { state: Mutex, waker: Mutex>, #[cfg(feature = "std")] @@ -37,10 +33,7 @@ where persist_notifier: Arc, } -impl EventQueue -where - K::Target: KVStore, -{ +impl EventQueue { pub fn new( queue: VecDeque, kv_store: K, persist_notifier: Arc, ) -> Self { @@ -164,14 +157,9 @@ struct QueueState { // A guard type that will notify about new events when dropped. #[must_use] -pub(crate) struct EventQueueNotifierGuard<'a, K: Deref + Clone>(&'a EventQueue) -where - K::Target: KVStore; - -impl<'a, K: Deref + Clone> EventQueueNotifierGuard<'a, K> -where - K::Target: KVStore, -{ +pub(crate) struct EventQueueNotifierGuard<'a, K: KVStore + Clone>(&'a EventQueue); + +impl<'a, K: KVStore + Clone> EventQueueNotifierGuard<'a, K> { pub fn enqueue>(&self, event: E) { let mut state_lock = self.0.state.lock().unwrap(); if state_lock.queue.len() < MAX_EVENT_QUEUE_SIZE { @@ -183,10 +171,7 @@ where } } -impl<'a, K: Deref + Clone> Drop for EventQueueNotifierGuard<'a, K> -where - K::Target: KVStore, -{ +impl<'a, K: KVStore + Clone> Drop for EventQueueNotifierGuard<'a, K> { fn drop(&mut self) { let (should_notify, should_persist_notify) = { let state_lock = self.0.state.lock().unwrap(); @@ -208,14 +193,9 @@ where } } -struct EventFuture<'a, K: Deref + Clone>(&'a EventQueue) -where - K::Target: KVStore; +struct EventFuture<'a, K: KVStore + Clone>(&'a EventQueue); -impl Future for EventFuture<'_, K> -where - K::Target: KVStore, -{ +impl Future for EventFuture<'_, K> { type Output = LiquidityEvent; fn poll( diff --git a/lightning-liquidity/src/lsps0/client.rs b/lightning-liquidity/src/lsps0/client.rs index 776e9d3c9a5..298cb304b51 100644 --- a/lightning-liquidity/src/lsps0/client.rs +++ b/lightning-liquidity/src/lsps0/client.rs @@ -22,22 +22,14 @@ use lightning::util::persist::KVStore; use bitcoin::secp256k1::PublicKey; -use core::ops::Deref; - /// A message handler capable of sending and handling bLIP-50 / LSPS0 messages. -pub struct LSPS0ClientHandler -where - K::Target: KVStore, -{ +pub struct LSPS0ClientHandler { entropy_source: ES, pending_messages: Arc, pending_events: Arc>, } -impl LSPS0ClientHandler -where - K::Target: KVStore, -{ +impl LSPS0ClientHandler { /// Returns a new instance of [`LSPS0ClientHandler`]. pub(crate) fn new( entropy_source: ES, pending_messages: Arc, pending_events: Arc>, @@ -87,9 +79,8 @@ where } } -impl LSPSProtocolMessageHandler for LSPS0ClientHandler -where - K::Target: KVStore, +impl LSPSProtocolMessageHandler + for LSPS0ClientHandler { type ProtocolMessage = LSPS0Message; const PROTOCOL_NUMBER: Option = None; diff --git a/lightning-liquidity/src/lsps1/client.rs b/lightning-liquidity/src/lsps1/client.rs index 1e5b2e3bef4..2cbfb04c86a 100644 --- a/lightning-liquidity/src/lsps1/client.rs +++ b/lightning-liquidity/src/lsps1/client.rs @@ -30,8 +30,6 @@ use lightning::util::persist::KVStore; use bitcoin::secp256k1::PublicKey; use bitcoin::Address; -use core::ops::Deref; - /// Client-side configuration options for bLIP-51 / LSPS1 channel requests. #[derive(Clone, Debug)] pub struct LSPS1ClientConfig { @@ -47,10 +45,7 @@ struct PeerState { } /// The main object allowing to send and receive bLIP-51 / LSPS1 messages. -pub struct LSPS1ClientHandler -where - K::Target: KVStore, -{ +pub struct LSPS1ClientHandler { entropy_source: ES, pending_messages: Arc, pending_events: Arc>, @@ -58,10 +53,7 @@ where config: LSPS1ClientConfig, } -impl LSPS1ClientHandler -where - K::Target: KVStore, -{ +impl LSPS1ClientHandler { /// Constructs an `LSPS1ClientHandler`. pub(crate) fn new( entropy_source: ES, pending_messages: Arc, @@ -430,9 +422,8 @@ where } } -impl LSPSProtocolMessageHandler for LSPS1ClientHandler -where - K::Target: KVStore, +impl LSPSProtocolMessageHandler + for LSPS1ClientHandler { type ProtocolMessage = LSPS1Message; const PROTOCOL_NUMBER: Option = Some(1); diff --git a/lightning-liquidity/src/lsps1/service.rs b/lightning-liquidity/src/lsps1/service.rs index 76a9a437b0b..154c6f5d527 100644 --- a/lightning-liquidity/src/lsps1/service.rs +++ b/lightning-liquidity/src/lsps1/service.rs @@ -132,11 +132,10 @@ impl PeerState { } /// The main object allowing to send and receive bLIP-51 / LSPS1 messages. -pub struct LSPS1ServiceHandler +pub struct LSPS1ServiceHandler where CM::Target: AChannelManager, C::Target: Filter, - K::Target: KVStore, { entropy_source: ES, channel_manager: CM, @@ -147,12 +146,11 @@ where config: LSPS1ServiceConfig, } -impl +impl LSPS1ServiceHandler where CM::Target: AChannelManager, C::Target: Filter, - K::Target: KVStore, { /// Constructs a `LSPS1ServiceHandler`. pub(crate) fn new( @@ -419,12 +417,11 @@ where } } -impl LSPSProtocolMessageHandler +impl LSPSProtocolMessageHandler for LSPS1ServiceHandler where CM::Target: AChannelManager, C::Target: Filter, - K::Target: KVStore, { type ProtocolMessage = LSPS1Message; const PROTOCOL_NUMBER: Option = Some(1); diff --git a/lightning-liquidity/src/lsps2/client.rs b/lightning-liquidity/src/lsps2/client.rs index 2e9fca2d444..21b57162010 100644 --- a/lightning-liquidity/src/lsps2/client.rs +++ b/lightning-liquidity/src/lsps2/client.rs @@ -13,7 +13,6 @@ use alloc::string::{String, ToString}; use lightning::util::persist::KVStore; use core::default::Default; -use core::ops::Deref; use crate::events::EventQueue; use crate::lsps0::ser::{LSPSProtocolMessageHandler, LSPSRequestId, LSPSResponseError}; @@ -68,10 +67,7 @@ impl PeerState { /// opened. Please refer to the [`bLIP-52 / LSPS2 specification`] for more information. /// /// [`bLIP-52 / LSPS2 specification`]: https://github.com/lightning/blips/blob/master/blip-0052.md#trust-models -pub struct LSPS2ClientHandler -where - K::Target: KVStore, -{ +pub struct LSPS2ClientHandler { entropy_source: ES, pending_messages: Arc, pending_events: Arc>, @@ -79,10 +75,7 @@ where config: LSPS2ClientConfig, } -impl LSPS2ClientHandler -where - K::Target: KVStore, -{ +impl LSPS2ClientHandler { /// Constructs an `LSPS2ClientHandler`. pub(crate) fn new( entropy_source: ES, pending_messages: Arc, @@ -373,9 +366,8 @@ where } } -impl LSPSProtocolMessageHandler for LSPS2ClientHandler -where - K::Target: KVStore, +impl LSPSProtocolMessageHandler + for LSPS2ClientHandler { type ProtocolMessage = LSPS2Message; const PROTOCOL_NUMBER: Option = Some(2); diff --git a/lightning-liquidity/src/lsps2/service.rs b/lightning-liquidity/src/lsps2/service.rs index 756e8b32bc8..00f68aff696 100644 --- a/lightning-liquidity/src/lsps2/service.rs +++ b/lightning-liquidity/src/lsps2/service.rs @@ -702,10 +702,9 @@ macro_rules! get_or_insert_peer_state_entry { } /// The main object allowing to send and receive bLIP-52 / LSPS2 messages. -pub struct LSPS2ServiceHandler +pub struct LSPS2ServiceHandler where CM::Target: AChannelManager, - K::Target: KVStore, { channel_manager: CM, kv_store: K, @@ -720,10 +719,9 @@ where persistence_in_flight: AtomicUsize, } -impl LSPS2ServiceHandler +impl LSPS2ServiceHandler where CM::Target: AChannelManager, - K::Target: KVStore, { /// Constructs a `LSPS2ServiceHandler`. pub(crate) fn new( @@ -2042,11 +2040,10 @@ where } } -impl LSPSProtocolMessageHandler +impl LSPSProtocolMessageHandler for LSPS2ServiceHandler where CM::Target: AChannelManager, - K::Target: KVStore, { type ProtocolMessage = LSPS2Message; const PROTOCOL_NUMBER: Option = Some(2); @@ -2116,19 +2113,21 @@ fn calculate_amount_to_forward_per_htlc( /// A synchroneous wrapper around [`LSPS2ServiceHandler`] to be used in contexts where async is not /// available. -pub struct LSPS2ServiceHandlerSync<'a, CM: Deref, K: Deref + Clone, T: BroadcasterInterface + Clone> -where +pub struct LSPS2ServiceHandlerSync< + 'a, + CM: Deref, + K: KVStore + Clone, + T: BroadcasterInterface + Clone, +> where CM::Target: AChannelManager, - K::Target: KVStore, { inner: &'a LSPS2ServiceHandler, } -impl<'a, CM: Deref, K: Deref + Clone, T: BroadcasterInterface + Clone> +impl<'a, CM: Deref, K: KVStore + Clone, T: BroadcasterInterface + Clone> LSPS2ServiceHandlerSync<'a, CM, K, T> where CM::Target: AChannelManager, - K::Target: KVStore, { pub(crate) fn from_inner(inner: &'a LSPS2ServiceHandler) -> Self { Self { inner } diff --git a/lightning-liquidity/src/lsps5/client.rs b/lightning-liquidity/src/lsps5/client.rs index df10522077e..26c0b180421 100644 --- a/lightning-liquidity/src/lsps5/client.rs +++ b/lightning-liquidity/src/lsps5/client.rs @@ -35,8 +35,6 @@ use alloc::collections::VecDeque; use alloc::string::String; use lightning::util::persist::KVStore; -use core::ops::Deref; - impl PartialEq for (LSPSRequestId, (LSPS5AppName, LSPS5WebhookUrl)) { fn eq(&self, other: &LSPSRequestId) -> bool { &self.0 == other @@ -125,10 +123,7 @@ impl PeerState { /// [`lsps5.list_webhooks`]: super::msgs::LSPS5Request::ListWebhooks /// [`lsps5.remove_webhook`]: super::msgs::LSPS5Request::RemoveWebhook /// [`LSPS5Validator`]: super::validator::LSPS5Validator -pub struct LSPS5ClientHandler -where - K::Target: KVStore, -{ +pub struct LSPS5ClientHandler { pending_messages: Arc, pending_events: Arc>, entropy_source: ES, @@ -136,10 +131,7 @@ where _config: LSPS5ClientConfig, } -impl LSPS5ClientHandler -where - K::Target: KVStore, -{ +impl LSPS5ClientHandler { /// Constructs an `LSPS5ClientHandler`. pub(crate) fn new( entropy_source: ES, pending_messages: Arc, @@ -424,9 +416,8 @@ where } } -impl LSPSProtocolMessageHandler for LSPS5ClientHandler -where - K::Target: KVStore, +impl LSPSProtocolMessageHandler + for LSPS5ClientHandler { type ProtocolMessage = LSPS5Message; const PROTOCOL_NUMBER: Option = Some(5); diff --git a/lightning-liquidity/src/lsps5/service.rs b/lightning-liquidity/src/lsps5/service.rs index 489d543ca90..4678d38dc9a 100644 --- a/lightning-liquidity/src/lsps5/service.rs +++ b/lightning-liquidity/src/lsps5/service.rs @@ -125,10 +125,9 @@ impl Default for LSPS5ServiceConfig { /// [`LSPS5ServiceEvent::SendWebhookNotification`]: super::event::LSPS5ServiceEvent::SendWebhookNotification /// [`app_name`]: super::msgs::LSPS5AppName /// [`lsps5.webhook_registered`]: super::msgs::WebhookNotificationMethod::LSPS5WebhookRegistered -pub struct LSPS5ServiceHandler +pub struct LSPS5ServiceHandler where CM::Target: AChannelManager, - K::Target: KVStore, TP::Target: TimeProvider, { config: LSPS5ServiceConfig, @@ -143,10 +142,9 @@ where persistence_in_flight: AtomicUsize, } -impl LSPS5ServiceHandler +impl LSPS5ServiceHandler where CM::Target: AChannelManager, - K::Target: KVStore, TP::Target: TimeProvider, { /// Constructs a `LSPS5ServiceHandler` using the given time provider. @@ -692,11 +690,10 @@ where } } -impl LSPSProtocolMessageHandler +impl LSPSProtocolMessageHandler for LSPS5ServiceHandler where CM::Target: AChannelManager, - K::Target: KVStore, TP::Target: TimeProvider, { type ProtocolMessage = LSPS5Message; diff --git a/lightning-liquidity/src/manager.rs b/lightning-liquidity/src/manager.rs index 0e897dd7abe..c3e9fa48cca 100644 --- a/lightning-liquidity/src/manager.rs +++ b/lightning-liquidity/src/manager.rs @@ -116,9 +116,7 @@ pub trait ALiquidityManager { /// A type that may be dereferenced to [`Self::Filter`]. type C: Deref + Clone; /// A type implementing [`KVStore`]. - type KVStore: KVStore + ?Sized; - /// A type that may be dereferenced to [`Self::KVStore`]. - type K: Deref + Clone; + type K: KVStore + Clone; /// A type implementing [`TimeProvider`]. type TimeProvider: TimeProvider + ?Sized; /// A type that may be dereferenced to [`Self::TimeProvider`]. @@ -144,14 +142,13 @@ impl< NS: NodeSigner + Clone, CM: Deref + Clone, C: Deref + Clone, - K: Deref + Clone, + K: KVStore + Clone, TP: Deref + Clone, T: BroadcasterInterface + Clone, > ALiquidityManager for LiquidityManager where CM::Target: AChannelManager, C::Target: Filter, - K::Target: KVStore, TP::Target: TimeProvider, { type EntropySource = ES; @@ -160,7 +157,6 @@ where type CM = CM; type Filter = C::Target; type C = C; - type KVStore = K::Target; type K = K; type TimeProvider = TP::Target; type TP = TP; @@ -294,13 +290,12 @@ pub struct LiquidityManager< NS: NodeSigner + Clone, CM: Deref + Clone, C: Deref + Clone, - K: Deref + Clone, + K: KVStore + Clone, TP: Deref + Clone, T: BroadcasterInterface + Clone, > where CM::Target: AChannelManager, C::Target: Filter, - K::Target: KVStore, TP::Target: TimeProvider, { pending_messages: Arc, @@ -330,13 +325,12 @@ impl< NS: NodeSigner + Clone, CM: Deref + Clone, C: Deref + Clone, - K: Deref + Clone, + K: KVStore + Clone, T: BroadcasterInterface + Clone, > LiquidityManager where CM::Target: AChannelManager, C::Target: Filter, - K::Target: KVStore, { /// Constructor for the [`LiquidityManager`] using the default system clock /// @@ -368,14 +362,13 @@ impl< NS: NodeSigner + Clone, CM: Deref + Clone, C: Deref + Clone, - K: Deref + Clone, + K: KVStore + Clone, TP: Deref + Clone, T: BroadcasterInterface + Clone, > LiquidityManager where CM::Target: AChannelManager, C::Target: Filter, - K::Target: KVStore, TP::Target: TimeProvider, { /// Constructor for the [`LiquidityManager`] with a custom time provider. @@ -792,14 +785,13 @@ impl< NS: NodeSigner + Clone, CM: Deref + Clone, C: Deref + Clone, - K: Deref + Clone, + K: KVStore + Clone, TP: Deref + Clone, T: BroadcasterInterface + Clone, > CustomMessageReader for LiquidityManager where CM::Target: AChannelManager, C::Target: Filter, - K::Target: KVStore, TP::Target: TimeProvider, { type CustomMessage = RawLSPSMessage; @@ -821,14 +813,13 @@ impl< NS: NodeSigner + Clone, CM: Deref + Clone, C: Deref + Clone, - K: Deref + Clone, + K: KVStore + Clone, TP: Deref + Clone, T: BroadcasterInterface + Clone, > CustomMessageHandler for LiquidityManager where CM::Target: AChannelManager, C::Target: Filter, - K::Target: KVStore, TP::Target: TimeProvider, { fn handle_custom_message( @@ -952,14 +943,13 @@ impl< NS: NodeSigner + Clone, CM: Deref + Clone, C: Deref + Clone, - K: Deref + Clone, + K: KVStore + Clone, TP: Deref + Clone, T: BroadcasterInterface + Clone, > Listen for LiquidityManager where CM::Target: AChannelManager, C::Target: Filter, - K::Target: KVStore, TP::Target: TimeProvider, { fn filtered_block_connected( @@ -995,14 +985,13 @@ impl< NS: NodeSigner + Clone, CM: Deref + Clone, C: Deref + Clone, - K: Deref + Clone, + K: KVStore + Clone, TP: Deref + Clone, T: BroadcasterInterface + Clone, > Confirm for LiquidityManager where CM::Target: AChannelManager, C::Target: Filter, - K::Target: KVStore, TP::Target: TimeProvider, { fn transactions_confirmed( diff --git a/lightning-liquidity/src/persist.rs b/lightning-liquidity/src/persist.rs index ec0d5a6ddd3..d0199440514 100644 --- a/lightning-liquidity/src/persist.rs +++ b/lightning-liquidity/src/persist.rs @@ -22,8 +22,6 @@ use lightning::util::ser::Readable; use bitcoin::secp256k1::PublicKey; use alloc::collections::VecDeque; - -use core::ops::Deref; use core::str::FromStr; /// The primary namespace under which the [`LiquidityManager`] will be persisted. @@ -51,12 +49,9 @@ pub const LSPS2_SERVICE_PERSISTENCE_SECONDARY_NAMESPACE: &str = "lsps2_service"; /// [`LSPS5ServiceHandler`]: crate::lsps5::service::LSPS5ServiceHandler pub const LSPS5_SERVICE_PERSISTENCE_SECONDARY_NAMESPACE: &str = "lsps5_service"; -pub(crate) async fn read_event_queue( +pub(crate) async fn read_event_queue( kv_store: K, -) -> Result>, lightning::io::Error> -where - K::Target: KVStore, -{ +) -> Result>, lightning::io::Error> { let read_fut = kv_store.read( LIQUIDITY_MANAGER_PERSISTENCE_PRIMARY_NAMESPACE, LIQUIDITY_MANAGER_EVENT_QUEUE_PERSISTENCE_SECONDARY_NAMESPACE, @@ -85,12 +80,9 @@ where Ok(Some(queue.0)) } -pub(crate) async fn read_lsps2_service_peer_states( +pub(crate) async fn read_lsps2_service_peer_states( kv_store: K, -) -> Result>, lightning::io::Error> -where - K::Target: KVStore, -{ +) -> Result>, lightning::io::Error> { let mut res = new_hash_map(); for stored_key in kv_store @@ -129,12 +121,9 @@ where Ok(res) } -pub(crate) async fn read_lsps5_service_peer_states( +pub(crate) async fn read_lsps5_service_peer_states( kv_store: K, -) -> Result, lightning::io::Error> -where - K::Target: KVStore, -{ +) -> Result, lightning::io::Error> { let mut res = new_hash_map(); for stored_key in kv_store diff --git a/lightning/src/chain/chainmonitor.rs b/lightning/src/chain/chainmonitor.rs index 8835e9c8185..536a1f942b0 100644 --- a/lightning/src/chain/chainmonitor.rs +++ b/lightning/src/chain/chainmonitor.rs @@ -256,22 +256,20 @@ impl Deref for LockedChannelMonitor<'_, Chann /// /// This is not exported to bindings users as async is not supported outside of Rust. pub struct AsyncPersister< - K: Deref + MaybeSend + MaybeSync + 'static, + K: KVStore + MaybeSend + MaybeSync + 'static, S: FutureSpawner, L: Logger + MaybeSend + MaybeSync + 'static, ES: EntropySource + MaybeSend + MaybeSync + 'static, SP: SignerProvider + MaybeSend + MaybeSync + 'static, BI: BroadcasterInterface + MaybeSend + MaybeSync + 'static, FE: FeeEstimator + MaybeSend + MaybeSync + 'static, -> where - K::Target: KVStore + MaybeSync, -{ +> { persister: MonitorUpdatingPersisterAsync, event_notifier: Arc, } impl< - K: Deref + MaybeSend + MaybeSync + 'static, + K: KVStore + MaybeSend + MaybeSync + 'static, S: FutureSpawner, L: Logger + MaybeSend + MaybeSync + 'static, ES: EntropySource + MaybeSend + MaybeSync + 'static, @@ -279,8 +277,6 @@ impl< BI: BroadcasterInterface + MaybeSend + MaybeSync + 'static, FE: FeeEstimator + MaybeSend + MaybeSync + 'static, > Deref for AsyncPersister -where - K::Target: KVStore + MaybeSync, { type Target = Self; fn deref(&self) -> &Self { @@ -289,7 +285,7 @@ where } impl< - K: Deref + MaybeSend + MaybeSync + 'static, + K: KVStore + MaybeSend + MaybeSync + 'static, S: FutureSpawner, L: Logger + MaybeSend + MaybeSync + 'static, ES: EntropySource + MaybeSend + MaybeSync + 'static, @@ -298,7 +294,6 @@ impl< FE: FeeEstimator + MaybeSend + MaybeSync + 'static, > Persist for AsyncPersister where - K::Target: KVStore + MaybeSync, SP::EcdsaSigner: MaybeSend + 'static, { fn persist_new_channel( @@ -380,7 +375,7 @@ pub struct ChainMonitor< } impl< - K: Deref + MaybeSend + MaybeSync + 'static, + K: KVStore + MaybeSend + MaybeSync + 'static, S: FutureSpawner, SP: SignerProvider + MaybeSend + MaybeSync + 'static, C: Deref, @@ -390,7 +385,6 @@ impl< ES: EntropySource + MaybeSend + MaybeSync + 'static, > ChainMonitor, ES> where - K::Target: KVStore + MaybeSync, C::Target: chain::Filter, SP::EcdsaSigner: MaybeSend + 'static, { diff --git a/lightning/src/util/persist.rs b/lightning/src/util/persist.rs index 7742abf4400..b785269f007 100644 --- a/lightning/src/util/persist.rs +++ b/lightning/src/util/persist.rs @@ -202,16 +202,6 @@ pub struct KVStoreSyncWrapper(pub K) where K::Target: KVStoreSync; -impl Deref for KVStoreSyncWrapper -where - K::Target: KVStoreSync, -{ - type Target = Self; - fn deref(&self) -> &Self::Target { - self - } -} - /// This is not exported to bindings users as async is only supported in Rust. impl KVStore for KVStoreSyncWrapper where @@ -347,6 +337,32 @@ pub trait KVStore { ) -> impl Future, io::Error>> + 'static + MaybeSend; } +impl> KVStore for K { + fn read( + &self, primary_namespace: &str, secondary_namespace: &str, key: &str, + ) -> impl Future, io::Error>> + 'static + MaybeSend { + self.deref().read(primary_namespace, secondary_namespace, key) + } + + fn write( + &self, primary_namespace: &str, secondary_namespace: &str, key: &str, buf: Vec, + ) -> impl Future> + 'static + MaybeSend { + self.deref().write(primary_namespace, secondary_namespace, key, buf) + } + + fn remove( + &self, primary_namespace: &str, secondary_namespace: &str, key: &str, lazy: bool, + ) -> impl Future> + 'static + MaybeSend { + self.deref().remove(primary_namespace, secondary_namespace, key, lazy) + } + + fn list( + &self, primary_namespace: &str, secondary_namespace: &str, + ) -> impl Future, io::Error>> + 'static + MaybeSend { + self.deref().list(primary_namespace, secondary_namespace) + } +} + /// Provides additional interface methods that are required for [`KVStore`]-to-[`KVStore`] /// data migration. pub trait MigratableKVStore: KVStoreSync { @@ -768,28 +784,24 @@ where /// [`ChainMonitor`]: crate::chain::chainmonitor::ChainMonitor /// [`ChainMonitor::new_async_beta`]: crate::chain::chainmonitor::ChainMonitor::new_async_beta pub struct MonitorUpdatingPersisterAsync< - K: Deref, + K: KVStore, S: FutureSpawner, L: Logger, ES: EntropySource, SP: SignerProvider, BI: BroadcasterInterface, FE: FeeEstimator, ->(Arc>) -where - K::Target: KVStore; +>(Arc>); struct MonitorUpdatingPersisterAsyncInner< - K: Deref, + K: KVStore, S: FutureSpawner, L: Logger, ES: EntropySource, SP: SignerProvider, BI: BroadcasterInterface, FE: FeeEstimator, -> where - K::Target: KVStore, -{ +> { kv_store: K, async_completed_updates: Mutex>, future_spawner: S, @@ -802,7 +814,7 @@ struct MonitorUpdatingPersisterAsyncInner< } impl< - K: Deref, + K: KVStore, S: FutureSpawner, L: Logger, ES: EntropySource, @@ -810,8 +822,6 @@ impl< BI: BroadcasterInterface, FE: FeeEstimator, > MonitorUpdatingPersisterAsync -where - K::Target: KVStore, { /// Constructs a new [`MonitorUpdatingPersisterAsync`]. /// @@ -941,7 +951,7 @@ where } impl< - K: Deref + MaybeSend + MaybeSync + 'static, + K: KVStore + MaybeSend + MaybeSync + 'static, S: FutureSpawner, L: Logger + MaybeSend + MaybeSync + 'static, ES: EntropySource + MaybeSend + MaybeSync + 'static, @@ -950,7 +960,6 @@ impl< FE: FeeEstimator + MaybeSend + MaybeSync + 'static, > MonitorUpdatingPersisterAsync where - K::Target: KVStore + MaybeSync, SP::EcdsaSigner: MaybeSend + 'static, { pub(crate) fn spawn_async_persist_new_channel( @@ -1026,7 +1035,7 @@ trait MaybeSendableFuture: Future> + MaybeSend {} impl> + MaybeSend> MaybeSendableFuture for F {} impl< - K: Deref, + K: KVStore, S: FutureSpawner, L: Logger, ES: EntropySource, @@ -1034,8 +1043,6 @@ impl< BI: BroadcasterInterface, FE: FeeEstimator, > MonitorUpdatingPersisterAsyncInner -where - K::Target: KVStore, { pub async fn read_channel_monitor_with_updates( &self, monitor_key: &str, diff --git a/lightning/src/util/sweep.rs b/lightning/src/util/sweep.rs index f7cf2771d3c..2d22244cb17 100644 --- a/lightning/src/util/sweep.rs +++ b/lightning/src/util/sweep.rs @@ -342,13 +342,12 @@ pub struct OutputSweeper< D: Deref, E: FeeEstimator, F: Deref, - K: Deref, + K: KVStore, L: Logger, O: Deref, > where D::Target: ChangeDestinationSource, F::Target: Filter, - K::Target: KVStore, O::Target: OutputSpender, { sweeper_state: Mutex, @@ -367,14 +366,13 @@ impl< D: Deref, E: FeeEstimator, F: Deref, - K: Deref, + K: KVStore, L: Logger, O: Deref, > OutputSweeper where D::Target: ChangeDestinationSource, F::Target: Filter, - K::Target: KVStore, O::Target: OutputSpender, { /// Constructs a new [`OutputSweeper`]. @@ -723,14 +721,13 @@ impl< D: Deref, E: FeeEstimator, F: Deref, - K: Deref, + K: KVStore, L: Logger, O: Deref, > Listen for OutputSweeper where D::Target: ChangeDestinationSource, F::Target: Filter + Sync + Send, - K::Target: KVStore, O::Target: OutputSpender, { fn filtered_block_connected( @@ -768,14 +765,13 @@ impl< D: Deref, E: FeeEstimator, F: Deref, - K: Deref, + K: KVStore, L: Logger, O: Deref, > Confirm for OutputSweeper where D::Target: ChangeDestinationSource, F::Target: Filter + Sync + Send, - K::Target: KVStore, O::Target: OutputSpender, { fn transactions_confirmed( @@ -869,14 +865,13 @@ impl< D: Deref, E: FeeEstimator, F: Deref, - K: Deref, + K: KVStore, L: Logger, O: Deref, > ReadableArgs<(B, E, Option, O, D, K, L)> for (BestBlock, OutputSweeper) where D::Target: ChangeDestinationSource, F::Target: Filter + Sync + Send, - K::Target: KVStore, O::Target: OutputSpender, { #[inline] From b31285c13df64d8eacd1b2e7abd4e276de2cdc4f Mon Sep 17 00:00:00 2001 From: Valentine Wallace Date: Thu, 15 Jan 2026 15:46:02 -0500 Subject: [PATCH 12/17] Drop Deref indirection for NodeIdLookup Reduces generics and verbosity across the codebase, should provide equivalent behavior. Co-Authored-By: Claude Opus 4.5 --- lightning-background-processor/src/lib.rs | 1 - lightning-dns-resolver/src/lib.rs | 6 ---- lightning/src/blinded_path/message.rs | 4 +-- lightning/src/blinded_path/mod.rs | 7 ++-- lightning/src/blinded_path/payment.rs | 4 +-- lightning/src/ln/outbound_payment.rs | 20 ++++------- lightning/src/onion_message/messenger.rs | 42 +++++++++-------------- 7 files changed, 27 insertions(+), 57 deletions(-) diff --git a/lightning-background-processor/src/lib.rs b/lightning-background-processor/src/lib.rs index a16933f1cde..a67657be8dc 100644 --- a/lightning-background-processor/src/lib.rs +++ b/lightning-background-processor/src/lib.rs @@ -415,7 +415,6 @@ pub const NO_ONION_MESSENGER: Option< EntropySource = &(dyn EntropySource + Send + Sync), NodeSigner = &(dyn lightning::sign::NodeSigner + Send + Sync), Logger = &'static (dyn Logger + Send + Sync), - NodeIdLookUp = DynChannelManager, NL = &'static DynChannelManager, MessageRouter = &'static DynMessageRouter, OffersMessageHandler = lightning::ln::peer_handler::IgnoringMessageHandler, diff --git a/lightning-dns-resolver/src/lib.rs b/lightning-dns-resolver/src/lib.rs index 330862966c5..a2786ca2921 100644 --- a/lightning-dns-resolver/src/lib.rs +++ b/lightning-dns-resolver/src/lib.rs @@ -202,12 +202,6 @@ mod test { None } } - impl Deref for DummyNodeLookup { - type Target = DummyNodeLookup; - fn deref(&self) -> &DummyNodeLookup { - self - } - } struct DirectlyConnectedRouter {} impl MessageRouter for DirectlyConnectedRouter { diff --git a/lightning/src/blinded_path/message.rs b/lightning/src/blinded_path/message.rs index 68c4a60738b..7bcbe80a965 100644 --- a/lightning/src/blinded_path/message.rs +++ b/lightning/src/blinded_path/message.rs @@ -31,7 +31,6 @@ use crate::types::payment::PaymentHash; use crate::util::scid_utils; use crate::util::ser::{FixedLengthReader, LengthReadableArgs, Readable, Writeable, Writer}; -use core::ops::Deref; use core::time::Duration; use core::{cmp, mem}; @@ -192,11 +191,10 @@ impl BlindedMessagePath { /// introduction node. /// /// Will only modify `self` when returning `Ok`. - pub fn advance_path_by_one( + pub fn advance_path_by_one( &mut self, node_signer: &NS, node_id_lookup: &NL, secp_ctx: &Secp256k1, ) -> Result<(), ()> where - NL::Target: NodeIdLookUp, T: secp256k1::Signing + secp256k1::Verification, { let control_tlvs_ss = node_signer.ecdh(Recipient::Node, &self.0.blinding_point, None)?; diff --git a/lightning/src/blinded_path/mod.rs b/lightning/src/blinded_path/mod.rs index 2f9b1b9a411..d1f58c8c1d9 100644 --- a/lightning/src/blinded_path/mod.rs +++ b/lightning/src/blinded_path/mod.rs @@ -88,10 +88,9 @@ impl NodeIdLookUp for EmptyNodeIdLookUp { } } -impl Deref for EmptyNodeIdLookUp { - type Target = EmptyNodeIdLookUp; - fn deref(&self) -> &Self { - self +impl> NodeIdLookUp for N { + fn next_node_id(&self, short_channel_id: u64) -> Option { + self.deref().next_node_id(short_channel_id) } } diff --git a/lightning/src/blinded_path/payment.rs b/lightning/src/blinded_path/payment.rs index 98fd1afcf95..b9aa6d4cac6 100644 --- a/lightning/src/blinded_path/payment.rs +++ b/lightning/src/blinded_path/payment.rs @@ -34,7 +34,6 @@ use crate::util::ser::{ }; use core::mem; -use core::ops::Deref; #[allow(unused_imports)] use crate::prelude::*; @@ -177,11 +176,10 @@ impl BlindedPaymentPath { /// introduction node. /// /// Will only modify `self` when returning `Ok`. - pub fn advance_path_by_one( + pub fn advance_path_by_one( &mut self, node_signer: &NS, node_id_lookup: &NL, secp_ctx: &Secp256k1, ) -> Result<(), ()> where - NL::Target: NodeIdLookUp, T: secp256k1::Signing + secp256k1::Verification, { match self.decrypt_intro_payload(node_signer) { diff --git a/lightning/src/ln/outbound_payment.rs b/lightning/src/ln/outbound_payment.rs index f5cb2b436c6..8add408e333 100644 --- a/lightning/src/ln/outbound_payment.rs +++ b/lightning/src/ln/outbound_payment.rs @@ -40,7 +40,6 @@ use crate::util::ser::ReadableArgs; use crate::util::time::Instant; use core::fmt::{self, Display, Formatter}; -use core::ops::Deref; use core::sync::atomic::{AtomicBool, Ordering}; use core::time::Duration; @@ -948,7 +947,7 @@ impl OutboundPayments { #[rustfmt::skip] pub(super) fn send_payment_for_bolt12_invoice< - R: Router, ES: EntropySource, NS: NodeSigner, NL: Deref, IH, SP + R: Router, ES: EntropySource, NS: NodeSigner, NL: NodeIdLookUp, IH, SP >( &self, invoice: &Bolt12Invoice, payment_id: PaymentId, router: &R, first_hops: Vec, features: Bolt12InvoiceFeatures, inflight_htlcs: IH, @@ -958,7 +957,6 @@ impl OutboundPayments { send_payment_along_path: SP, ) -> Result<(), Bolt12PaymentError> where - NL::Target: NodeIdLookUp, IH: Fn() -> InFlightHtlcs, SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, { @@ -990,7 +988,7 @@ impl OutboundPayments { #[rustfmt::skip] fn send_payment_for_bolt12_invoice_internal< - R: Router, ES: EntropySource, NS: NodeSigner, NL: Deref, IH, SP + R: Router, ES: EntropySource, NS: NodeSigner, NL: NodeIdLookUp, IH, SP >( &self, payment_id: PaymentId, payment_hash: PaymentHash, keysend_preimage: Option, invoice_request: Option<&InvoiceRequest>, @@ -1002,7 +1000,6 @@ impl OutboundPayments { send_payment_along_path: SP, ) -> Result<(), Bolt12PaymentError> where - NL::Target: NodeIdLookUp, IH: Fn() -> InFlightHtlcs, SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, { @@ -1204,21 +1201,16 @@ impl OutboundPayments { R: Router, ES: EntropySource, NS: NodeSigner, - NL: Deref, - IH, - SP, + NL: NodeIdLookUp, + IH: Fn() -> InFlightHtlcs, + SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, >( &self, payment_id: PaymentId, hold_htlcs_at_next_hop: bool, router: &R, first_hops: Vec, inflight_htlcs: IH, entropy_source: &ES, node_signer: &NS, node_id_lookup: &NL, secp_ctx: &Secp256k1, best_block_height: u32, pending_events: &Mutex)>>, send_payment_along_path: SP, - ) -> Result<(), Bolt12PaymentError> - where - NL::Target: NodeIdLookUp, - IH: Fn() -> InFlightHtlcs, - SP: Fn(SendAlongPathArgs) -> Result<(), APIError>, - { + ) -> Result<(), Bolt12PaymentError> { let ( payment_hash, keysend_preimage, diff --git a/lightning/src/onion_message/messenger.rs b/lightning/src/onion_message/messenger.rs index 0aadc6d6e31..5e2ec2d9bb9 100644 --- a/lightning/src/onion_message/messenger.rs +++ b/lightning/src/onion_message/messenger.rs @@ -72,9 +72,7 @@ pub trait AOnionMessenger { /// A type implementing [`Logger`] type Logger: Logger; /// A type implementing [`NodeIdLookUp`] - type NodeIdLookUp: NodeIdLookUp + ?Sized; - /// A type that may be dereferenced to [`Self::NodeIdLookUp`] - type NL: Deref; + type NL: NodeIdLookUp; /// A type implementing [`MessageRouter`] type MessageRouter: MessageRouter; /// A type implementing [`OffersMessageHandler`] @@ -113,7 +111,7 @@ impl< ES: EntropySource, NS: NodeSigner, L: Logger, - NL: Deref, + NL: NodeIdLookUp, MR: MessageRouter, OMH: Deref, APH: Deref, @@ -121,7 +119,6 @@ impl< CMH: Deref, > AOnionMessenger for OnionMessenger where - NL::Target: NodeIdLookUp, OMH::Target: OffersMessageHandler, APH::Target: AsyncPaymentsMessageHandler, DRH::Target: DNSResolverMessageHandler, @@ -130,7 +127,6 @@ where type EntropySource = ES; type NodeSigner = NS; type Logger = L; - type NodeIdLookUp = NL::Target; type NL = NL; type MessageRouter = MR; type OffersMessageHandler = OMH::Target; @@ -271,14 +267,13 @@ pub struct OnionMessenger< ES: EntropySource, NS: NodeSigner, L: Logger, - NL: Deref, + NL: NodeIdLookUp, MR: MessageRouter, OMH: Deref, APH: Deref, DRH: Deref, CMH: Deref, > where - NL::Target: NodeIdLookUp, OMH::Target: OffersMessageHandler, APH::Target: AsyncPaymentsMessageHandler, DRH::Target: DNSResolverMessageHandler, @@ -1037,16 +1032,13 @@ pub enum PeeledOnion { pub fn create_onion_message_resolving_destination< ES: EntropySource, NS: NodeSigner, - NL: Deref, + NL: NodeIdLookUp, T: OnionMessageContents, >( entropy_source: &ES, node_signer: &NS, node_id_lookup: &NL, network_graph: &ReadOnlyNetworkGraph, secp_ctx: &Secp256k1, mut path: OnionMessagePath, contents: T, reply_path: Option, -) -> Result<(PublicKey, OnionMessage, Vec), SendError> -where - NL::Target: NodeIdLookUp, -{ +) -> Result<(PublicKey, OnionMessage, Vec), SendError> { path.destination.resolve(network_graph); create_onion_message( entropy_source, @@ -1070,14 +1062,16 @@ where /// - unless it can be resolved by [`NodeIdLookUp::next_node_id`]. /// Use [`create_onion_message_resolving_destination`] instead to resolve the introduction node /// first with a [`ReadOnlyNetworkGraph`]. -pub fn create_onion_message( +pub fn create_onion_message< + ES: EntropySource, + NS: NodeSigner, + NL: NodeIdLookUp, + T: OnionMessageContents, +>( entropy_source: &ES, node_signer: &NS, node_id_lookup: &NL, secp_ctx: &Secp256k1, path: OnionMessagePath, contents: T, reply_path: Option, -) -> Result<(PublicKey, OnionMessage, Vec), SendError> -where - NL::Target: NodeIdLookUp, -{ +) -> Result<(PublicKey, OnionMessage, Vec), SendError> { let OnionMessagePath { intermediate_nodes, mut destination, first_node_addresses } = path; if let Destination::BlindedPath(ref path) = destination { if path.blinded_hops().is_empty() { @@ -1374,7 +1368,7 @@ impl< ES: EntropySource, NS: NodeSigner, L: Logger, - NL: Deref, + NL: NodeIdLookUp, MR: MessageRouter, OMH: Deref, APH: Deref, @@ -1382,7 +1376,6 @@ impl< CMH: Deref, > OnionMessenger where - NL::Target: NodeIdLookUp, OMH::Target: OffersMessageHandler, APH::Target: AsyncPaymentsMessageHandler, DRH::Target: DNSResolverMessageHandler, @@ -2014,7 +2007,7 @@ impl< ES: EntropySource, NS: NodeSigner, L: Logger, - NL: Deref, + NL: NodeIdLookUp, MR: MessageRouter, OMH: Deref, APH: Deref, @@ -2022,7 +2015,6 @@ impl< CMH: Deref, > EventsProvider for OnionMessenger where - NL::Target: NodeIdLookUp, OMH::Target: OffersMessageHandler, APH::Target: AsyncPaymentsMessageHandler, DRH::Target: DNSResolverMessageHandler, @@ -2131,7 +2123,7 @@ impl< ES: EntropySource, NS: NodeSigner, L: Logger, - NL: Deref, + NL: NodeIdLookUp, MR: MessageRouter, OMH: Deref, APH: Deref, @@ -2139,7 +2131,6 @@ impl< CMH: Deref, > BaseMessageHandler for OnionMessenger where - NL::Target: NodeIdLookUp, OMH::Target: OffersMessageHandler, APH::Target: AsyncPaymentsMessageHandler, DRH::Target: DNSResolverMessageHandler, @@ -2199,7 +2190,7 @@ impl< ES: EntropySource, NS: NodeSigner, L: Logger, - NL: Deref, + NL: NodeIdLookUp, MR: MessageRouter, OMH: Deref, APH: Deref, @@ -2207,7 +2198,6 @@ impl< CMH: Deref, > OnionMessageHandler for OnionMessenger where - NL::Target: NodeIdLookUp, OMH::Target: OffersMessageHandler, APH::Target: AsyncPaymentsMessageHandler, DRH::Target: DNSResolverMessageHandler, From 65afee025a2a13f87b7b4e6bd8688ae77a0049f9 Mon Sep 17 00:00:00 2001 From: Valentine Wallace Date: Thu, 15 Jan 2026 16:35:48 -0500 Subject: [PATCH 13/17] Drop Deref indirection for message handler traits Reduces generics and verbosity across the codebase, should provide equivalent behavior. This could be split into multiple commits (e.g. one for OnionMessenger message handler types, one for PeerManager message handler types) but it would require adding a new IgnoringOnionMessageHandler type for the messenger handlers, due to the IgnoringMessageHandler's Deref implementation conflicting otherwise. Co-Authored-By: Claude Opus 4.5 --- lightning-background-processor/src/lib.rs | 12 +- lightning-dns-resolver/src/lib.rs | 18 +- lightning/src/ln/msgs.rs | 217 ++++++++++++++++++ lightning/src/ln/peer_handler.rs | 183 ++++++--------- lightning/src/ln/wire.rs | 20 +- lightning/src/onion_message/async_payments.rs | 40 ++++ lightning/src/onion_message/dns_resolution.rs | 18 ++ lightning/src/onion_message/messenger.rs | 132 +++++------ lightning/src/onion_message/offers.rs | 12 + 9 files changed, 436 insertions(+), 216 deletions(-) diff --git a/lightning-background-processor/src/lib.rs b/lightning-background-processor/src/lib.rs index a67657be8dc..4c41a2c67be 100644 --- a/lightning-background-processor/src/lib.rs +++ b/lightning-background-processor/src/lib.rs @@ -417,14 +417,10 @@ pub const NO_ONION_MESSENGER: Option< Logger = &'static (dyn Logger + Send + Sync), NL = &'static DynChannelManager, MessageRouter = &'static DynMessageRouter, - OffersMessageHandler = lightning::ln::peer_handler::IgnoringMessageHandler, - OMH = &'static lightning::ln::peer_handler::IgnoringMessageHandler, - AsyncPaymentsMessageHandler = lightning::ln::peer_handler::IgnoringMessageHandler, - APH = &'static lightning::ln::peer_handler::IgnoringMessageHandler, - DNSResolverMessageHandler = lightning::ln::peer_handler::IgnoringMessageHandler, - DRH = &'static lightning::ln::peer_handler::IgnoringMessageHandler, - CustomOnionMessageHandler = lightning::ln::peer_handler::IgnoringMessageHandler, - CMH = &'static lightning::ln::peer_handler::IgnoringMessageHandler, + OMH = lightning::ln::peer_handler::IgnoringMessageHandler, + APH = lightning::ln::peer_handler::IgnoringMessageHandler, + DRH = lightning::ln::peer_handler::IgnoringMessageHandler, + CMH = lightning::ln::peer_handler::IgnoringMessageHandler, > + Send + Sync, >, diff --git a/lightning-dns-resolver/src/lib.rs b/lightning-dns-resolver/src/lib.rs index a2786ca2921..70821be0f3c 100644 --- a/lightning-dns-resolver/src/lib.rs +++ b/lightning-dns-resolver/src/lib.rs @@ -6,7 +6,6 @@ #![deny(rustdoc::private_intra_doc_links)] use std::net::SocketAddr; -use std::ops::Deref; use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::{Arc, Mutex}; @@ -30,10 +29,7 @@ const WE_REQUIRE_32_OR_64_BIT_USIZE: u8 = 424242; /// A resolver which implements [`DNSResolverMessageHandler`] and replies to [`DNSSECQuery`] /// messages with with [`DNSSECProof`]s. -pub struct OMDomainResolver -where - PH::Target: DNSResolverMessageHandler, -{ +pub struct OMDomainResolver { state: Arc, proof_handler: Option, runtime_handle: Mutex>, @@ -56,10 +52,7 @@ impl OMDomainResolver { } } -impl OMDomainResolver -where - PH::Target: DNSResolverMessageHandler, -{ +impl OMDomainResolver { /// Creates a new [`OMDomainResolver`] given the [`SocketAddr`] of a DNS resolver listening on /// TCP (e.g. 8.8.8.8:53, 1.1.1.1:53 or your local DNS resolver). /// @@ -103,10 +96,7 @@ where } } -impl DNSResolverMessageHandler for OMDomainResolver -where - PH::Target: DNSResolverMessageHandler, -{ +impl DNSResolverMessageHandler for OMDomainResolver { fn handle_dnssec_proof(&self, proof: DNSSECProof, context: DNSResolverContext) { if let Some(proof_handler) = &self.proof_handler { proof_handler.handle_dnssec_proof(proof, context); @@ -169,7 +159,6 @@ mod test { use lightning::ln::msgs::{ BaseMessageHandler, ChannelMessageHandler, Init, OnionMessageHandler, }; - use lightning::ln::peer_handler::IgnoringMessageHandler; use lightning::offers::offer::Offer; use lightning::onion_message::dns_resolution::{HumanReadableName, OMNameResolver}; use lightning::onion_message::messenger::{ @@ -183,7 +172,6 @@ mod test { use lightning::expect_payment_claimed; use lightning_types::string::UntrustedString; - use std::ops::Deref; use std::sync::Mutex; use std::time::{Duration, Instant, SystemTime}; diff --git a/lightning/src/ln/msgs.rs b/lightning/src/ln/msgs.rs index 98939e69546..cc9b4953b41 100644 --- a/lightning/src/ln/msgs.rs +++ b/lightning/src/ln/msgs.rs @@ -50,6 +50,7 @@ use crate::io_extras::read_to_end; use core::fmt; use core::fmt::Debug; use core::fmt::Display; +use core::ops::Deref; #[cfg(feature = "std")] use core::str::FromStr; #[cfg(feature = "std")] @@ -2074,6 +2075,26 @@ pub trait BaseMessageHandler { -> Result<(), ()>; } +impl> BaseMessageHandler for B { + fn get_and_clear_pending_msg_events(&self) -> Vec { + self.deref().get_and_clear_pending_msg_events() + } + fn peer_disconnected(&self, their_node_id: PublicKey) { + self.deref().peer_disconnected(their_node_id) + } + fn provided_node_features(&self) -> NodeFeatures { + self.deref().provided_node_features() + } + fn provided_init_features(&self, their_node_id: PublicKey) -> InitFeatures { + self.deref().provided_init_features(their_node_id) + } + fn peer_connected( + &self, their_node_id: PublicKey, msg: &Init, inbound: bool, + ) -> Result<(), ()> { + self.deref().peer_connected(their_node_id, msg, inbound) + } +} + /// A trait to describe an object which can receive channel messages. /// /// Messages MAY be called in parallel when they originate from different `their_node_ids`, however @@ -2214,6 +2235,137 @@ pub trait ChannelMessageHandler: BaseMessageHandler { fn message_received(&self); } +impl> ChannelMessageHandler for C { + fn handle_open_channel(&self, their_node_id: PublicKey, msg: &OpenChannel) { + self.deref().handle_open_channel(their_node_id, msg) + } + fn handle_open_channel_v2(&self, their_node_id: PublicKey, msg: &OpenChannelV2) { + self.deref().handle_open_channel_v2(their_node_id, msg) + } + fn handle_accept_channel(&self, their_node_id: PublicKey, msg: &AcceptChannel) { + self.deref().handle_accept_channel(their_node_id, msg) + } + fn handle_accept_channel_v2(&self, their_node_id: PublicKey, msg: &AcceptChannelV2) { + self.deref().handle_accept_channel_v2(their_node_id, msg) + } + fn handle_funding_created(&self, their_node_id: PublicKey, msg: &FundingCreated) { + self.deref().handle_funding_created(their_node_id, msg) + } + fn handle_funding_signed(&self, their_node_id: PublicKey, msg: &FundingSigned) { + self.deref().handle_funding_signed(their_node_id, msg) + } + fn handle_channel_ready(&self, their_node_id: PublicKey, msg: &ChannelReady) { + self.deref().handle_channel_ready(their_node_id, msg) + } + fn handle_peer_storage(&self, their_node_id: PublicKey, msg: PeerStorage) { + self.deref().handle_peer_storage(their_node_id, msg) + } + fn handle_peer_storage_retrieval(&self, their_node_id: PublicKey, msg: PeerStorageRetrieval) { + self.deref().handle_peer_storage_retrieval(their_node_id, msg) + } + fn handle_shutdown(&self, their_node_id: PublicKey, msg: &Shutdown) { + self.deref().handle_shutdown(their_node_id, msg) + } + fn handle_closing_signed(&self, their_node_id: PublicKey, msg: &ClosingSigned) { + self.deref().handle_closing_signed(their_node_id, msg) + } + #[cfg(simple_close)] + fn handle_closing_complete(&self, their_node_id: PublicKey, msg: ClosingComplete) { + self.deref().handle_closing_complete(their_node_id, msg) + } + #[cfg(simple_close)] + fn handle_closing_sig(&self, their_node_id: PublicKey, msg: ClosingSig) { + self.deref().handle_closing_sig(their_node_id, msg) + } + fn handle_stfu(&self, their_node_id: PublicKey, msg: &Stfu) { + self.deref().handle_stfu(their_node_id, msg) + } + fn handle_splice_init(&self, their_node_id: PublicKey, msg: &SpliceInit) { + self.deref().handle_splice_init(their_node_id, msg) + } + fn handle_splice_ack(&self, their_node_id: PublicKey, msg: &SpliceAck) { + self.deref().handle_splice_ack(their_node_id, msg) + } + fn handle_splice_locked(&self, their_node_id: PublicKey, msg: &SpliceLocked) { + self.deref().handle_splice_locked(their_node_id, msg) + } + fn handle_tx_add_input(&self, their_node_id: PublicKey, msg: &TxAddInput) { + self.deref().handle_tx_add_input(their_node_id, msg) + } + fn handle_tx_add_output(&self, their_node_id: PublicKey, msg: &TxAddOutput) { + self.deref().handle_tx_add_output(their_node_id, msg) + } + fn handle_tx_remove_input(&self, their_node_id: PublicKey, msg: &TxRemoveInput) { + self.deref().handle_tx_remove_input(their_node_id, msg) + } + fn handle_tx_remove_output(&self, their_node_id: PublicKey, msg: &TxRemoveOutput) { + self.deref().handle_tx_remove_output(their_node_id, msg) + } + fn handle_tx_complete(&self, their_node_id: PublicKey, msg: &TxComplete) { + self.deref().handle_tx_complete(their_node_id, msg) + } + fn handle_tx_signatures(&self, their_node_id: PublicKey, msg: &TxSignatures) { + self.deref().handle_tx_signatures(their_node_id, msg) + } + fn handle_tx_init_rbf(&self, their_node_id: PublicKey, msg: &TxInitRbf) { + self.deref().handle_tx_init_rbf(their_node_id, msg) + } + fn handle_tx_ack_rbf(&self, their_node_id: PublicKey, msg: &TxAckRbf) { + self.deref().handle_tx_ack_rbf(their_node_id, msg) + } + fn handle_tx_abort(&self, their_node_id: PublicKey, msg: &TxAbort) { + self.deref().handle_tx_abort(their_node_id, msg) + } + fn handle_update_add_htlc(&self, their_node_id: PublicKey, msg: &UpdateAddHTLC) { + self.deref().handle_update_add_htlc(their_node_id, msg) + } + fn handle_update_fulfill_htlc(&self, their_node_id: PublicKey, msg: UpdateFulfillHTLC) { + self.deref().handle_update_fulfill_htlc(their_node_id, msg) + } + fn handle_update_fail_htlc(&self, their_node_id: PublicKey, msg: &UpdateFailHTLC) { + self.deref().handle_update_fail_htlc(their_node_id, msg) + } + fn handle_update_fail_malformed_htlc( + &self, their_node_id: PublicKey, msg: &UpdateFailMalformedHTLC, + ) { + self.deref().handle_update_fail_malformed_htlc(their_node_id, msg) + } + fn handle_commitment_signed(&self, their_node_id: PublicKey, msg: &CommitmentSigned) { + self.deref().handle_commitment_signed(their_node_id, msg) + } + fn handle_commitment_signed_batch( + &self, their_node_id: PublicKey, channel_id: ChannelId, batch: Vec, + ) { + self.deref().handle_commitment_signed_batch(their_node_id, channel_id, batch) + } + fn handle_revoke_and_ack(&self, their_node_id: PublicKey, msg: &RevokeAndACK) { + self.deref().handle_revoke_and_ack(their_node_id, msg) + } + fn handle_update_fee(&self, their_node_id: PublicKey, msg: &UpdateFee) { + self.deref().handle_update_fee(their_node_id, msg) + } + fn handle_announcement_signatures( + &self, their_node_id: PublicKey, msg: &AnnouncementSignatures, + ) { + self.deref().handle_announcement_signatures(their_node_id, msg) + } + fn handle_channel_reestablish(&self, their_node_id: PublicKey, msg: &ChannelReestablish) { + self.deref().handle_channel_reestablish(their_node_id, msg) + } + fn handle_channel_update(&self, their_node_id: PublicKey, msg: &ChannelUpdate) { + self.deref().handle_channel_update(their_node_id, msg) + } + fn handle_error(&self, their_node_id: PublicKey, msg: &ErrorMessage) { + self.deref().handle_error(their_node_id, msg) + } + fn get_chain_hashes(&self) -> Option> { + self.deref().get_chain_hashes() + } + fn message_received(&self) { + self.deref().message_received() + } +} + /// A trait to describe an object which can receive routing messages. /// /// # Implementor DoS Warnings @@ -2288,6 +2440,57 @@ pub trait RoutingMessageHandler: BaseMessageHandler { fn processing_queue_high(&self) -> bool; } +impl> RoutingMessageHandler for R { + fn handle_node_announcement( + &self, their_node_id: Option, msg: &NodeAnnouncement, + ) -> Result { + self.deref().handle_node_announcement(their_node_id, msg) + } + fn handle_channel_announcement( + &self, their_node_id: Option, msg: &ChannelAnnouncement, + ) -> Result { + self.deref().handle_channel_announcement(their_node_id, msg) + } + fn handle_channel_update( + &self, their_node_id: Option, msg: &ChannelUpdate, + ) -> Result, LightningError> { + self.deref().handle_channel_update(their_node_id, msg) + } + fn get_next_channel_announcement( + &self, starting_point: u64, + ) -> Option<(ChannelAnnouncement, Option, Option)> { + self.deref().get_next_channel_announcement(starting_point) + } + fn get_next_node_announcement( + &self, starting_point: Option<&NodeId>, + ) -> Option { + self.deref().get_next_node_announcement(starting_point) + } + fn handle_reply_channel_range( + &self, their_node_id: PublicKey, msg: ReplyChannelRange, + ) -> Result<(), LightningError> { + self.deref().handle_reply_channel_range(their_node_id, msg) + } + fn handle_reply_short_channel_ids_end( + &self, their_node_id: PublicKey, msg: ReplyShortChannelIdsEnd, + ) -> Result<(), LightningError> { + self.deref().handle_reply_short_channel_ids_end(their_node_id, msg) + } + fn handle_query_channel_range( + &self, their_node_id: PublicKey, msg: QueryChannelRange, + ) -> Result<(), LightningError> { + self.deref().handle_query_channel_range(their_node_id, msg) + } + fn handle_query_short_channel_ids( + &self, their_node_id: PublicKey, msg: QueryShortChannelIds, + ) -> Result<(), LightningError> { + self.deref().handle_query_short_channel_ids(their_node_id, msg) + } + fn processing_queue_high(&self) -> bool { + self.deref().processing_queue_high() + } +} + /// A handler for received [`OnionMessage`]s and for providing generated ones to send. pub trait OnionMessageHandler: BaseMessageHandler { /// Handle an incoming `onion_message` message from the given peer. @@ -2304,6 +2507,18 @@ pub trait OnionMessageHandler: BaseMessageHandler { fn timer_tick_occurred(&self); } +impl> OnionMessageHandler for O { + fn handle_onion_message(&self, peer_node_id: PublicKey, msg: &OnionMessage) { + self.deref().handle_onion_message(peer_node_id, msg) + } + fn next_onion_message_for_peer(&self, peer_node_id: PublicKey) -> Option { + self.deref().next_onion_message_for_peer(peer_node_id) + } + fn timer_tick_occurred(&self) { + self.deref().timer_tick_occurred() + } +} + /// A handler which can only be used to send messages. /// /// This is implemented by [`ChainMonitor`]. @@ -2311,6 +2526,8 @@ pub trait OnionMessageHandler: BaseMessageHandler { /// [`ChainMonitor`]: crate::chain::chainmonitor::ChainMonitor pub trait SendOnlyMessageHandler: BaseMessageHandler {} +impl> SendOnlyMessageHandler for S {} + #[derive(Clone, Debug, PartialEq, Eq)] /// Information communicated in the onion to the recipient for multi-part tracking and proof that /// the payment is associated with an invoice. diff --git a/lightning/src/ln/peer_handler.rs b/lightning/src/ln/peer_handler.rs index 1891c52928d..759a1e7d887 100644 --- a/lightning/src/ln/peer_handler.rs +++ b/lightning/src/ln/peer_handler.rs @@ -53,7 +53,6 @@ use crate::util::ser::{VecWriter, Writeable, Writer}; #[allow(unused_imports)] use crate::prelude::*; -use super::wire::CustomMessageReader; use crate::io; use crate::sync::{FairRwLock, Mutex, MutexGuard}; use core::convert::Infallible; @@ -126,6 +125,31 @@ pub trait CustomMessageHandler: wire::CustomMessageReader { fn provided_init_features(&self, their_node_id: PublicKey) -> InitFeatures; } +impl> CustomMessageHandler for C { + fn handle_custom_message( + &self, msg: Self::CustomMessage, sender_node_id: PublicKey, + ) -> Result<(), LightningError> { + self.deref().handle_custom_message(msg, sender_node_id) + } + fn get_and_clear_pending_msg(&self) -> Vec<(PublicKey, Self::CustomMessage)> { + self.deref().get_and_clear_pending_msg() + } + fn peer_disconnected(&self, their_node_id: PublicKey) { + self.deref().peer_disconnected(their_node_id) + } + fn peer_connected( + &self, their_node_id: PublicKey, msg: &Init, inbound: bool, + ) -> Result<(), ()> { + self.deref().peer_connected(their_node_id, msg, inbound) + } + fn provided_node_features(&self) -> NodeFeatures { + self.deref().provided_node_features() + } + fn provided_init_features(&self, their_node_id: PublicKey) -> InitFeatures { + self.deref().provided_init_features(their_node_id) + } +} + /// A dummy struct which implements `RoutingMessageHandler` without storing any routing information /// or doing any processing. You can provide one of these as the route_handler in a MessageHandler. pub struct IgnoringMessageHandler {} @@ -288,13 +312,6 @@ impl OnionMessageContents for Infallible { } } -impl Deref for IgnoringMessageHandler { - type Target = IgnoringMessageHandler; - fn deref(&self) -> &Self { - self - } -} - // Implement Type for Infallible, note that it cannot be constructed, and thus you can never call a // method that takes self for it. impl wire::Type for Infallible { @@ -568,22 +585,14 @@ impl ChannelMessageHandler for ErroringMessageHandler { fn message_received(&self) {} } -impl Deref for ErroringMessageHandler { - type Target = ErroringMessageHandler; - fn deref(&self) -> &Self { - self - } -} - /// Provides references to trait impls which handle different types of messages. -pub struct MessageHandler -where - CM::Target: ChannelMessageHandler, - RM::Target: RoutingMessageHandler, - OM::Target: OnionMessageHandler, - CustomM::Target: CustomMessageHandler, - SM::Target: SendOnlyMessageHandler, -{ +pub struct MessageHandler< + CM: ChannelMessageHandler, + RM: RoutingMessageHandler, + OM: OnionMessageHandler, + CustomM: CustomMessageHandler, + SM: SendOnlyMessageHandler, +> { /// A message handler which handles messages specific to channels. Usually this is just a /// [`ChannelManager`] object or an [`ErroringMessageHandler`]. /// @@ -971,18 +980,13 @@ pub type SimpleRefPeerManager< #[allow(missing_docs)] pub trait APeerManager { type Descriptor: SocketDescriptor; - type CMT: ChannelMessageHandler + ?Sized; - type CM: Deref; - type RMT: RoutingMessageHandler + ?Sized; - type RM: Deref; - type OMT: OnionMessageHandler + ?Sized; - type OM: Deref; + type CM: ChannelMessageHandler; + type RM: RoutingMessageHandler; + type OM: OnionMessageHandler; type Logger: Logger; - type CMHT: CustomMessageHandler + ?Sized; - type CMH: Deref; + type CMH: CustomMessageHandler; type NodeSigner: NodeSigner; - type SMT: SendOnlyMessageHandler + ?Sized; - type SM: Deref; + type SM: SendOnlyMessageHandler; /// Gets a reference to the underlying [`PeerManager`]. fn as_ref( &self, @@ -1000,33 +1004,22 @@ pub trait APeerManager { impl< Descriptor: SocketDescriptor, - CM: Deref, - RM: Deref, - OM: Deref, + CM: ChannelMessageHandler, + RM: RoutingMessageHandler, + OM: OnionMessageHandler, L: Logger, - CMH: Deref, + CMH: CustomMessageHandler, NS: NodeSigner, - SM: Deref, + SM: SendOnlyMessageHandler, > APeerManager for PeerManager -where - CM::Target: ChannelMessageHandler, - RM::Target: RoutingMessageHandler, - OM::Target: OnionMessageHandler, - CMH::Target: CustomMessageHandler, - SM::Target: SendOnlyMessageHandler, { type Descriptor = Descriptor; - type CMT = ::Target; type CM = CM; - type RMT = ::Target; type RM = RM; - type OMT = ::Target; type OM = OM; type Logger = L; - type CMHT = ::Target; type CMH = CMH; type NodeSigner = NS; - type SMT = ::Target; type SM = SM; fn as_ref(&self) -> &PeerManager { self @@ -1054,20 +1047,14 @@ where /// [`read_event`]: PeerManager::read_event pub struct PeerManager< Descriptor: SocketDescriptor, - CM: Deref, - RM: Deref, - OM: Deref, + CM: ChannelMessageHandler, + RM: RoutingMessageHandler, + OM: OnionMessageHandler, L: Logger, - CMH: Deref, + CMH: CustomMessageHandler, NS: NodeSigner, - SM: Deref, -> where - CM::Target: ChannelMessageHandler, - RM::Target: RoutingMessageHandler, - OM::Target: OnionMessageHandler, - CMH::Target: CustomMessageHandler, - SM::Target: SendOnlyMessageHandler, -{ + SM: SendOnlyMessageHandler, +> { message_handler: MessageHandler, /// Connection state for each connected peer - we have an outer read-write lock which is taken /// as read while we're doing processing for a peer and taken write when a peer is being added @@ -1143,12 +1130,14 @@ fn encode_message(message: wire::Message) -> Vec { buffer.0 } -impl - PeerManager -where - CM::Target: ChannelMessageHandler, - OM::Target: OnionMessageHandler, - SM::Target: SendOnlyMessageHandler, +impl< + Descriptor: SocketDescriptor, + CM: ChannelMessageHandler, + OM: OnionMessageHandler, + L: Logger, + NS: NodeSigner, + SM: SendOnlyMessageHandler, + > PeerManager { /// Constructs a new `PeerManager` with the given `ChannelMessageHandler` and /// `OnionMessageHandler`. No routing message handler is used and network graph messages are @@ -1184,7 +1173,7 @@ where } } -impl +impl PeerManager< Descriptor, ErroringMessageHandler, @@ -1194,8 +1183,7 @@ impl IgnoringMessageHandler, NS, IgnoringMessageHandler, - > where - RM::Target: RoutingMessageHandler, + > { /// Constructs a new `PeerManager` with the given `RoutingMessageHandler`. No channel message /// handler or onion message handler is used and onion and channel messages will be ignored (or @@ -1281,20 +1269,14 @@ fn filter_addresses(ip_address: Option) -> Option impl< Descriptor: SocketDescriptor, - CM: Deref, - RM: Deref, - OM: Deref, + CM: ChannelMessageHandler, + RM: RoutingMessageHandler, + OM: OnionMessageHandler, L: Logger, - CMH: Deref, + CMH: CustomMessageHandler, NS: NodeSigner, - SM: Deref, + SM: SendOnlyMessageHandler, > PeerManager -where - CM::Target: ChannelMessageHandler, - RM::Target: RoutingMessageHandler, - OM::Target: OnionMessageHandler, - CMH::Target: CustomMessageHandler, - SM::Target: SendOnlyMessageHandler, { /// Constructs a new `PeerManager` with the given message handlers. /// @@ -1721,10 +1703,7 @@ where } /// Append a message to a peer's pending outbound/write buffer - fn enqueue_message( - &self, peer: &mut Peer, - message: Message<::CustomMessage>, - ) { + fn enqueue_message(&self, peer: &mut Peer, message: Message) { let their_node_id = peer.their_node_id.map(|p| p.0); if their_node_id.is_some() { let logger = WithContext::from(&self.logger, their_node_id, None, None); @@ -1940,7 +1919,7 @@ where let message_result = wire::read( &mut &peer.pending_read_buffer [..peer.pending_read_buffer.len() - 16], - &*self.message_handler.custom_message_handler, + &self.message_handler.custom_message_handler, ); // Reset read buffer @@ -2067,7 +2046,7 @@ where /// Returns the message back if it needs to be broadcasted to all other peers. fn handle_message( &self, peer_mutex: &Mutex, peer_lock: MutexGuard, - message: Message<<::Target as wire::CustomMessageReader>::CustomMessage>, + message: Message, ) -> Result, MessageHandlingError> { let their_node_id = peer_lock .their_node_id @@ -2107,15 +2086,9 @@ where // Returns `None` if the message was fully processed and otherwise returns the message back to // allow it to be subsequently processed by `do_handle_message_without_peer_lock`. fn do_handle_message_holding_peer_lock<'a>( - &self, mut peer_lock: MutexGuard, - message: Message<<::Target as wire::CustomMessageReader>::CustomMessage>, + &self, mut peer_lock: MutexGuard, message: Message, their_node_id: PublicKey, logger: &WithContext<'a, L>, - ) -> Result< - Option< - LogicalMessage<<::Target as wire::CustomMessageReader>::CustomMessage>, - >, - MessageHandlingError, - > { + ) -> Result>, MessageHandlingError> { peer_lock.received_message_since_timer_tick = true; // Need an Init as first message @@ -2387,8 +2360,7 @@ where // // Returns the message back if it needs to be broadcasted to all other peers. fn do_handle_message_without_peer_lock<'a>( - &self, peer_mutex: &Mutex, - message: Message<<::Target as wire::CustomMessageReader>::CustomMessage>, + &self, peer_mutex: &Mutex, message: Message, their_node_id: PublicKey, logger: &WithContext<'a, L>, ) -> Result, MessageHandlingError> { if is_gossip_msg(message.type_id()) { @@ -2657,8 +2629,7 @@ where let scid = msg.contents.short_channel_id; let node_id_1 = msg.contents.node_id_1; let node_id_2 = msg.contents.node_id_2; - let msg: Message<::CustomMessage> = - Message::ChannelAnnouncement(msg); + let msg: Message = Message::ChannelAnnouncement(msg); let encoded_msg = encode_message(msg); for (_, peer_mutex) in peers.iter() { let mut peer = peer_mutex.lock().unwrap(); @@ -2704,8 +2675,7 @@ where let our_announcement = self.our_node_id == msg.contents.node_id; let msg_node_id = msg.contents.node_id; - let msg: Message<::CustomMessage> = - Message::NodeAnnouncement(msg); + let msg: Message = Message::NodeAnnouncement(msg); let encoded_msg = encode_message(msg); for (_, peer_mutex) in peers.iter() { let mut peer = peer_mutex.lock().unwrap(); @@ -2750,8 +2720,7 @@ where ); let our_channel = self.our_node_id == node_id_1 || self.our_node_id == node_id_2; let scid = msg.contents.short_channel_id; - let msg: Message<::CustomMessage> = - Message::ChannelUpdate(msg); + let msg: Message = Message::ChannelUpdate(msg); let encoded_msg = encode_message(msg); for (_, peer_mutex) in peers.iter() { let mut peer = peer_mutex.lock().unwrap(); @@ -3285,9 +3254,8 @@ where // We do not have the peers write lock, so we just store that we're // about to disconnect the peer and do it after we finish // processing most messages. - let msg = msg.map(|msg| { - Message::<<::Target as wire::CustomMessageReader>::CustomMessage>::Error(msg) - }); + let msg = + msg.map(|msg| Message::::Error(msg)); peers_to_disconnect.insert(node_id, msg); }, msgs::ErrorAction::DisconnectPeerWithWarning { msg } => { @@ -3557,8 +3525,7 @@ where if peer.awaiting_pong_timer_tick_intervals == 0 { peer.awaiting_pong_timer_tick_intervals = -1; let ping = msgs::Ping { ponglen: 0, byteslen: 64 }; - let msg: Message<::CustomMessage> = - Message::Ping(ping); + let msg: Message = Message::Ping(ping); self.enqueue_message(peer, msg); } } diff --git a/lightning/src/ln/wire.rs b/lightning/src/ln/wire.rs index 9065c49c676..a2078ce4256 100644 --- a/lightning/src/ln/wire.rs +++ b/lightning/src/ln/wire.rs @@ -15,6 +15,7 @@ use crate::io; use crate::ln::msgs; use crate::util::ser::{LengthLimitedRead, LengthReadable, Readable, Writeable, Writer}; +use core::ops::Deref; /// Trait to be implemented by custom message (unrelated to the channel/gossip LN layers) /// decoders. @@ -30,6 +31,15 @@ pub trait CustomMessageReader { ) -> Result, msgs::DecodeError>; } +impl> CustomMessageReader for C { + type CustomMessage = T::CustomMessage; + fn read( + &self, message_type: u16, buffer: &mut R, + ) -> Result, msgs::DecodeError> { + self.deref().read(message_type, buffer) + } +} + // TestEq is a dummy trait which requires PartialEq when built in testing, and otherwise is // blanket-implemented for all types. @@ -244,23 +254,21 @@ impl Message { /// # Errors /// /// Returns an error if the message payload could not be decoded as the specified type. -pub(crate) fn read( +pub(crate) fn read>( buffer: &mut R, custom_reader: H, ) -> Result, (msgs::DecodeError, Option)> where T: core::fmt::Debug + Type + Writeable, - H::Target: CustomMessageReader, { let message_type = ::read(buffer).map_err(|e| (e, None))?; do_read(buffer, message_type, custom_reader).map_err(|e| (e, Some(message_type))) } -fn do_read( +fn do_read>( buffer: &mut R, message_type: u16, custom_reader: H, ) -> Result, msgs::DecodeError> where T: core::fmt::Debug + Type + Writeable, - H::Target: CustomMessageReader, { match message_type { msgs::Init::TYPE => { @@ -876,7 +884,7 @@ mod tests { #[test] fn read_custom_message() { let buffer = [35, 40]; - let decoded_msg = read(&mut &buffer[..], &TestCustomMessageReader {}).unwrap(); + let decoded_msg = read(&mut &buffer[..], TestCustomMessageReader {}).unwrap(); match decoded_msg { Message::Custom(custom) => { assert_eq!(custom.type_id(), CUSTOM_MESSAGE_TYPE); @@ -889,7 +897,7 @@ mod tests { #[test] fn read_with_custom_reader_unknown_message_type() { let buffer = [35, 42]; - let decoded_msg = read(&mut &buffer[..], &TestCustomMessageReader {}).unwrap(); + let decoded_msg = read(&mut &buffer[..], TestCustomMessageReader {}).unwrap(); match decoded_msg { Message::Unknown(_) => {}, _ => panic!("Expected unknown message, found message type: {}", decoded_msg.type_id()), diff --git a/lightning/src/onion_message/async_payments.rs b/lightning/src/onion_message/async_payments.rs index 127126e150f..41108cdccd7 100644 --- a/lightning/src/onion_message/async_payments.rs +++ b/lightning/src/onion_message/async_payments.rs @@ -17,6 +17,7 @@ use crate::onion_message::messenger::{MessageSendInstructions, Responder, Respon use crate::onion_message::packet::OnionMessageContents; use crate::prelude::*; use crate::util::ser::{Readable, ReadableArgs, Writeable, Writer}; +use core::ops::Deref; // TLV record types for the `onionmsg_tlv` TLV stream as defined in BOLT 4. const OFFER_PATHS_REQ_TLV_TYPE: u64 = 75540; @@ -89,6 +90,45 @@ pub trait AsyncPaymentsMessageHandler { } } +impl> AsyncPaymentsMessageHandler + for A +{ + fn handle_offer_paths_request( + &self, message: OfferPathsRequest, context: AsyncPaymentsContext, + responder: Option, + ) -> Option<(OfferPaths, ResponseInstruction)> { + self.deref().handle_offer_paths_request(message, context, responder) + } + fn handle_offer_paths( + &self, message: OfferPaths, context: AsyncPaymentsContext, responder: Option, + ) -> Option<(ServeStaticInvoice, ResponseInstruction)> { + self.deref().handle_offer_paths(message, context, responder) + } + fn handle_serve_static_invoice( + &self, message: ServeStaticInvoice, context: AsyncPaymentsContext, + responder: Option, + ) { + self.deref().handle_serve_static_invoice(message, context, responder) + } + fn handle_static_invoice_persisted( + &self, message: StaticInvoicePersisted, context: AsyncPaymentsContext, + ) { + self.deref().handle_static_invoice_persisted(message, context) + } + fn handle_held_htlc_available( + &self, message: HeldHtlcAvailable, context: AsyncPaymentsContext, + responder: Option, + ) -> Option<(ReleaseHeldHtlc, ResponseInstruction)> { + self.deref().handle_held_htlc_available(message, context, responder) + } + fn handle_release_held_htlc(&self, message: ReleaseHeldHtlc, context: AsyncPaymentsContext) { + self.deref().handle_release_held_htlc(message, context) + } + fn release_pending_messages(&self) -> Vec<(AsyncPaymentsMessage, MessageSendInstructions)> { + self.deref().release_pending_messages() + } +} + /// Possible async payment messages sent and received via an [`OnionMessage`]. /// /// [`OnionMessage`]: crate::ln::msgs::OnionMessage diff --git a/lightning/src/onion_message/dns_resolution.rs b/lightning/src/onion_message/dns_resolution.rs index 47d4bc09e04..e857a359c78 100644 --- a/lightning/src/onion_message/dns_resolution.rs +++ b/lightning/src/onion_message/dns_resolution.rs @@ -37,6 +37,7 @@ use dnssec_prover::rr::Name; use lightning_types::features::NodeFeatures; use core::fmt; +use core::ops::Deref; use crate::blinded_path::message::DNSResolverContext; use crate::io; @@ -89,6 +90,23 @@ pub trait DNSResolverMessageHandler { } } +impl> DNSResolverMessageHandler for D { + fn handle_dnssec_query( + &self, message: DNSSECQuery, responder: Option, + ) -> Option<(DNSResolverMessage, ResponseInstruction)> { + self.deref().handle_dnssec_query(message, responder) + } + fn handle_dnssec_proof(&self, message: DNSSECProof, context: DNSResolverContext) { + self.deref().handle_dnssec_proof(message, context) + } + fn provided_node_features(&self) -> NodeFeatures { + self.deref().provided_node_features() + } + fn release_pending_messages(&self) -> Vec<(DNSResolverMessage, MessageSendInstructions)> { + self.deref().release_pending_messages() + } +} + #[derive(Clone, Debug, Hash, PartialEq, Eq)] /// An enum containing the possible onion messages which are used uses to request and receive /// DNSSEC proofs. diff --git a/lightning/src/onion_message/messenger.rs b/lightning/src/onion_message/messenger.rs index 5e2ec2d9bb9..e688c020ac6 100644 --- a/lightning/src/onion_message/messenger.rs +++ b/lightning/src/onion_message/messenger.rs @@ -76,21 +76,13 @@ pub trait AOnionMessenger { /// A type implementing [`MessageRouter`] type MessageRouter: MessageRouter; /// A type implementing [`OffersMessageHandler`] - type OffersMessageHandler: OffersMessageHandler + ?Sized; - /// A type that may be dereferenced to [`Self::OffersMessageHandler`] - type OMH: Deref; + type OMH: OffersMessageHandler; /// A type implementing [`AsyncPaymentsMessageHandler`] - type AsyncPaymentsMessageHandler: AsyncPaymentsMessageHandler + ?Sized; - /// A type that may be dereferenced to [`Self::AsyncPaymentsMessageHandler`] - type APH: Deref; + type APH: AsyncPaymentsMessageHandler; /// A type implementing [`DNSResolverMessageHandler`] - type DNSResolverMessageHandler: DNSResolverMessageHandler + ?Sized; - /// A type that may be dereferenced to [`Self::DNSResolverMessageHandler`] - type DRH: Deref; + type DRH: DNSResolverMessageHandler; /// A type implementing [`CustomOnionMessageHandler`] - type CustomOnionMessageHandler: CustomOnionMessageHandler + ?Sized; - /// A type that may be dereferenced to [`Self::CustomOnionMessageHandler`] - type CMH: Deref; + type CMH: CustomOnionMessageHandler; /// Returns a reference to the actual [`OnionMessenger`] object. fn get_om( &self, @@ -113,29 +105,20 @@ impl< L: Logger, NL: NodeIdLookUp, MR: MessageRouter, - OMH: Deref, - APH: Deref, - DRH: Deref, - CMH: Deref, + OMH: OffersMessageHandler, + APH: AsyncPaymentsMessageHandler, + DRH: DNSResolverMessageHandler, + CMH: CustomOnionMessageHandler, > AOnionMessenger for OnionMessenger -where - OMH::Target: OffersMessageHandler, - APH::Target: AsyncPaymentsMessageHandler, - DRH::Target: DNSResolverMessageHandler, - CMH::Target: CustomOnionMessageHandler, { type EntropySource = ES; type NodeSigner = NS; type Logger = L; type NL = NL; type MessageRouter = MR; - type OffersMessageHandler = OMH::Target; type OMH = OMH; - type AsyncPaymentsMessageHandler = APH::Target; type APH = APH; - type DNSResolverMessageHandler = DRH::Target; type DRH = DRH; - type CustomOnionMessageHandler = CMH::Target; type CMH = CMH; fn get_om(&self) -> &OnionMessenger { self @@ -269,16 +252,11 @@ pub struct OnionMessenger< L: Logger, NL: NodeIdLookUp, MR: MessageRouter, - OMH: Deref, - APH: Deref, - DRH: Deref, - CMH: Deref, -> where - OMH::Target: OffersMessageHandler, - APH::Target: AsyncPaymentsMessageHandler, - DRH::Target: DNSResolverMessageHandler, - CMH::Target: CustomOnionMessageHandler, -{ + OMH: OffersMessageHandler, + APH: AsyncPaymentsMessageHandler, + DRH: DNSResolverMessageHandler, + CMH: CustomOnionMessageHandler, +> { entropy_source: ES, #[cfg(test)] pub(super) node_signer: NS, @@ -1007,6 +985,25 @@ pub trait CustomOnionMessageHandler { ) -> Vec<(Self::CustomMessage, MessageSendInstructions)>; } +impl> CustomOnionMessageHandler for C { + type CustomMessage = T::CustomMessage; + fn handle_custom_message( + &self, message: Self::CustomMessage, context: Option>, responder: Option, + ) -> Option<(Self::CustomMessage, ResponseInstruction)> { + self.deref().handle_custom_message(message, context, responder) + } + fn read_custom_message( + &self, message_type: u64, buffer: &mut R, + ) -> Result, msgs::DecodeError> { + self.deref().read_custom_message(message_type, buffer) + } + fn release_pending_custom_messages( + &self, + ) -> Vec<(Self::CustomMessage, MessageSendInstructions)> { + self.deref().release_pending_custom_messages() + } +} + /// A processed incoming onion message, containing either a Forward (another onion message) /// or a Receive payload with decrypted contents. #[derive(Clone, Debug)] @@ -1144,13 +1141,10 @@ pub fn create_onion_message< /// /// Returns either the next layer of the onion for forwarding or the decrypted content for the /// receiver. -pub fn peel_onion_message( +pub fn peel_onion_message( msg: &OnionMessage, secp_ctx: &Secp256k1, node_signer: NS, logger: L, custom_handler: CMH, -) -> Result::Target as CustomOnionMessageHandler>::CustomMessage>, ()> -where - CMH::Target: CustomOnionMessageHandler, -{ +) -> Result, ()> { let control_tlvs_ss = match node_signer.ecdh(Recipient::Node, &msg.blinding_point, None) { Ok(ss) => ss, Err(e) => { @@ -1179,7 +1173,7 @@ where onion_decode_ss, &msg.onion_routing_packet.hop_data[..], msg.onion_routing_packet.hmac, - (control_tlvs_ss, custom_handler.deref(), receiving_context_auth_key, &logger), + (control_tlvs_ss, &custom_handler, receiving_context_auth_key, &logger), ); // Constructs the next onion message using packet data and blinding logic. @@ -1370,16 +1364,11 @@ impl< L: Logger, NL: NodeIdLookUp, MR: MessageRouter, - OMH: Deref, - APH: Deref, - DRH: Deref, - CMH: Deref, + OMH: OffersMessageHandler, + APH: AsyncPaymentsMessageHandler, + DRH: DNSResolverMessageHandler, + CMH: CustomOnionMessageHandler, > OnionMessenger -where - OMH::Target: OffersMessageHandler, - APH::Target: AsyncPaymentsMessageHandler, - DRH::Target: DNSResolverMessageHandler, - CMH::Target: CustomOnionMessageHandler, { /// Constructs a new `OnionMessenger` to send, forward, and delegate received onion messages to /// their respective handlers. @@ -1770,13 +1759,13 @@ where pub(crate) fn peel_onion_message( &self, msg: &OnionMessage, - ) -> Result::Target as CustomOnionMessageHandler>::CustomMessage>, ()> { + ) -> Result, ()> { peel_onion_message( msg, &self.secp_ctx, &self.node_signer, &self.logger, - &*self.custom_handler, + &self.custom_handler, ) } @@ -2009,16 +1998,11 @@ impl< L: Logger, NL: NodeIdLookUp, MR: MessageRouter, - OMH: Deref, - APH: Deref, - DRH: Deref, - CMH: Deref, + OMH: OffersMessageHandler, + APH: AsyncPaymentsMessageHandler, + DRH: DNSResolverMessageHandler, + CMH: CustomOnionMessageHandler, > EventsProvider for OnionMessenger -where - OMH::Target: OffersMessageHandler, - APH::Target: AsyncPaymentsMessageHandler, - DRH::Target: DNSResolverMessageHandler, - CMH::Target: CustomOnionMessageHandler, { fn process_pending_events(&self, handler: H) where @@ -2125,16 +2109,11 @@ impl< L: Logger, NL: NodeIdLookUp, MR: MessageRouter, - OMH: Deref, - APH: Deref, - DRH: Deref, - CMH: Deref, + OMH: OffersMessageHandler, + APH: AsyncPaymentsMessageHandler, + DRH: DNSResolverMessageHandler, + CMH: CustomOnionMessageHandler, > BaseMessageHandler for OnionMessenger -where - OMH::Target: OffersMessageHandler, - APH::Target: AsyncPaymentsMessageHandler, - DRH::Target: DNSResolverMessageHandler, - CMH::Target: CustomOnionMessageHandler, { fn provided_node_features(&self) -> NodeFeatures { let mut features = NodeFeatures::empty(); @@ -2192,16 +2171,11 @@ impl< L: Logger, NL: NodeIdLookUp, MR: MessageRouter, - OMH: Deref, - APH: Deref, - DRH: Deref, - CMH: Deref, + OMH: OffersMessageHandler, + APH: AsyncPaymentsMessageHandler, + DRH: DNSResolverMessageHandler, + CMH: CustomOnionMessageHandler, > OnionMessageHandler for OnionMessenger -where - OMH::Target: OffersMessageHandler, - APH::Target: AsyncPaymentsMessageHandler, - DRH::Target: DNSResolverMessageHandler, - CMH::Target: CustomOnionMessageHandler, { fn handle_onion_message(&self, peer_node_id: PublicKey, msg: &OnionMessage) { let logger = WithContext::from(&self.logger, Some(peer_node_id), None, None); diff --git a/lightning/src/onion_message/offers.rs b/lightning/src/onion_message/offers.rs index 06988d4db8f..8e3afdfa977 100644 --- a/lightning/src/onion_message/offers.rs +++ b/lightning/src/onion_message/offers.rs @@ -22,6 +22,7 @@ use crate::onion_message::packet::OnionMessageContents; use crate::util::logger::Logger; use crate::util::ser::{Readable, ReadableArgs, Writeable, Writer}; use core::fmt; +use core::ops::Deref; use crate::prelude::*; @@ -63,6 +64,17 @@ pub trait OffersMessageHandler { } } +impl> OffersMessageHandler for O { + fn handle_message( + &self, message: OffersMessage, context: Option, responder: Option, + ) -> Option<(OffersMessage, ResponseInstruction)> { + self.deref().handle_message(message, context, responder) + } + fn release_pending_messages(&self) -> Vec<(OffersMessage, MessageSendInstructions)> { + self.deref().release_pending_messages() + } +} + /// Possible BOLT 12 Offers messages sent and received via an [`OnionMessage`]. /// /// [`OnionMessage`]: crate::ln::msgs::OnionMessage From cf7352ed09905d763841fd53aea8621264ef888e Mon Sep 17 00:00:00 2001 From: Valentine Wallace Date: Fri, 16 Jan 2026 20:33:09 -0500 Subject: [PATCH 14/17] Drop Deref indirection for chain::Filter Reduces generics and verbosity across the codebase, should provide equivalent behavior. Co-Authored-By: Claude Opus 4.5 --- lightning-background-processor/src/lib.rs | 11 +--- lightning-liquidity/src/lsps1/service.rs | 9 +-- lightning-liquidity/src/manager.rs | 58 ++++++------------- lightning/src/chain/chainmonitor.rs | 29 ++++------ lightning/src/chain/channelmonitor.rs | 4 +- lightning/src/chain/mod.rs | 10 ++++ lightning/src/util/anchor_channel_reserves.rs | 5 +- lightning/src/util/sweep.rs | 30 ++++------ 8 files changed, 57 insertions(+), 99 deletions(-) diff --git a/lightning-background-processor/src/lib.rs b/lightning-background-processor/src/lib.rs index 4c41a2c67be..905782cf2d5 100644 --- a/lightning-background-processor/src/lib.rs +++ b/lightning-background-processor/src/lib.rs @@ -467,7 +467,6 @@ pub const NO_LIQUIDITY_MANAGER: Option< NodeSigner = &(dyn lightning::sign::NodeSigner + Send + Sync), AChannelManager = DynChannelManager, CM = &DynChannelManager, - Filter = dyn chain::Filter + Send + Sync, C = &(dyn chain::Filter + Send + Sync), K = &DummyKVStore, TimeProvider = dyn lightning_liquidity::utils::time::TimeProvider + Send + Sync, @@ -490,7 +489,6 @@ pub const NO_LIQUIDITY_MANAGER_SYNC: Option< NodeSigner = &(dyn lightning::sign::NodeSigner + Send + Sync), AChannelManager = DynChannelManager, CM = &DynChannelManager, - Filter = dyn chain::Filter + Send + Sync, C = &(dyn chain::Filter + Send + Sync), KVStoreSync = dyn lightning::util::persist::KVStoreSync + Send + Sync, KS = &(dyn lightning::util::persist::KVStoreSync + Send + Sync), @@ -931,7 +929,7 @@ use futures_util::{dummy_waker, Joiner, OptionalSelector, Selector, SelectorOutp pub async fn process_events_async< 'a, UL: Deref, - CF: Deref, + CF: chain::Filter, T: BroadcasterInterface, F: FeeEstimator, G: Deref>, @@ -964,7 +962,6 @@ pub async fn process_events_async< ) -> Result<(), lightning::io::Error> where UL::Target: UtxoLookup, - CF::Target: chain::Filter, P::Target: Persist<::Signer>, CM::Target: AChannelManager, OM::Target: AOnionMessenger, @@ -1427,7 +1424,7 @@ fn check_and_reset_sleeper< /// synchronous background persistence. pub async fn process_events_async_with_kv_store_sync< UL: Deref, - CF: Deref, + CF: chain::Filter, T: BroadcasterInterface, F: FeeEstimator, G: Deref>, @@ -1460,7 +1457,6 @@ pub async fn process_events_async_with_kv_store_sync< ) -> Result<(), lightning::io::Error> where UL::Target: UtxoLookup, - CF::Target: chain::Filter, P::Target: Persist<::Signer>, CM::Target: AChannelManager, OM::Target: AOnionMessenger, @@ -1537,7 +1533,7 @@ impl BackgroundProcessor { pub fn start< 'a, UL: 'static + Deref, - CF: 'static + Deref, + CF: 'static + chain::Filter, T: 'static + BroadcasterInterface, F: 'static + FeeEstimator + Send, G: 'static + Deref>, @@ -1570,7 +1566,6 @@ impl BackgroundProcessor { ) -> Self where UL::Target: 'static + UtxoLookup, - CF::Target: 'static + chain::Filter, L::Target: 'static + Logger, P::Target: 'static + Persist<::Signer>, CM::Target: AChannelManager, diff --git a/lightning-liquidity/src/lsps1/service.rs b/lightning-liquidity/src/lsps1/service.rs index 154c6f5d527..d7010652c37 100644 --- a/lightning-liquidity/src/lsps1/service.rs +++ b/lightning-liquidity/src/lsps1/service.rs @@ -132,10 +132,9 @@ impl PeerState { } /// The main object allowing to send and receive bLIP-51 / LSPS1 messages. -pub struct LSPS1ServiceHandler +pub struct LSPS1ServiceHandler where CM::Target: AChannelManager, - C::Target: Filter, { entropy_source: ES, channel_manager: CM, @@ -146,11 +145,10 @@ where config: LSPS1ServiceConfig, } -impl +impl LSPS1ServiceHandler where CM::Target: AChannelManager, - C::Target: Filter, { /// Constructs a `LSPS1ServiceHandler`. pub(crate) fn new( @@ -417,11 +415,10 @@ where } } -impl LSPSProtocolMessageHandler +impl LSPSProtocolMessageHandler for LSPS1ServiceHandler where CM::Target: AChannelManager, - C::Target: Filter, { type ProtocolMessage = LSPS1Message; const PROTOCOL_NUMBER: Option = Some(1); diff --git a/lightning-liquidity/src/manager.rs b/lightning-liquidity/src/manager.rs index c3e9fa48cca..1f11fc8add7 100644 --- a/lightning-liquidity/src/manager.rs +++ b/lightning-liquidity/src/manager.rs @@ -112,9 +112,7 @@ pub trait ALiquidityManager { /// A type that may be dereferenced to [`Self::AChannelManager`]. type CM: Deref + Clone; /// A type implementing [`Filter`]. - type Filter: Filter + ?Sized; - /// A type that may be dereferenced to [`Self::Filter`]. - type C: Deref + Clone; + type C: Filter + Clone; /// A type implementing [`KVStore`]. type K: KVStore + Clone; /// A type implementing [`TimeProvider`]. @@ -141,21 +139,19 @@ impl< ES: EntropySource + Clone, NS: NodeSigner + Clone, CM: Deref + Clone, - C: Deref + Clone, + C: Filter + Clone, K: KVStore + Clone, TP: Deref + Clone, T: BroadcasterInterface + Clone, > ALiquidityManager for LiquidityManager where CM::Target: AChannelManager, - C::Target: Filter, TP::Target: TimeProvider, { type EntropySource = ES; type NodeSigner = NS; type AChannelManager = CM::Target; type CM = CM; - type Filter = C::Target; type C = C; type K = K; type TimeProvider = TP::Target; @@ -180,9 +176,7 @@ pub trait ALiquidityManagerSync { /// A type that may be dereferenced to [`Self::AChannelManager`]. type CM: Deref + Clone; /// A type implementing [`Filter`]. - type Filter: Filter + ?Sized; - /// A type that may be dereferenced to [`Self::Filter`]. - type C: Deref + Clone; + type C: Filter + Clone; /// A type implementing [`KVStoreSync`]. type KVStoreSync: KVStoreSync + ?Sized; /// A type that may be dereferenced to [`Self::KVStoreSync`]. @@ -224,14 +218,13 @@ impl< ES: EntropySource + Clone, NS: NodeSigner + Clone, CM: Deref + Clone, - C: Deref + Clone, + C: Filter + Clone, KS: Deref + Clone, TP: Deref + Clone, T: BroadcasterInterface + Clone, > ALiquidityManagerSync for LiquidityManagerSync where CM::Target: AChannelManager, - C::Target: Filter, KS::Target: KVStoreSync, TP::Target: TimeProvider, { @@ -239,7 +232,6 @@ where type NodeSigner = NS; type AChannelManager = CM::Target; type CM = CM; - type Filter = C::Target; type C = C; type KVStoreSync = KS::Target; type KS = KS; @@ -289,13 +281,12 @@ pub struct LiquidityManager< ES: EntropySource + Clone, NS: NodeSigner + Clone, CM: Deref + Clone, - C: Deref + Clone, + C: Filter + Clone, K: KVStore + Clone, TP: Deref + Clone, T: BroadcasterInterface + Clone, > where CM::Target: AChannelManager, - C::Target: Filter, TP::Target: TimeProvider, { pending_messages: Arc, @@ -324,13 +315,12 @@ impl< ES: EntropySource + Clone, NS: NodeSigner + Clone, CM: Deref + Clone, - C: Deref + Clone, + C: Filter + Clone, K: KVStore + Clone, T: BroadcasterInterface + Clone, > LiquidityManager where CM::Target: AChannelManager, - C::Target: Filter, { /// Constructor for the [`LiquidityManager`] using the default system clock /// @@ -361,14 +351,13 @@ impl< ES: EntropySource + Clone, NS: NodeSigner + Clone, CM: Deref + Clone, - C: Deref + Clone, + C: Filter + Clone, K: KVStore + Clone, TP: Deref + Clone, T: BroadcasterInterface + Clone, > LiquidityManager where CM::Target: AChannelManager, - C::Target: Filter, TP::Target: TimeProvider, { /// Constructor for the [`LiquidityManager`] with a custom time provider. @@ -784,14 +773,13 @@ impl< ES: EntropySource + Clone, NS: NodeSigner + Clone, CM: Deref + Clone, - C: Deref + Clone, + C: Filter + Clone, K: KVStore + Clone, TP: Deref + Clone, T: BroadcasterInterface + Clone, > CustomMessageReader for LiquidityManager where CM::Target: AChannelManager, - C::Target: Filter, TP::Target: TimeProvider, { type CustomMessage = RawLSPSMessage; @@ -812,14 +800,13 @@ impl< ES: EntropySource + Clone, NS: NodeSigner + Clone, CM: Deref + Clone, - C: Deref + Clone, + C: Filter + Clone, K: KVStore + Clone, TP: Deref + Clone, T: BroadcasterInterface + Clone, > CustomMessageHandler for LiquidityManager where CM::Target: AChannelManager, - C::Target: Filter, TP::Target: TimeProvider, { fn handle_custom_message( @@ -942,14 +929,13 @@ impl< ES: EntropySource + Clone, NS: NodeSigner + Clone, CM: Deref + Clone, - C: Deref + Clone, + C: Filter + Clone, K: KVStore + Clone, TP: Deref + Clone, T: BroadcasterInterface + Clone, > Listen for LiquidityManager where CM::Target: AChannelManager, - C::Target: Filter, TP::Target: TimeProvider, { fn filtered_block_connected( @@ -984,14 +970,13 @@ impl< ES: EntropySource + Clone, NS: NodeSigner + Clone, CM: Deref + Clone, - C: Deref + Clone, + C: Filter + Clone, K: KVStore + Clone, TP: Deref + Clone, T: BroadcasterInterface + Clone, > Confirm for LiquidityManager where CM::Target: AChannelManager, - C::Target: Filter, TP::Target: TimeProvider, { fn transactions_confirmed( @@ -1026,13 +1011,12 @@ pub struct LiquidityManagerSync< ES: EntropySource + Clone, NS: NodeSigner + Clone, CM: Deref + Clone, - C: Deref + Clone, + C: Filter + Clone, KS: Deref + Clone, TP: Deref + Clone, T: BroadcasterInterface + Clone, > where CM::Target: AChannelManager, - C::Target: Filter, KS::Target: KVStoreSync, TP::Target: TimeProvider, { @@ -1044,14 +1028,13 @@ impl< ES: EntropySource + Clone, NS: NodeSigner + Clone, CM: Deref + Clone, - C: Deref + Clone, + C: Filter + Clone, KS: Deref + Clone, T: BroadcasterInterface + Clone, > LiquidityManagerSync where CM::Target: AChannelManager, KS::Target: KVStoreSync, - C::Target: Filter, { /// Constructor for the [`LiquidityManagerSync`] using the default system clock /// @@ -1093,14 +1076,13 @@ impl< ES: EntropySource + Clone, NS: NodeSigner + Clone, CM: Deref + Clone, - C: Deref + Clone, + C: Filter + Clone, KS: Deref + Clone, TP: Deref + Clone, T: BroadcasterInterface + Clone, > LiquidityManagerSync where CM::Target: AChannelManager, - C::Target: Filter, KS::Target: KVStoreSync, TP::Target: TimeProvider, { @@ -1260,14 +1242,13 @@ impl< ES: EntropySource + Clone, NS: NodeSigner + Clone, CM: Deref + Clone, - C: Deref + Clone, + C: Filter + Clone, KS: Deref + Clone, TP: Deref + Clone, T: BroadcasterInterface + Clone, > CustomMessageReader for LiquidityManagerSync where CM::Target: AChannelManager, - C::Target: Filter, KS::Target: KVStoreSync, TP::Target: TimeProvider, { @@ -1284,14 +1265,13 @@ impl< ES: EntropySource + Clone, NS: NodeSigner + Clone, CM: Deref + Clone, - C: Deref + Clone, + C: Filter + Clone, KS: Deref + Clone, TP: Deref + Clone, T: BroadcasterInterface + Clone, > CustomMessageHandler for LiquidityManagerSync where CM::Target: AChannelManager, - C::Target: Filter, KS::Target: KVStoreSync, TP::Target: TimeProvider, { @@ -1328,14 +1308,13 @@ impl< ES: EntropySource + Clone, NS: NodeSigner + Clone, CM: Deref + Clone, - C: Deref + Clone, + C: Filter + Clone, KS: Deref + Clone, TP: Deref + Clone, T: BroadcasterInterface + Clone, > Listen for LiquidityManagerSync where CM::Target: AChannelManager, - C::Target: Filter, KS::Target: KVStoreSync, TP::Target: TimeProvider, { @@ -1355,14 +1334,13 @@ impl< ES: EntropySource + Clone, NS: NodeSigner + Clone, CM: Deref + Clone, - C: Deref + Clone, + C: Filter + Clone, KS: Deref + Clone, TP: Deref + Clone, T: BroadcasterInterface + Clone, > Confirm for LiquidityManagerSync where CM::Target: AChannelManager, - C::Target: Filter, KS::Target: KVStoreSync, TP::Target: TimeProvider, { diff --git a/lightning/src/chain/chainmonitor.rs b/lightning/src/chain/chainmonitor.rs index 536a1f942b0..2db34738737 100644 --- a/lightning/src/chain/chainmonitor.rs +++ b/lightning/src/chain/chainmonitor.rs @@ -37,7 +37,7 @@ use crate::chain::channelmonitor::{ WithChannelMonitor, }; use crate::chain::transaction::{OutPoint, TransactionData}; -use crate::chain::{BestBlock, ChannelMonitorUpdateStatus, Filter, WatchedOutput}; +use crate::chain::{BestBlock, ChannelMonitorUpdateStatus, WatchedOutput}; use crate::events::{self, Event, EventHandler, ReplayEvent}; use crate::ln::channel_state::ChannelDetails; #[cfg(peer_storage)] @@ -340,14 +340,13 @@ where /// [`rebroadcast_pending_claims`]: Self::rebroadcast_pending_claims pub struct ChainMonitor< ChannelSigner: EcdsaChannelSigner, - C: Deref, + C: chain::Filter, T: BroadcasterInterface, F: FeeEstimator, L: Logger, P: Deref, ES: EntropySource, > where - C::Target: chain::Filter, P::Target: Persist, { monitors: RwLock>>, @@ -378,14 +377,13 @@ impl< K: KVStore + MaybeSend + MaybeSync + 'static, S: FutureSpawner, SP: SignerProvider + MaybeSend + MaybeSync + 'static, - C: Deref, + C: chain::Filter, T: BroadcasterInterface + MaybeSend + MaybeSync + 'static, F: FeeEstimator + MaybeSend + MaybeSync + 'static, L: Logger + MaybeSend + MaybeSync + 'static, ES: EntropySource + MaybeSend + MaybeSync + 'static, > ChainMonitor, ES> where - C::Target: chain::Filter, SP::EcdsaSigner: MaybeSend + 'static, { /// Creates a new `ChainMonitor` used to watch on-chain activity pertaining to channels. @@ -422,7 +420,7 @@ where impl< ChannelSigner: EcdsaChannelSigner, - C: Deref, + C: chain::Filter, T: BroadcasterInterface, F: FeeEstimator, L: Logger, @@ -430,7 +428,6 @@ impl< ES: EntropySource, > ChainMonitor where - C::Target: chain::Filter, P::Target: Persist, { /// Dispatches to per-channel monitors, which are responsible for updating their on-chain view @@ -1065,7 +1062,7 @@ where impl< ChannelSigner: EcdsaChannelSigner, - C: Deref, + C: chain::Filter, T: BroadcasterInterface, F: FeeEstimator, L: Logger, @@ -1073,7 +1070,6 @@ impl< ES: EntropySource, > BaseMessageHandler for ChainMonitor where - C::Target: chain::Filter, P::Target: Persist, { fn get_and_clear_pending_msg_events(&self) -> Vec { @@ -1100,7 +1096,7 @@ where impl< ChannelSigner: EcdsaChannelSigner, - C: Deref, + C: chain::Filter, T: BroadcasterInterface, F: FeeEstimator, L: Logger, @@ -1108,14 +1104,13 @@ impl< ES: EntropySource, > SendOnlyMessageHandler for ChainMonitor where - C::Target: chain::Filter, P::Target: Persist, { } impl< ChannelSigner: EcdsaChannelSigner, - C: Deref, + C: chain::Filter, T: BroadcasterInterface, F: FeeEstimator, L: Logger, @@ -1123,7 +1118,6 @@ impl< ES: EntropySource, > chain::Listen for ChainMonitor where - C::Target: chain::Filter, P::Target: Persist, { fn filtered_block_connected(&self, header: &Header, txdata: &TransactionData, height: u32) { @@ -1175,7 +1169,7 @@ where impl< ChannelSigner: EcdsaChannelSigner, - C: Deref, + C: chain::Filter, T: BroadcasterInterface, F: FeeEstimator, L: Logger, @@ -1183,7 +1177,6 @@ impl< ES: EntropySource, > chain::Confirm for ChainMonitor where - C::Target: chain::Filter, P::Target: Persist, { fn transactions_confirmed(&self, header: &Header, txdata: &TransactionData, height: u32) { @@ -1266,7 +1259,7 @@ where impl< ChannelSigner: EcdsaChannelSigner, - C: Deref, + C: chain::Filter, T: BroadcasterInterface, F: FeeEstimator, L: Logger, @@ -1274,7 +1267,6 @@ impl< ES: EntropySource, > chain::Watch for ChainMonitor where - C::Target: chain::Filter, P::Target: Persist, { fn watch_channel( @@ -1458,7 +1450,7 @@ where impl< ChannelSigner: EcdsaChannelSigner, - C: Deref, + C: chain::Filter, T: BroadcasterInterface, F: FeeEstimator, L: Logger, @@ -1466,7 +1458,6 @@ impl< ES: EntropySource, > events::EventsProvider for ChainMonitor where - C::Target: chain::Filter, P::Target: Persist, { /// Processes [`SpendableOutputs`] events produced from each [`ChannelMonitor`] upon maturity. diff --git a/lightning/src/chain/channelmonitor.rs b/lightning/src/chain/channelmonitor.rs index f6d54c958d6..59cc5835df7 100644 --- a/lightning/src/chain/channelmonitor.rs +++ b/lightning/src/chain/channelmonitor.rs @@ -42,7 +42,6 @@ use crate::chain::package::{ HolderHTLCOutput, PackageSolvingData, PackageTemplate, RevokedHTLCOutput, RevokedOutput, }; use crate::chain::transaction::{OutPoint, TransactionData}; -use crate::chain::Filter; use crate::chain::{BestBlock, WatchedOutput}; use crate::events::bump_transaction::{AnchorDescriptor, BumpTransactionEvent}; use crate::events::{ClosureReason, Event, EventHandler, ReplayEvent}; @@ -2140,8 +2139,7 @@ impl ChannelMonitor { /// calling `chain::Filter::register_output` and `chain::Filter::register_tx` until all outputs /// have been registered. #[rustfmt::skip] - pub fn load_outputs_to_watch(&self, filter: &F, logger: &L) - where F::Target: chain::Filter { + pub fn load_outputs_to_watch(&self, filter: &F, logger: &L) { let lock = self.inner.lock().unwrap(); let logger = WithChannelMonitor::from_impl(logger, &*lock, None); for funding in core::iter::once(&lock.funding).chain(&lock.pending_funding) { diff --git a/lightning/src/chain/mod.rs b/lightning/src/chain/mod.rs index 9f5c9653f65..e8baa7aad1f 100644 --- a/lightning/src/chain/mod.rs +++ b/lightning/src/chain/mod.rs @@ -412,6 +412,16 @@ pub trait Filter { fn register_output(&self, output: WatchedOutput); } +impl> Filter for F { + fn register_tx(&self, txid: &Txid, script_pubkey: &Script) { + self.deref().register_tx(txid, script_pubkey) + } + + fn register_output(&self, output: WatchedOutput) { + self.deref().register_output(output) + } +} + /// A transaction output watched by a [`ChannelMonitor`] for spends on-chain. /// /// Used to convey to a [`Filter`] such an output with a given spending condition. Any transaction diff --git a/lightning/src/util/anchor_channel_reserves.rs b/lightning/src/util/anchor_channel_reserves.rs index 3e9945f7b87..8026af03d58 100644 --- a/lightning/src/util/anchor_channel_reserves.rs +++ b/lightning/src/util/anchor_channel_reserves.rs @@ -272,20 +272,19 @@ pub fn get_supportable_anchor_channels( pub fn can_support_additional_anchor_channel< AChannelManagerRef: Deref, ChannelSigner: EcdsaChannelSigner, - FilterRef: Deref, + FI: Filter, B: BroadcasterInterface, FE: FeeEstimator, L: Logger, PersistRef: Deref, ES: EntropySource, - ChainMonitorRef: Deref>, + ChainMonitorRef: Deref>, >( context: &AnchorChannelReserveContext, utxos: &[Utxo], a_channel_manager: AChannelManagerRef, chain_monitor: ChainMonitorRef, ) -> bool where AChannelManagerRef::Target: AChannelManager, - FilterRef::Target: Filter, PersistRef::Target: Persist, { let mut anchor_channels = new_hash_set(); diff --git a/lightning/src/util/sweep.rs b/lightning/src/util/sweep.rs index 2d22244cb17..e69b3a9f3a8 100644 --- a/lightning/src/util/sweep.rs +++ b/lightning/src/util/sweep.rs @@ -341,13 +341,12 @@ pub struct OutputSweeper< B: BroadcasterInterface, D: Deref, E: FeeEstimator, - F: Deref, + F: Filter, K: KVStore, L: Logger, O: Deref, > where D::Target: ChangeDestinationSource, - F::Target: Filter, O::Target: OutputSpender, { sweeper_state: Mutex, @@ -365,14 +364,13 @@ impl< B: BroadcasterInterface, D: Deref, E: FeeEstimator, - F: Deref, + F: Filter, K: KVStore, L: Logger, O: Deref, > OutputSweeper where D::Target: ChangeDestinationSource, - F::Target: Filter, O::Target: OutputSpender, { /// Constructs a new [`OutputSweeper`]. @@ -720,14 +718,13 @@ impl< B: BroadcasterInterface, D: Deref, E: FeeEstimator, - F: Deref, + F: Filter + Sync + Send, K: KVStore, L: Logger, O: Deref, > Listen for OutputSweeper where D::Target: ChangeDestinationSource, - F::Target: Filter + Sync + Send, O::Target: OutputSpender, { fn filtered_block_connected( @@ -764,14 +761,13 @@ impl< B: BroadcasterInterface, D: Deref, E: FeeEstimator, - F: Deref, + F: Filter + Sync + Send, K: KVStore, L: Logger, O: Deref, > Confirm for OutputSweeper where D::Target: ChangeDestinationSource, - F::Target: Filter + Sync + Send, O::Target: OutputSpender, { fn transactions_confirmed( @@ -864,14 +860,13 @@ impl< B: BroadcasterInterface, D: Deref, E: FeeEstimator, - F: Deref, + F: Filter + Sync + Send, K: KVStore, L: Logger, O: Deref, > ReadableArgs<(B, E, Option, O, D, K, L)> for (BestBlock, OutputSweeper) where D::Target: ChangeDestinationSource, - F::Target: Filter + Sync + Send, O::Target: OutputSpender, { #[inline] @@ -937,13 +932,12 @@ pub struct OutputSweeperSync< B: BroadcasterInterface, D: Deref, E: FeeEstimator, - F: Deref, + F: Filter, K: Deref, L: Logger, O: Deref, > where D::Target: ChangeDestinationSourceSync, - F::Target: Filter, K::Target: KVStoreSync, O::Target: OutputSpender, { @@ -955,14 +949,13 @@ impl< B: BroadcasterInterface, D: Deref, E: FeeEstimator, - F: Deref, + F: Filter, K: Deref, L: Logger, O: Deref, > OutputSweeperSync where D::Target: ChangeDestinationSourceSync, - F::Target: Filter, K::Target: KVStoreSync, O::Target: OutputSpender, { @@ -1079,14 +1072,13 @@ impl< B: BroadcasterInterface, D: Deref, E: FeeEstimator, - F: Deref, + F: Filter + Sync + Send, K: Deref, L: Logger, O: Deref, > Listen for OutputSweeperSync where D::Target: ChangeDestinationSourceSync, - F::Target: Filter + Sync + Send, K::Target: KVStoreSync, O::Target: OutputSpender, { @@ -1105,14 +1097,13 @@ impl< B: BroadcasterInterface, D: Deref, E: FeeEstimator, - F: Deref, + F: Filter + Sync + Send, K: Deref, L: Logger, O: Deref, > Confirm for OutputSweeperSync where D::Target: ChangeDestinationSourceSync, - F::Target: Filter + Sync + Send, K::Target: KVStoreSync, O::Target: OutputSpender, { @@ -1139,7 +1130,7 @@ impl< B: BroadcasterInterface, D: Deref, E: FeeEstimator, - F: Deref, + F: Filter + Sync + Send, K: Deref, L: Logger, O: Deref, @@ -1147,7 +1138,6 @@ impl< for (BestBlock, OutputSweeperSync) where D::Target: ChangeDestinationSourceSync, - F::Target: Filter + Sync + Send, K::Target: KVStoreSync, O::Target: OutputSpender, { From 6d286784cd3d0a3607c3331ea1cdccd41fc39811 Mon Sep 17 00:00:00 2001 From: Valentine Wallace Date: Tue, 20 Jan 2026 10:42:27 -0500 Subject: [PATCH 15/17] Drop Deref indirection for OutputSpender Reduces generics and verbosity across the codebase, should provide equivalent behavior. Co-Authored-By: Claude Opus 4.5 --- lightning-background-processor/src/lib.rs | 9 +++---- lightning/src/sign/mod.rs | 17 +++++++++++++ lightning/src/util/sweep.rs | 30 ++++++++--------------- 3 files changed, 30 insertions(+), 26 deletions(-) diff --git a/lightning-background-processor/src/lib.rs b/lightning-background-processor/src/lib.rs index 905782cf2d5..d765ccac77f 100644 --- a/lightning-background-processor/src/lib.rs +++ b/lightning-background-processor/src/lib.rs @@ -946,7 +946,7 @@ pub async fn process_events_async< PM: Deref, LM: Deref, D: Deref, - O: Deref, + O: OutputSpender, K: KVStore, OS: Deref>, S: Deref, @@ -967,7 +967,6 @@ where OM::Target: AOnionMessenger, PM::Target: APeerManager, LM::Target: ALiquidityManager, - O::Target: OutputSpender, D::Target: ChangeDestinationSource, { let async_event_handler = |event| { @@ -1441,7 +1440,7 @@ pub async fn process_events_async_with_kv_store_sync< PM: Deref, LM: Deref, D: Deref, - O: Deref, + O: OutputSpender, K: Deref, OS: Deref>, S: Deref, @@ -1462,7 +1461,6 @@ where OM::Target: AOnionMessenger, PM::Target: APeerManager, LM::Target: ALiquidityManager, - O::Target: OutputSpender, D::Target: ChangeDestinationSourceSync, K::Target: KVStoreSync, { @@ -1556,7 +1554,7 @@ impl BackgroundProcessor { S: 'static + Deref + Send + Sync, SC: for<'b> WriteableScore<'b>, D: 'static + Deref, - O: 'static + Deref, + O: 'static + OutputSpender, K: 'static + Deref + Send, OS: 'static + Deref> + Send, >( @@ -1573,7 +1571,6 @@ impl BackgroundProcessor { PM::Target: APeerManager, LM::Target: ALiquidityManagerSync, D::Target: ChangeDestinationSourceSync, - O::Target: 'static + OutputSpender, K::Target: 'static + KVStoreSync, { let stop_thread = Arc::new(AtomicBool::new(false)); diff --git a/lightning/src/sign/mod.rs b/lightning/src/sign/mod.rs index b05f11b35a9..9926b69c099 100644 --- a/lightning/src/sign/mod.rs +++ b/lightning/src/sign/mod.rs @@ -1056,6 +1056,23 @@ pub trait OutputSpender { ) -> Result; } +impl> OutputSpender for O { + fn spend_spendable_outputs( + &self, descriptors: &[&SpendableOutputDescriptor], outputs: Vec, + change_destination_script: ScriptBuf, feerate_sat_per_1000_weight: u32, + locktime: Option, secp_ctx: &Secp256k1, + ) -> Result { + self.deref().spend_spendable_outputs( + descriptors, + outputs, + change_destination_script, + feerate_sat_per_1000_weight, + locktime, + secp_ctx, + ) + } +} + // Primarily needed in doctests because of https://github.com/rust-lang/rust/issues/67295 /// A dynamic [`SignerProvider`] temporarily needed for doc tests. /// diff --git a/lightning/src/util/sweep.rs b/lightning/src/util/sweep.rs index e69b3a9f3a8..2aef2186323 100644 --- a/lightning/src/util/sweep.rs +++ b/lightning/src/util/sweep.rs @@ -344,10 +344,9 @@ pub struct OutputSweeper< F: Filter, K: KVStore, L: Logger, - O: Deref, + O: OutputSpender, > where D::Target: ChangeDestinationSource, - O::Target: OutputSpender, { sweeper_state: Mutex, pending_sweep: AtomicBool, @@ -367,11 +366,10 @@ impl< F: Filter, K: KVStore, L: Logger, - O: Deref, + O: OutputSpender, > OutputSweeper where D::Target: ChangeDestinationSource, - O::Target: OutputSpender, { /// Constructs a new [`OutputSweeper`]. /// @@ -721,11 +719,10 @@ impl< F: Filter + Sync + Send, K: KVStore, L: Logger, - O: Deref, + O: OutputSpender, > Listen for OutputSweeper where D::Target: ChangeDestinationSource, - O::Target: OutputSpender, { fn filtered_block_connected( &self, header: &Header, txdata: &chain::transaction::TransactionData, height: u32, @@ -764,11 +761,10 @@ impl< F: Filter + Sync + Send, K: KVStore, L: Logger, - O: Deref, + O: OutputSpender, > Confirm for OutputSweeper where D::Target: ChangeDestinationSource, - O::Target: OutputSpender, { fn transactions_confirmed( &self, header: &Header, txdata: &chain::transaction::TransactionData, height: u32, @@ -863,11 +859,10 @@ impl< F: Filter + Sync + Send, K: KVStore, L: Logger, - O: Deref, + O: OutputSpender, > ReadableArgs<(B, E, Option, O, D, K, L)> for (BestBlock, OutputSweeper) where D::Target: ChangeDestinationSource, - O::Target: OutputSpender, { #[inline] fn read( @@ -935,11 +930,10 @@ pub struct OutputSweeperSync< F: Filter, K: Deref, L: Logger, - O: Deref, + O: OutputSpender, > where D::Target: ChangeDestinationSourceSync, K::Target: KVStoreSync, - O::Target: OutputSpender, { sweeper: OutputSweeper, E, F, KVStoreSyncWrapper, L, O>, @@ -952,12 +946,11 @@ impl< F: Filter, K: Deref, L: Logger, - O: Deref, + O: OutputSpender, > OutputSweeperSync where D::Target: ChangeDestinationSourceSync, K::Target: KVStoreSync, - O::Target: OutputSpender, { /// Constructs a new [`OutputSweeperSync`] instance. /// @@ -1075,12 +1068,11 @@ impl< F: Filter + Sync + Send, K: Deref, L: Logger, - O: Deref, + O: OutputSpender, > Listen for OutputSweeperSync where D::Target: ChangeDestinationSourceSync, K::Target: KVStoreSync, - O::Target: OutputSpender, { fn filtered_block_connected( &self, header: &Header, txdata: &chain::transaction::TransactionData, height: u32, @@ -1100,12 +1092,11 @@ impl< F: Filter + Sync + Send, K: Deref, L: Logger, - O: Deref, + O: OutputSpender, > Confirm for OutputSweeperSync where D::Target: ChangeDestinationSourceSync, K::Target: KVStoreSync, - O::Target: OutputSpender, { fn transactions_confirmed( &self, header: &Header, txdata: &chain::transaction::TransactionData, height: u32, @@ -1133,13 +1124,12 @@ impl< F: Filter + Sync + Send, K: Deref, L: Logger, - O: Deref, + O: OutputSpender, > ReadableArgs<(B, E, Option, O, D, K, L)> for (BestBlock, OutputSweeperSync) where D::Target: ChangeDestinationSourceSync, K::Target: KVStoreSync, - O::Target: OutputSpender, { #[inline] fn read( From 580696e730c4a9dd074e7a07e04f91661a4baa22 Mon Sep 17 00:00:00 2001 From: Valentine Wallace Date: Tue, 20 Jan 2026 11:22:03 -0500 Subject: [PATCH 16/17] Drop Deref indirection for UtxoLookup Reduces generics and verbosity across the codebase, should provide equivalent behavior. Co-Authored-By: Claude Opus 4.5 --- lightning-background-processor/src/lib.rs | 23 ++++-------- lightning-block-sync/src/gossip.rs | 10 ----- lightning/src/routing/gossip.rs | 46 ++++++----------------- lightning/src/routing/utxo.rs | 13 ++++++- 4 files changed, 30 insertions(+), 62 deletions(-) diff --git a/lightning-background-processor/src/lib.rs b/lightning-background-processor/src/lib.rs index d765ccac77f..3bd39504aab 100644 --- a/lightning-background-processor/src/lib.rs +++ b/lightning-background-processor/src/lib.rs @@ -200,11 +200,9 @@ pub enum GossipSync< P: Deref>, R: Deref>, G: Deref>, - U: Deref, + U: UtxoLookup, L: Logger, -> where - U::Target: UtxoLookup, -{ +> { /// Gossip sync via the lightning peer-to-peer network as defined by BOLT 7. P2P(P), /// Rapid gossip sync from a trusted server. @@ -217,11 +215,9 @@ impl< P: Deref>, R: Deref>, G: Deref>, - U: Deref, + U: UtxoLookup, L: Logger, > GossipSync -where - U::Target: UtxoLookup, { fn network_graph(&self) -> Option<&G> { match self { @@ -258,11 +254,9 @@ where impl< P: Deref>, G: Deref>, - U: Deref, + U: UtxoLookup, L: Logger, > GossipSync, G, U, L> -where - U::Target: UtxoLookup, { /// Initializes a new [`GossipSync::P2P`] variant. pub fn p2p(gossip_sync: P) -> Self { @@ -928,7 +922,7 @@ use futures_util::{dummy_waker, Joiner, OptionalSelector, Selector, SelectorOutp ///``` pub async fn process_events_async< 'a, - UL: Deref, + UL: UtxoLookup, CF: chain::Filter, T: BroadcasterInterface, F: FeeEstimator, @@ -961,7 +955,6 @@ pub async fn process_events_async< sleeper: Sleeper, mobile_interruptable_platform: bool, fetch_time: FetchTime, ) -> Result<(), lightning::io::Error> where - UL::Target: UtxoLookup, P::Target: Persist<::Signer>, CM::Target: AChannelManager, OM::Target: AOnionMessenger, @@ -1422,7 +1415,7 @@ fn check_and_reset_sleeper< /// Async events processor that is based on [`process_events_async`] but allows for [`KVStoreSync`] to be used for /// synchronous background persistence. pub async fn process_events_async_with_kv_store_sync< - UL: Deref, + UL: UtxoLookup, CF: chain::Filter, T: BroadcasterInterface, F: FeeEstimator, @@ -1455,7 +1448,6 @@ pub async fn process_events_async_with_kv_store_sync< sleeper: Sleeper, mobile_interruptable_platform: bool, fetch_time: FetchTime, ) -> Result<(), lightning::io::Error> where - UL::Target: UtxoLookup, P::Target: Persist<::Signer>, CM::Target: AChannelManager, OM::Target: AOnionMessenger, @@ -1530,7 +1522,7 @@ impl BackgroundProcessor { /// [`NetworkGraph::write`]: lightning::routing::gossip::NetworkGraph#impl-Writeable pub fn start< 'a, - UL: 'static + Deref, + UL: 'static + UtxoLookup, CF: 'static + chain::Filter, T: 'static + BroadcasterInterface, F: 'static + FeeEstimator + Send, @@ -1563,7 +1555,6 @@ impl BackgroundProcessor { liquidity_manager: Option, sweeper: Option, logger: L, scorer: Option, ) -> Self where - UL::Target: 'static + UtxoLookup, L::Target: 'static + Logger, P::Target: 'static + Persist<::Signer>, CM::Target: AChannelManager, diff --git a/lightning-block-sync/src/gossip.rs b/lightning-block-sync/src/gossip.rs index 263fa4027ff..477e2785782 100644 --- a/lightning-block-sync/src/gossip.rs +++ b/lightning-block-sync/src/gossip.rs @@ -239,16 +239,6 @@ where } } -impl Deref for GossipVerifier -where - Blocks::Target: UtxoSource, -{ - type Target = Self; - fn deref(&self) -> &Self { - self - } -} - impl UtxoLookup for GossipVerifier where Blocks::Target: UtxoSource, diff --git a/lightning/src/routing/gossip.rs b/lightning/src/routing/gossip.rs index 2dcce844b2b..401a8f50364 100644 --- a/lightning/src/routing/gossip.rs +++ b/lightning/src/routing/gossip.rs @@ -319,10 +319,7 @@ impl MaybeReadable for NetworkUpdate { /// This network graph is then used for routing payments. /// Provides interface to help with initial routing sync by /// serving historical announcements. -pub struct P2PGossipSync>, U: Deref, L: Logger> -where - U::Target: UtxoLookup, -{ +pub struct P2PGossipSync>, U: UtxoLookup, L: Logger> { network_graph: G, #[cfg(any(feature = "_test_utils", test))] pub(super) utxo_lookup: Option, @@ -333,10 +330,7 @@ where logger: L, } -impl>, U: Deref, L: Logger> P2PGossipSync -where - U::Target: UtxoLookup, -{ +impl>, U: UtxoLookup, L: Logger> P2PGossipSync { /// Creates a new tracker of the actual state of the network of channels and nodes, /// assuming an existing [`NetworkGraph`]. /// @@ -534,10 +528,8 @@ pub fn verify_channel_announcement( Ok(()) } -impl>, U: Deref, L: Logger> RoutingMessageHandler +impl>, U: UtxoLookup, L: Logger> RoutingMessageHandler for P2PGossipSync -where - U::Target: UtxoLookup, { fn handle_node_announcement( &self, _their_node_id: Option, msg: &msgs::NodeAnnouncement, @@ -761,10 +753,8 @@ where } } -impl>, U: Deref, L: Logger> BaseMessageHandler +impl>, U: UtxoLookup, L: Logger> BaseMessageHandler for P2PGossipSync -where - U::Target: UtxoLookup, { /// Initiates a stateless sync of routing gossip information with a peer /// using [`gossip_queries`]. The default strategy used by this implementation @@ -1951,12 +1941,9 @@ impl NetworkGraph { /// /// If a [`UtxoLookup`] object is provided via `utxo_lookup`, it will be called to verify /// the corresponding UTXO exists on chain and is correctly-formatted. - pub fn update_channel_from_announcement( + pub fn update_channel_from_announcement( &self, msg: &msgs::ChannelAnnouncement, utxo_lookup: &Option, - ) -> Result<(), LightningError> - where - U::Target: UtxoLookup, - { + ) -> Result<(), LightningError> { self.pre_channel_announcement_validation_check(&msg.contents, utxo_lookup)?; verify_channel_announcement(msg, &self.secp_ctx)?; self.update_channel_from_unsigned_announcement_intern(&msg.contents, Some(msg), utxo_lookup) @@ -1981,12 +1968,9 @@ impl NetworkGraph { /// /// If a [`UtxoLookup`] object is provided via `utxo_lookup`, it will be called to verify /// the corresponding UTXO exists on chain and is correctly-formatted. - pub fn update_channel_from_unsigned_announcement( + pub fn update_channel_from_unsigned_announcement( &self, msg: &msgs::UnsignedChannelAnnouncement, utxo_lookup: &Option, - ) -> Result<(), LightningError> - where - U::Target: UtxoLookup, - { + ) -> Result<(), LightningError> { self.pre_channel_announcement_validation_check(&msg, utxo_lookup)?; self.update_channel_from_unsigned_announcement_intern(msg, None, utxo_lookup) } @@ -2105,12 +2089,9 @@ impl NetworkGraph { /// /// In those cases, this will return an `Err` that we can return immediately. Otherwise it will /// return an `Ok(())`. - fn pre_channel_announcement_validation_check( + fn pre_channel_announcement_validation_check( &self, msg: &msgs::UnsignedChannelAnnouncement, utxo_lookup: &Option, - ) -> Result<(), LightningError> - where - U::Target: UtxoLookup, - { + ) -> Result<(), LightningError> { let channels = self.channels.read().unwrap(); if let Some(chan) = channels.get(&msg.short_channel_id) { @@ -2149,13 +2130,10 @@ impl NetworkGraph { /// /// Generally [`Self::pre_channel_announcement_validation_check`] should have been called /// first. - fn update_channel_from_unsigned_announcement_intern( + fn update_channel_from_unsigned_announcement_intern( &self, msg: &msgs::UnsignedChannelAnnouncement, full_msg: Option<&msgs::ChannelAnnouncement>, utxo_lookup: &Option, - ) -> Result<(), LightningError> - where - U::Target: UtxoLookup, - { + ) -> Result<(), LightningError> { if msg.node_id_1 == msg.node_id_2 || msg.bitcoin_key_1 == msg.bitcoin_key_2 { return Err(LightningError { err: "Channel announcement node had a channel with itself".to_owned(), diff --git a/lightning/src/routing/utxo.rs b/lightning/src/routing/utxo.rs index 31f4de5dee0..89a4ddd18e7 100644 --- a/lightning/src/routing/utxo.rs +++ b/lightning/src/routing/utxo.rs @@ -75,6 +75,15 @@ pub trait UtxoLookup { ) -> UtxoResult; } +impl> UtxoLookup for U { + fn get_utxo( + &self, chain_hash: &ChainHash, short_channel_id: u64, + async_completion_notifier: Arc, + ) -> UtxoResult { + self.deref().get_utxo(chain_hash, short_channel_id, async_completion_notifier) + } +} + enum ChannelAnnouncement { Full(msgs::ChannelAnnouncement), Unsigned(msgs::UnsignedChannelAnnouncement), @@ -332,10 +341,10 @@ impl PendingChecks { } #[rustfmt::skip] - pub(super) fn check_channel_announcement(&self, + pub(super) fn check_channel_announcement(&self, utxo_lookup: &Option, msg: &msgs::UnsignedChannelAnnouncement, full_msg: Option<&msgs::ChannelAnnouncement> - ) -> Result, msgs::LightningError> where U::Target: UtxoLookup { + ) -> Result, msgs::LightningError> { let handle_result = |res| { match res { Ok(TxOut { value, script_pubkey }) => { From db87b32de60ce102e2cbed72cf18123f94813db2 Mon Sep 17 00:00:00 2001 From: Valentine Wallace Date: Tue, 20 Jan 2026 11:41:43 -0500 Subject: [PATCH 17/17] Drop Deref indirection for UtxoSource Reduces generics and verbosity across the codebase, should provide equivalent behavior. Co-Authored-By: Claude Opus 4.5 --- lightning-block-sync/src/gossip.rs | 29 +++++++++++++++++------------ lightning-block-sync/src/init.rs | 24 ++++++++---------------- lightning-block-sync/src/lib.rs | 20 ++++++++++++++++++++ lightning-block-sync/src/poll.rs | 9 +++------ 4 files changed, 48 insertions(+), 34 deletions(-) diff --git a/lightning-block-sync/src/gossip.rs b/lightning-block-sync/src/gossip.rs index 477e2785782..b4f58fe20d0 100644 --- a/lightning-block-sync/src/gossip.rs +++ b/lightning-block-sync/src/gossip.rs @@ -42,6 +42,20 @@ pub trait UtxoSource: BlockSource + 'static { ) -> impl Future> + Send + 'a; } +impl + Send + Sync + 'static> UtxoSource for U { + fn get_block_hash_by_height<'a>( + &'a self, block_height: u32, + ) -> impl Future> + Send + 'a { + self.deref().get_block_hash_by_height(block_height) + } + + fn is_output_unspent<'a>( + &'a self, outpoint: OutPoint, + ) -> impl Future> + Send + 'a { + self.deref().is_output_unspent(outpoint) + } +} + #[cfg(feature = "tokio")] /// A trivial [`FutureSpawner`] which delegates to `tokio::spawn`. pub struct TokioSpawner; @@ -129,10 +143,7 @@ impl< /// value of 1024 should more than suffice), and ensure you have sufficient file descriptors /// available on both Bitcoin Core and your LDK application for each request to hold its own /// connection. -pub struct GossipVerifier -where - Blocks::Target: UtxoSource, -{ +pub struct GossipVerifier { source: Blocks, spawn: S, block_cache: Arc>>, @@ -140,10 +151,7 @@ where const BLOCK_CACHE_SIZE: usize = 5; -impl GossipVerifier -where - Blocks::Target: UtxoSource, -{ +impl GossipVerifier { /// Constructs a new [`GossipVerifier`] for use in a [`P2PGossipSync`]. /// /// [`P2PGossipSync`]: lightning::routing::gossip::P2PGossipSync @@ -239,10 +247,7 @@ where } } -impl UtxoLookup for GossipVerifier -where - Blocks::Target: UtxoSource, -{ +impl UtxoLookup for GossipVerifier { fn get_utxo(&self, _chain_hash: &ChainHash, scid: u64, notifier: Arc) -> UtxoResult { let res = UtxoFuture::new(notifier); let fut = res.clone(); diff --git a/lightning-block-sync/src/init.rs b/lightning-block-sync/src/init.rs index a870f8ca88c..844d3cd216f 100644 --- a/lightning-block-sync/src/init.rs +++ b/lightning-block-sync/src/init.rs @@ -11,20 +11,15 @@ use bitcoin::network::Network; use lightning::chain; use lightning::chain::BestBlock; -use std::ops::Deref; - /// Returns a validated block header of the source's best chain tip. /// /// Upon success, the returned header can be used to initialize [`SpvClient`]. Useful during a fresh /// start when there are no chain listeners to sync yet. /// /// [`SpvClient`]: crate::SpvClient -pub async fn validate_best_block_header( - block_source: B, -) -> BlockSourceResult -where - B::Target: BlockSource, -{ +pub async fn validate_best_block_header( + block_source: &B, +) -> BlockSourceResult { let (best_block_hash, best_block_height) = block_source.get_best_block().await?; block_source.get_header(&best_block_hash, best_block_height).await?.validate(best_block_hash) } @@ -64,7 +59,7 @@ where /// use lightning::io::Cursor; /// /// async fn init_sync< -/// B: BlockSource, +/// B: BlockSource + 'static, /// ES: EntropySource, /// NS: NodeSigner, /// SP: SignerProvider, @@ -139,17 +134,14 @@ where /// [`ChannelManager`]: lightning::ln::channelmanager::ChannelManager /// [`ChannelMonitor`]: lightning::chain::channelmonitor::ChannelMonitor pub async fn synchronize_listeners< - B: Deref + Sized + Send + Sync, + B: BlockSource + 'static, C: Cache, L: chain::Listen + ?Sized, >( - block_source: B, network: Network, header_cache: &mut C, + block_source: &B, network: Network, header_cache: &mut C, mut chain_listeners: Vec<(BlockHash, &L)>, -) -> BlockSourceResult -where - B::Target: BlockSource, -{ - let best_header = validate_best_block_header(&*block_source).await?; +) -> BlockSourceResult { + let best_header = validate_best_block_header(block_source).await?; // Fetch the header for the block hash paired with each listener. let mut chain_listeners_with_old_headers = Vec::new(); diff --git a/lightning-block-sync/src/lib.rs b/lightning-block-sync/src/lib.rs index 02593047658..cdb0f003c94 100644 --- a/lightning-block-sync/src/lib.rs +++ b/lightning-block-sync/src/lib.rs @@ -83,6 +83,26 @@ pub trait BlockSource: Sync + Send { ) -> impl Future)>> + Send + 'a; } +impl + Sync + Send> BlockSource for B { + fn get_header<'a>( + &'a self, header_hash: &'a BlockHash, height_hint: Option, + ) -> impl Future> + Send + 'a { + self.deref().get_header(header_hash, height_hint) + } + + fn get_block<'a>( + &'a self, header_hash: &'a BlockHash, + ) -> impl Future> + Send + 'a { + self.deref().get_block(header_hash) + } + + fn get_best_block<'a>( + &'a self, + ) -> impl Future)>> + Send + 'a { + self.deref().get_best_block() + } +} + /// Result type for `BlockSource` requests. pub type BlockSourceResult = Result; diff --git a/lightning-block-sync/src/poll.rs b/lightning-block-sync/src/poll.rs index 13e0403c3b6..b8bc071acb3 100644 --- a/lightning-block-sync/src/poll.rs +++ b/lightning-block-sync/src/poll.rs @@ -7,7 +7,6 @@ use bitcoin::network::Network; use lightning::chain::BestBlock; use std::future::Future; -use std::ops::Deref; /// The `Poll` trait defines behavior for polling block sources for a chain tip and retrieving /// related chain data. It serves as an adapter for `BlockSource`. @@ -195,12 +194,12 @@ mod sealed { /// /// Other `Poll` implementations should be built using `ChainPoller` as it provides the simplest way /// of validating chain data and checking consistency. -pub struct ChainPoller + Sized + Send + Sync, T: BlockSource + ?Sized> { +pub struct ChainPoller { block_source: B, network: Network, } -impl + Sized + Send + Sync, T: BlockSource + ?Sized> ChainPoller { +impl ChainPoller { /// Creates a new poller for the given block source. /// /// If the `network` parameter is mainnet, then the difficulty between blocks is checked for @@ -210,9 +209,7 @@ impl + Sized + Send + Sync, T: BlockSource + ?Sized> ChainP } } -impl + Sized + Send + Sync, T: BlockSource + ?Sized> Poll - for ChainPoller -{ +impl Poll for ChainPoller { fn poll_chain_tip<'a>( &'a self, best_known_chain_tip: ValidatedBlockHeader, ) -> impl Future> + Send + 'a {