From c9768d610e63a462f0681e2a8e6a4ea1794cc1f8 Mon Sep 17 00:00:00 2001 From: Alexander Shevtsov Date: Tue, 13 Oct 2026 21:48:02 +0200 Subject: [PATCH] Move `ChainListener` from `chain::bitcoind` to `chain` `ChainListener` fans out LDK's `Listen` callbacks to the on-chain wallet, `ChannelManager`, `ChainMonitor` and `OutputSweeper`. It is not specific to the bitcoind backend, so any other block-driven chain source needs the same type. Move it, unchanged, next to `ChainSource` in `chain/mod.rs` so that other chain sources can reuse it without reaching into the bitcoind module. It stays gated on `chain-bitcoind`, its only user for now. No functional change. Co-authored-by: febyeji --- src/chain/bitcoind.rs | 59 +--------------------------------------- src/chain/mod.rs | 62 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 58 deletions(-) diff --git a/src/chain/bitcoind.rs b/src/chain/bitcoind.rs index 9ed38c2128..c5dcb6e446 100644 --- a/src/chain/bitcoind.rs +++ b/src/chain/bitcoind.rs @@ -31,7 +31,7 @@ use lightning_block_sync::{ }; use serde::Serialize; -use super::{WalletSyncGuard, WalletSyncStatus}; +use super::{ChainListener, WalletSyncGuard, WalletSyncStatus}; use crate::config::{ BitcoindRestClientConfig, Config, DEFAULT_FEE_RATE_CACHE_UPDATE_TIMEOUT_SECS, DEFAULT_TX_BROADCAST_TIMEOUT_SECS, @@ -1534,63 +1534,6 @@ pub(crate) enum FeeRateEstimationMode { Conservative, } -pub(crate) struct ChainListener { - pub(crate) onchain_wallet: std::sync::Weak, - pub(crate) channel_manager: std::sync::Weak, - pub(crate) chain_monitor: std::sync::Weak, - pub(crate) output_sweeper: std::sync::Weak, -} - -impl ChainListener { - fn upgrade( - &self, - ) -> Option<(Arc, Arc, Arc, Arc)> { - Some(( - self.onchain_wallet.upgrade()?, - self.channel_manager.upgrade()?, - self.chain_monitor.upgrade()?, - self.output_sweeper.upgrade()?, - )) - } -} - -impl Listen for ChainListener { - fn filtered_block_connected( - &self, header: &bitcoin::block::Header, - txdata: &lightning::chain::transaction::TransactionData, height: u32, - ) { - if let Some((onchain_wallet, channel_manager, chain_monitor, output_sweeper)) = - self.upgrade() - { - onchain_wallet.filtered_block_connected(header, txdata, height); - channel_manager.filtered_block_connected(header, txdata, height); - chain_monitor.filtered_block_connected(header, txdata, height); - output_sweeper.filtered_block_connected(header, txdata, height); - } - } - fn block_connected(&self, block: &bitcoin::Block, height: u32) { - if let Some((onchain_wallet, channel_manager, chain_monitor, output_sweeper)) = - self.upgrade() - { - onchain_wallet.block_connected(block, height); - channel_manager.block_connected(block, height); - chain_monitor.block_connected(block, height); - output_sweeper.block_connected(block, height); - } - } - - fn blocks_disconnected(&self, fork_point_block: lightning::chain::BlockLocator) { - if let Some((onchain_wallet, channel_manager, chain_monitor, output_sweeper)) = - self.upgrade() - { - onchain_wallet.blocks_disconnected(fork_point_block); - channel_manager.blocks_disconnected(fork_point_block); - chain_monitor.blocks_disconnected(fork_point_block); - output_sweeper.blocks_disconnected(fork_point_block); - } - } -} - pub(crate) fn rpc_credentials(rpc_user: String, rpc_password: String) -> String { BASE64_STANDARD.encode(format!("{}:{}", rpc_user, rpc_password)) } diff --git a/src/chain/mod.rs b/src/chain/mod.rs index f01c1c8cb8..0d058ced59 100644 --- a/src/chain/mod.rs +++ b/src/chain/mod.rs @@ -19,6 +19,8 @@ use std::sync::{Arc, Mutex}; use std::time::Duration; use bitcoin::{Script, Txid}; +#[cfg(feature = "chain-bitcoind")] +use lightning::chain::Listen; use lightning::chain::{BlockLocator, Filter}; #[cfg(feature = "chain-bitcoind")] @@ -159,6 +161,66 @@ enum ChainSourceKind { Bitcoind(BitcoindChainSource), } +#[cfg(feature = "chain-bitcoind")] +pub(crate) struct ChainListener { + pub(crate) onchain_wallet: std::sync::Weak, + pub(crate) channel_manager: std::sync::Weak, + pub(crate) chain_monitor: std::sync::Weak, + pub(crate) output_sweeper: std::sync::Weak, +} + +#[cfg(feature = "chain-bitcoind")] +impl ChainListener { + fn upgrade( + &self, + ) -> Option<(Arc, Arc, Arc, Arc)> { + Some(( + self.onchain_wallet.upgrade()?, + self.channel_manager.upgrade()?, + self.chain_monitor.upgrade()?, + self.output_sweeper.upgrade()?, + )) + } +} + +#[cfg(feature = "chain-bitcoind")] +impl Listen for ChainListener { + fn filtered_block_connected( + &self, header: &bitcoin::block::Header, + txdata: &lightning::chain::transaction::TransactionData, height: u32, + ) { + if let Some((onchain_wallet, channel_manager, chain_monitor, output_sweeper)) = + self.upgrade() + { + onchain_wallet.filtered_block_connected(header, txdata, height); + channel_manager.filtered_block_connected(header, txdata, height); + chain_monitor.filtered_block_connected(header, txdata, height); + output_sweeper.filtered_block_connected(header, txdata, height); + } + } + fn block_connected(&self, block: &bitcoin::Block, height: u32) { + if let Some((onchain_wallet, channel_manager, chain_monitor, output_sweeper)) = + self.upgrade() + { + onchain_wallet.block_connected(block, height); + channel_manager.block_connected(block, height); + chain_monitor.block_connected(block, height); + output_sweeper.block_connected(block, height); + } + } + + fn blocks_disconnected(&self, fork_point_block: lightning::chain::BlockLocator) { + if let Some((onchain_wallet, channel_manager, chain_monitor, output_sweeper)) = + self.upgrade() + { + onchain_wallet.blocks_disconnected(fork_point_block); + channel_manager.blocks_disconnected(fork_point_block); + chain_monitor.blocks_disconnected(fork_point_block); + output_sweeper.blocks_disconnected(fork_point_block); + } + } +} + impl ChainSource { #[cfg(feature = "chain-esplora")] pub(crate) fn new_esplora(