Skip to content

Commit f890ef8

Browse files
committed
Integrate OutputSweeper with EventHandler
1 parent ec626d6 commit f890ef8

File tree

4 files changed

+48
-51
lines changed

4 files changed

+48
-51
lines changed

src/builder.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use crate::io::sqlite_store::SqliteStore;
66
use crate::logger::{log_error, FilesystemLogger, Logger};
77
use crate::payment_store::PaymentStore;
88
use crate::peer_store::PeerStore;
9+
use crate::sweep::OutputSweeper;
910
use crate::tx_broadcaster::TransactionBroadcaster;
1011
use crate::types::{
1112
ChainMonitor, ChannelManager, FakeMessageRouter, GossipSync, KeysManager, NetworkGraph,
@@ -777,6 +778,25 @@ fn build_with_store_internal<K: KVStore + Sync + Send + 'static>(
777778
}
778779
};
779780

781+
let best_block = channel_manager.current_best_block();
782+
let output_sweeper =
783+
match io::utils::read_spendable_outputs(Arc::clone(&kv_store), Arc::clone(&logger)) {
784+
Ok(outputs) => Arc::new(OutputSweeper::new(
785+
outputs,
786+
Arc::clone(&wallet),
787+
Arc::clone(&tx_broadcaster),
788+
Arc::clone(&fee_estimator),
789+
Arc::clone(&keys_manager),
790+
Arc::clone(&kv_store),
791+
best_block,
792+
Some(Arc::clone(&tx_sync)),
793+
Arc::clone(&logger),
794+
)),
795+
Err(_) => {
796+
return Err(BuildError::ReadFailed);
797+
}
798+
};
799+
780800
let (stop_sender, stop_receiver) = tokio::sync::watch::channel(());
781801

