Skip to content

Commit 0f31390

Browse files
committed
Integrate OutputSweeper with EventHandler
1 parent 6f7d616 commit 0f31390

File tree

4 files changed

+49
-53
lines changed

4 files changed

+49
-53
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: 12 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
use crate::types::{Broadcaster, FeeEstimator, Wallet};
1+
use crate::types::{Sweeper, Wallet};
22
use crate::{
3-
hex_utils, ChannelManager, Config, Error, KeysManager, NetworkGraph, PeerInfo, PeerStore,
4-
UserChannelId,
3+
hex_utils, ChannelManager, Config, Error, NetworkGraph, PeerInfo, PeerStore, UserChannelId,
54
};
65

76
use crate::payment_store::{
@@ -12,11 +11,9 @@ use crate::io::{
1211
EVENT_QUEUE_PERSISTENCE_KEY, EVENT_QUEUE_PERSISTENCE_PRIMARY_NAMESPACE,
1312
EVENT_QUEUE_PERSISTENCE_SECONDARY_NAMESPACE,
1413
};
15-
use crate::logger::{log_debug, log_error, log_info, Logger};
14+
use crate::logger::{log_error, log_info, Logger};
1615

17-
use lightning::chain::chaininterface::{
18-
BroadcasterInterface, ConfirmationTarget, FeeEstimator as LDKFeeEstimator,
19-
};
16+
use lightning::chain::chaininterface::ConfirmationTarget;
2017
use lightning::events::Event as LdkEvent;
2118
use lightning::events::PaymentPurpose;
2219
use lightning::impl_writeable_tlv_based_enum;
@@ -26,8 +23,8 @@ use lightning::util::errors::APIError;
2623
use lightning::util::persist::KVStore;
2724
use lightning::util::ser::{Readable, ReadableArgs, Writeable, Writer};
2825

29-
use bitcoin::secp256k1::{PublicKey, Secp256k1};
30-
use bitcoin::{LockTime, OutPoint, PackedLockTime};
26+
use bitcoin::secp256k1::PublicKey;
27+
use bitcoin::{LockTime, OutPoint};
3128
use rand::{thread_rng, Rng};
3229
use std::collections::VecDeque;
3330
use std::ops::Deref;
@@ -249,10 +246,8 @@ where
249246
event_queue: Arc<EventQueue<K, L>>,
250247
wallet: Arc<Wallet>,
251248
channel_manager: Arc<ChannelManager<K>>,
252-
tx_broadcaster: Arc<Broadcaster>,
253-
fee_estimator: Arc<FeeEstimator>,
249+
output_sweeper: Arc<Sweeper<K>>,
254250
network_graph: Arc<NetworkGraph>,
255-
keys_manager: Arc<KeysManager>,
256251
payment_store: Arc<PaymentStore<K, L>>,
257252
peer_store: Arc<PeerStore<K, L>>,
258253
runtime: Arc<RwLock<Option<tokio::runtime::Runtime>>>,
@@ -266,20 +261,17 @@ where
266261
{
267262
pub fn new(
268263
event_queue: Arc<EventQueue<K, L>>, wallet: Arc<Wallet>,
269-
channel_manager: Arc<ChannelManager<K>>, tx_broadcaster: Arc<Broadcaster>,
270-
fee_estimator: Arc<FeeEstimator>, network_graph: Arc<NetworkGraph>,
271-
keys_manager: Arc<KeysManager>, payment_store: Arc<PaymentStore<K, L>>,
264+
channel_manager: Arc<ChannelManager<K>>, output_sweeper: Arc<Sweeper<K>>,
265+
network_graph: Arc<NetworkGraph>, payment_store: Arc<PaymentStore<K, L>>,
272266
peer_store: Arc<PeerStore<K, L>>, runtime: Arc<RwLock<Option<tokio::runtime::Runtime>>>,
273267
logger: L, config: Arc<Config>,
274268
) -> Self {
275269
Self {
276270
event_queue,
277271
wallet,
278272
channel_manager,
279-
tx_broadcaster,
280-
fee_estimator,
273+
output_sweeper,
281274
network_graph,
282-
keys_manager,
283275
payment_store,
284276
peer_store,
285277
logger,
@@ -585,37 +577,8 @@ where
585577
});
586578
}
587579
}
588-
LdkEvent::SpendableOutputs { outputs, channel_id: _ } => {
589-
// TODO: We should eventually remember the outputs and supply them to the wallet's coin selection, once BDK allows us to do so.
590-
let destination_address = self.wallet.get_new_address().unwrap_or_else(|e| {
591-
log_error!(self.logger, "Failed to get destination address: {}", e);
592-
panic!("Failed to get destination address");
593-
});
594-
595-
let output_descriptors = &outputs.iter().collect::<Vec<_>>();
596-
let tx_feerate = self
597-
.fee_estimator
598-
.get_est_sat_per_1000_weight(ConfirmationTarget::NonAnchorChannelFee);
599-
600-
// We set nLockTime to the current height to discourage fee sniping.
601-
let cur_height = self.channel_manager.current_best_block().height();
602-
let locktime: PackedLockTime =
603-
LockTime::from_height(cur_height).map_or(PackedLockTime::ZERO, |l| l.into());
604-
let res = self.keys_manager.spend_spendable_outputs(
605-
output_descriptors,
606-
Vec::new(),
607-
destination_address.script_pubkey(),
608-
tx_feerate,
609-
Some(locktime),
610-
&Secp256k1::new(),
611-
);
612-
613-
match res {
614-
Ok(spending_tx) => self.tx_broadcaster.broadcast_transactions(&[&spending_tx]),
615-
Err(err) => {
616-
log_error!(self.logger, "Error spending outputs: {:?}", err);
617-
}
618-
}
580+
LdkEvent::SpendableOutputs { outputs, channel_id } => {
581+
self.output_sweeper.add_outputs(outputs, channel_id)
619582
}
620583
LdkEvent::OpenChannelRequest {
621584
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 {
@@ -696,10 +699,8 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
696699
Arc::clone(&self.event_queue),
697700
Arc::clone(&self.wallet),
698701
Arc::clone(&self.channel_manager),
699-
Arc::clone(&self.tx_broadcaster),
700-
Arc::clone(&self.fee_estimator),
702+
Arc::clone(&self.output_sweeper),
701703
Arc::clone(&self.network_graph),
702-
Arc::clone(&self.keys_manager),
703704
Arc::clone(&self.payment_store),
704705
Arc::clone(&self.peer_store),
705706
Arc::clone(&self.runtime),
@@ -1037,10 +1038,12 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
10371038
let tx_sync = Arc::clone(&self.tx_sync);
10381039
let sync_cman = Arc::clone(&self.channel_manager);
10391040
let sync_cmon = Arc::clone(&self.chain_monitor);
1041+
let sync_sweeper = Arc::clone(&self.output_sweeper);
10401042
let sync_logger = Arc::clone(&self.logger);
10411043
let confirmables = vec![
10421044
&*sync_cman as &(dyn Confirm + Sync + Send),
10431045
&*sync_cmon as &(dyn Confirm + Sync + Send),
1046+
&*sync_sweeper as &(dyn Confirm + Sync + Send),
10441047
];
10451048

10461049
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)