Skip to content

Commit 8f1f556

Browse files
committed
Integrate OutputSweeper with EventHandler
1 parent a1aa52c commit 8f1f556

File tree

4 files changed

+49
-46
lines changed

4 files changed

+49
-46
lines changed

src/builder.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use crate::io::sqlite_store::SqliteStore;
55
use crate::logger::{log_error, FilesystemLogger, Logger};
66
use crate::payment_store::PaymentStore;
77
use crate::peer_store::PeerStore;
8+
use crate::sweep::OutputSweeper;
89
use crate::tx_broadcaster::TransactionBroadcaster;
910
use crate::types::{
1011
ChainMonitor, ChannelManager, FakeMessageRouter, GossipSync, KeysManager, NetworkGraph,
@@ -771,6 +772,25 @@ fn build_with_store_internal<K: KVStore + Sync + Send + 'static>(
771772
}
772773
};
773774

775+
let best_block = channel_manager.current_best_block();
776+
let output_sweeper =
777+
match io::utils::read_spendable_outputs(Arc::clone(&kv_store), Arc::clone(&logger)) {
778+
Ok(outputs) => Arc::new(OutputSweeper::new(
779+
outputs,
780+
Arc::clone(&wallet),
781+
Arc::clone(&tx_broadcaster),
782+
Arc::clone(&wallet),
783+
Arc::clone(&keys_manager),
784+
Arc::clone(&kv_store),
785+
best_block,
786+
Some(Arc::clone(&tx_sync)),
787+
Arc::clone(&logger),
788+
)),
789+
Err(_) => {
790+
return Err(BuildError::ReadFailed);
791+
}
792+
};
793+
774794
let (stop_sender, stop_receiver) = tokio::sync::watch::channel(());
775795