782802
Ok(Node {
@@ -791,6 +811,7 @@ fn build_with_store_internal<K: KVStore + Sync + Send + 'static>(
791811
event_queue,
792812
channel_manager,
793813
chain_monitor,
814+
output_sweeper,
794815
peer_manager,
795816
keys_manager,
796817
network_graph,

src/event.rs

Lines changed: 11 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
use crate::types::{Broadcaster, FeeEstimator, 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,11 +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::{
15-
BroadcasterInterface, ConfirmationTarget, FeeEstimator as LDKFeeEstimator,
16-
};
14+
use lightning::chain::chaininterface::ConfirmationTarget;
1715
use lightning::events::Event as LdkEvent;
1816
use lightning::events::PaymentPurpose;
1917
use lightning::impl_writeable_tlv_based_enum;
@@ -23,8 +21,8 @@ use lightning::util::errors::APIError;
2321
use lightning::util::persist::KVStore;
2422
use lightning::util::ser::{Readable, ReadableArgs, Writeable, Writer};
2523

26-
use bitcoin::secp256k1::{PublicKey, Secp256k1};
27-
use bitcoin::{LockTime, OutPoint, PackedLockTime};
24+
use bitcoin::secp256k1::PublicKey;
25+
use bitcoin::{LockTime, OutPoint};
2826
use rand::{thread_rng, Rng};
2927
use std::collections::VecDeque;
3028
use std::ops::Deref;
@@ -246,11 +244,9 @@ where
246244
event_queue: Arc<EventQueue<K, L>>,
247245
wallet: Arc<Wallet>,
248246
channel_manager: Arc<ChannelManager<K>>,
249-
tx_broadcaster: Arc<Broadcaster>,
250-
fee_estimator: Arc<FeeEstimator>,
251247
network_graph: Arc<NetworkGraph>,
252-
keys_manager: Arc<KeysManager>,
253248
payment_store: Arc<PaymentStore<K, L>>,
249+
output_sweeper: Arc<Sweeper<K>>,
254250
runtime: Arc<RwLock<Option<tokio::runtime::Runtime>>>,
255251
logger: L,
256252
config: Arc<Config>,
@@ -262,20 +258,17 @@ where
262258
{
263259
pub fn new(
264260
event_queue: Arc<EventQueue<K, L>>, wallet: Arc<Wallet>,
265-
channel_manager: Arc<ChannelManager<K>>, tx_broadcaster: Arc<Broadcaster>,
266-
fee_estimator: Arc<FeeEstimator>, network_graph: Arc<NetworkGraph>,
267-
keys_manager: Arc<KeysManager>, 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>>,
268263
runtime: Arc<RwLock<Option<tokio::runtime::Runtime>>>, logger: L, config: Arc<Config>,
269264
) -> Self {
270265
Self {
271266
event_queue,
272267
wallet,
273268
channel_manager,
274-
tx_broadcaster,
275-
fee_estimator,
276269
network_graph,
277-
keys_manager,
278270
payment_store,
271+
output_sweeper,
279272
logger,
280273
runtime,
281274
config,
@@ -580,36 +573,7 @@ where
580573
}
581574
}
582575
LdkEvent::SpendableOutputs { outputs, channel_id: _ } => {
583-
// TODO: We should eventually remember the outputs and supply them to the wallet's coin selection, once BDK allows us to do so.
584-
let destination_address = self.wallet.get_new_address().unwrap_or_else(|e| {
585-
log_error!(self.logger, "Failed to get destination address: {}", e);
586-
panic!("Failed to get destination address");
587-
});
588-
589-
let output_descriptors = &outputs.iter().collect::<Vec<_>>();
590-
let tx_feerate = self
591-
.fee_estimator
592-
.get_est_sat_per_1000_weight(ConfirmationTarget::NonAnchorChannelFee);
593-
594-
// We set nLockTime to the current height to discourage fee sniping.
595-
let cur_height = self.channel_manager.current_best_block().height();
596-
let locktime: PackedLockTime =
597-
LockTime::from_height(cur_height).map_or(PackedLockTime::ZERO, |l| l.into());
598-
let res = self.keys_manager.spend_spendable_outputs(
599-
output_descriptors,
600-
Vec::new(),
601-
destination_address.script_pubkey(),
602-
tx_feerate,
603-
Some(locktime),
604-
&Secp256k1::new(),
605-
);
606-
607-
match res {
608-
Ok(spending_tx) => self.tx_broadcaster.broadcast_transactions(&[&spending_tx]),
609-
Err(err) => {
610-
log_error!(self.logger, "Error spending outputs: {:?}", err);
611-
}
612-
}
576+
self.output_sweeper.add_outputs(outputs)
613577
}
614578
LdkEvent::OpenChannelRequest {
615579
temporary_channel_id,

src/lib.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ pub use payment_store::{PaymentDetails, PaymentDirection, PaymentStatus};
123123
use peer_store::{PeerInfo, PeerStore};
124124
use types::{
125125
Broadcaster, ChainMonitor, ChannelManager, FeeEstimator, KeysManager, NetworkGraph,
126-
PeerManager, Router, Scorer, Wallet,
126+
PeerManager, Router, Scorer, Sweeper, Wallet,
127127
};
128128
pub use types::{ChannelDetails, PeerDetails, UserChannelId};
129129

@@ -296,6 +296,7 @@ pub struct Node<K: KVStore + Sync + Send + 'static> {
296296
event_queue: Arc<EventQueue<K, Arc<FilesystemLogger>>>,
297297
channel_manager: Arc<ChannelManager<K>>,
298298
chain_monitor: Arc<ChainMonitor<K>>,
299+
output_sweeper: Arc<Sweeper<K>>,
299300
peer_manager: Arc<PeerManager<K>>,
300301
keys_manager: Arc<KeysManager>,
301302
network_graph: Arc<NetworkGraph>,
@@ -433,6 +434,7 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
433434
let tx_sync = Arc::clone(&self.tx_sync);
434435
let sync_cman = Arc::clone(&self.channel_manager);
435436
let sync_cmon = Arc::clone(&self.chain_monitor);
437+
let sync_sweeper = Arc::clone(&self.output_sweeper);
436438
let sync_logger = Arc::clone(&self.logger);
437439
let mut stop_sync = self.stop_receiver.clone();
438440
let wallet_sync_interval_secs =
@@ -450,6 +452,7 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
450452
let confirmables = vec![
451453
&*sync_cman as &(dyn Confirm + Sync + Send),
452454
&*sync_cmon as &(dyn Confirm + Sync + Send),
455+
&*sync_sweeper as &(dyn Confirm + Sync + Send),
453456
];
454457
let now = Instant::now();
455458
match tx_sync.sync(confirmables).await {
@@ -689,11 +692,9 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
689692
Arc::clone(&self.event_queue),
690693
Arc::clone(&self.wallet),
691694
Arc::clone(&self.channel_manager),
692-
Arc::clone(&self.tx_broadcaster),
693-
Arc::clone(&self.fee_estimator),
694695
Arc::clone(&self.network_graph),
695-
Arc::clone(&self.keys_manager),
696696
Arc::clone(&self.payment_store),
697+
Arc::clone(&self.output_sweeper),
697698
Arc::clone(&self.runtime),
698699
Arc::clone(&self.logger),
699700
Arc::clone(&self.config),
@@ -1029,10 +1030,12 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
10291030
let tx_sync = Arc::clone(&self.tx_sync);
10301031
let sync_cman = Arc::clone(&self.channel_manager);
10311032
let sync_cmon = Arc::clone(&self.chain_monitor);
1033+
let sync_sweeper = Arc::clone(&self.output_sweeper);
10321034
let sync_logger = Arc::clone(&self.logger);
10331035
let confirmables = vec![
10341036
&*sync_cman as &(dyn Confirm + Sync + Send),
10351037
&*sync_cmon as &(dyn Confirm + Sync + Send),
1038+
&*sync_sweeper as &(dyn Confirm + Sync + Send),
10361039
];
10371040

10381041
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;
@@ -118,6 +119,14 @@ impl lightning::onion_message::MessageRouter for FakeMessageRouter {
118119
}
119120
}
120121

122+
pub(crate) type Sweeper<K> = OutputSweeper<
123+
Arc<Broadcaster>,
124+
Arc<FeeEstimator>,
125+
Arc<EsploraSyncClient<Arc<FilesystemLogger>>>,
126+
Arc<K>,
127+
Arc<FilesystemLogger>,
128+
>;
129+
121130
/// A local, potentially user-provided, identifier of a channel.
122131
///
123132
/// By default, this will be randomly generated for the user to ensure local uniqueness.

0 commit comments

Comments
 (0)