776796
Ok(Node {
@@ -784,6 +804,7 @@ fn build_with_store_internal<K: KVStore + Sync + Send + 'static>(
784804
event_queue,
785805
channel_manager,
786806
chain_monitor,
807+
output_sweeper,
787808
peer_manager,
788809
keys_manager,
789810
network_graph,

src/event.rs

Lines changed: 11 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
use crate::types::{Broadcaster, Wallet};
2-
use crate::{hex_utils, ChannelManager, Config, Error, KeysManager, NetworkGraph, UserChannelId};
1+
use crate::types::{Sweeper, Wallet};
2+
use crate::{hex_utils, ChannelManager, Config, Error, NetworkGraph, UserChannelId};
33

44
use crate::payment_store::{
55
PaymentDetails, PaymentDetailsUpdate, PaymentDirection, PaymentStatus, PaymentStore,
@@ -9,9 +9,9 @@ use crate::io::{
99
EVENT_QUEUE_PERSISTENCE_KEY, EVENT_QUEUE_PERSISTENCE_PRIMARY_NAMESPACE,
1010
EVENT_QUEUE_PERSISTENCE_SECONDARY_NAMESPACE,
1111
};
12-
use crate::logger::{log_debug, log_error, log_info, Logger};
12+
use crate::logger::{log_error, log_info, Logger};
1313

14-
use lightning::chain::chaininterface::{BroadcasterInterface, ConfirmationTarget, FeeEstimator};
14+
use lightning::chain::chaininterface::ConfirmationTarget;
1515
use lightning::events::Event as LdkEvent;
1616
use lightning::events::PaymentPurpose;
1717
use lightning::impl_writeable_tlv_based_enum;
@@ -21,8 +21,8 @@ use lightning::util::errors::APIError;
2121
use lightning::util::persist::KVStore;
2222
use lightning::util::ser::{Readable, ReadableArgs, Writeable, Writer};
2323

24-
use bitcoin::secp256k1::{PublicKey, Secp256k1};
25-
use bitcoin::{LockTime, OutPoint, PackedLockTime};
24+
use bitcoin::secp256k1::PublicKey;
25+
use bitcoin::{LockTime, OutPoint};
2626
use rand::{thread_rng, Rng};
2727
use std::collections::VecDeque;
2828
use std::ops::Deref;
@@ -244,10 +244,9 @@ where
244244
event_queue: Arc<EventQueue<K, L>>,
245245
wallet: Arc<Wallet>,
246246
channel_manager: Arc<ChannelManager<K>>,
247-
tx_broadcaster: Arc<Broadcaster>,
248247
network_graph: Arc<NetworkGraph>,
249-
keys_manager: Arc<KeysManager>,
250248
payment_store: Arc<PaymentStore<K, L>>,
249+
output_sweeper: Arc<Sweeper<K>>,
251250
runtime: Arc<RwLock<Option<tokio::runtime::Runtime>>>,
252251
logger: L,
253252
config: Arc<Config>,
@@ -259,19 +258,17 @@ where
259258
{
260259
pub fn new(
261260
event_queue: Arc<EventQueue<K, L>>, wallet: Arc<Wallet>,
262-
channel_manager: Arc<ChannelManager<K>>, tx_broadcaster: Arc<Broadcaster>,
263-
network_graph: Arc<NetworkGraph>, keys_manager: Arc<KeysManager>,
264-
payment_store: Arc<PaymentStore<K, L>>,
261+
channel_manager: Arc<ChannelManager<K>>, network_graph: Arc<NetworkGraph>,
262+
payment_store: Arc<PaymentStore<K, L>>, output_sweeper: Arc<Sweeper<K>>,
265263
runtime: Arc<RwLock<Option<tokio::runtime::Runtime>>>, logger: L, config: Arc<Config>,
266264
) -> Self {
267265
Self {
268266
event_queue,
269267
wallet,
270268
channel_manager,
271-
tx_broadcaster,
272269
network_graph,
273-
keys_manager,
274270
payment_store,
271+
output_sweeper,
275272
logger,
276273
runtime,
277274
config,
@@ -576,36 +573,7 @@ where
576573
}
577574
}
578575
LdkEvent::SpendableOutputs { outputs, channel_id: _ } => {
579-
// TODO: We should eventually remember the outputs and supply them to the wallet's coin selection, once BDK allows us to do so.
580-
let destination_address = self.wallet.get_new_address().unwrap_or_else(|e| {
581-
log_error!(self.logger, "Failed to get destination address: {}", e);
582-
panic!("Failed to get destination address");
583-
});
584-
585-
let output_descriptors = &outputs.iter().collect::<Vec<_>>();
586-
let tx_feerate = self
587-
.wallet
588-
.get_est_sat_per_1000_weight(ConfirmationTarget::NonAnchorChannelFee);
589-
590-
// We set nLockTime to the current height to discourage fee sniping.
591-
let cur_height = self.channel_manager.current_best_block().height();
592-
let locktime: PackedLockTime =
593-
LockTime::from_height(cur_height).map_or(PackedLockTime::ZERO, |l| l.into());
594-
let res = self.keys_manager.spend_spendable_outputs(
595-
output_descriptors,
596-
Vec::new(),
597-
destination_address.script_pubkey(),
598-
tx_feerate,
599-
Some(locktime),
600-
&Secp256k1::new(),
601-
);
602-
603-
match res {
604-
Ok(spending_tx) => self.tx_broadcaster.broadcast_transactions(&[&spending_tx]),
605-
Err(err) => {
606-
log_error!(self.logger, "Error spending outputs: {:?}", err);
607-
}
608-
}
576+
self.output_sweeper.add_outputs(outputs)
609577
}
610578
LdkEvent::OpenChannelRequest {
611579
temporary_channel_id,

src/lib.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,8 @@ pub use payment_store::{PaymentDetails, PaymentDirection, PaymentStatus};
122122
use peer_store::{PeerInfo, PeerStore};
123123
use tx_broadcaster::TransactionBroadcaster;
124124
use types::{
125-
ChainMonitor, ChannelManager, KeysManager, NetworkGraph, PeerManager, Router, Scorer, Wallet,
125+
ChainMonitor, ChannelManager, KeysManager, NetworkGraph, PeerManager, Router, Scorer, Sweeper,
126+
Wallet,
126127
};
127128
pub use types::{ChannelDetails, PeerDetails, UserChannelId};
128129

@@ -294,6 +295,7 @@ pub struct Node<K: KVStore + Sync + Send + 'static> {
294295
event_queue: Arc<EventQueue<K, Arc<FilesystemLogger>>>,
295296
channel_manager: Arc<ChannelManager<K>>,
296297
chain_monitor: Arc<ChainMonitor<K>>,
298+
output_sweeper: Arc<Sweeper<K>>,
297299
peer_manager: Arc<PeerManager<K>>,
298300
keys_manager: Arc<KeysManager>,
299301
network_graph: Arc<NetworkGraph>,
@@ -417,6 +419,7 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
417419
let tx_sync = Arc::clone(&self.tx_sync);
418420
let sync_cman = Arc::clone(&self.channel_manager);
419421
let sync_cmon = Arc::clone(&self.chain_monitor);
422+
let sync_sweeper = Arc::clone(&self.output_sweeper);
420423
let sync_logger = Arc::clone(&self.logger);
421424
let mut stop_sync = self.stop_receiver.clone();
422425
let wallet_sync_interval_secs =
@@ -434,6 +437,7 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
434437
let confirmables = vec![
435438
&*sync_cman as &(dyn Confirm + Sync + Send),
436439
&*sync_cmon as &(dyn Confirm + Sync + Send),
440+
&*sync_sweeper as &(dyn Confirm + Sync + Send),
437441
];
438442
let now = Instant::now();
439443
match tx_sync.sync(confirmables).await {
@@ -673,10 +677,9 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
673677
Arc::clone(&self.event_queue),
674678
Arc::clone(&self.wallet),
675679
Arc::clone(&self.channel_manager),
676-
Arc::clone(&self.tx_broadcaster),
677680
Arc::clone(&self.network_graph),
678-
Arc::clone(&self.keys_manager),
679681
Arc::clone(&self.payment_store),
682+
Arc::clone(&self.output_sweeper),
680683
Arc::clone(&self.runtime),
681684
Arc::clone(&self.logger),
682685
Arc::clone(&self.config),
@@ -1012,10 +1015,12 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
10121015
let tx_sync = Arc::clone(&self.tx_sync);
10131016
let sync_cman = Arc::clone(&self.channel_manager);
10141017
let sync_cmon = Arc::clone(&self.chain_monitor);
1018+
let sync_sweeper = Arc::clone(&self.output_sweeper);
10151019
let sync_logger = Arc::clone(&self.logger);
10161020
let confirmables = vec![
10171021
&*sync_cman as &(dyn Confirm + Sync + Send),
10181022
&*sync_cmon as &(dyn Confirm + Sync + Send),
1023+
&*sync_sweeper as &(dyn Confirm + Sync + Send),
10191024
];
10201025

10211026
tokio::task::block_in_place(move || {

src/types.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use crate::logger::FilesystemLogger;
2+
use crate::sweep::OutputSweeper;
23

34
use lightning::chain::chainmonitor;
45
use lightning::ln::channelmanager::ChannelDetails as LdkChannelDetails;
@@ -111,6 +112,14 @@ impl lightning::onion_message::MessageRouter for FakeMessageRouter {
111112
}
112113
}
113114

115+
pub(crate) type Sweeper<K> = OutputSweeper<
116+
K,
117+
Arc<Broadcaster>,
118+
Arc<Wallet>,
119+
Arc<EsploraSyncClient<Arc<FilesystemLogger>>>,
120+
Arc<FilesystemLogger>,
121+
>;
122+
114123
/// A local, potentially user-provided, identifier of a channel.
115124
///
116125
/// By default, this will be randomly generated for the user to ensure local uniqueness.

0 commit comments

Comments
 (0)