Skip to content

Commit 76d028e

Browse files
committed
Integrate OutputSweeper with EventHandler
1 parent d476470 commit 76d028e

File tree

4 files changed

+42
-45
lines changed

4 files changed

+42
-45
lines changed

src/builder.rs

Lines changed: 19 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::types::{
910
ChainMonitor, ChannelManager, FakeMessageRouter, GossipSync, KeysManager, NetworkGraph,
1011
OnionMessenger, PeerManager,
@@ -735,6 +736,23 @@ fn build_with_store_internal<K: KVStore + Sync + Send + 'static>(
735736
}
736737
};
737738

739+
let best_block = channel_manager.current_best_block();
740+
let output_sweeper =
741+
match io::utils::read_spendable_outputs(Arc::clone(&kv_store), Arc::clone(&logger)) {
742+
Ok(outputs) => Arc::new(OutputSweeper::new(
743+
outputs,
744+
Arc::clone(&wallet),
745+
Arc::clone(&keys_manager),
746+
Arc::clone(&kv_store),
747+
best_block,
748+
Some(Arc::clone(&tx_sync)),
749+
Arc::clone(&logger),
750+
)),
751+
Err(_) => {
752+
return Err(BuildError::ReadFailed);
753+
}
754+
};
755+
738756
let (stop_sender, stop_receiver) = tokio::sync::watch::channel(());
739757

740758
Ok(Node {
@@ -747,6 +765,7 @@ fn build_with_store_internal<K: KVStore + Sync + Send + 'static>(
747765
event_queue,
748766
channel_manager,
749767
chain_monitor,
768+
output_sweeper,
750769
peer_manager,
751770
keys_manager,
752771
network_graph,

src/event.rs

Lines changed: 10 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
use crate::{
2-
hex_utils, ChannelManager, Config, Error, KeysManager, NetworkGraph, UserChannelId, Wallet,
3-
};
1+
use crate::{hex_utils, ChannelManager, Config, Error, NetworkGraph, UserChannelId, Wallet};
42

53
use crate::payment_store::{
64
PaymentDetails, PaymentDetailsUpdate, PaymentDirection, PaymentStatus, PaymentStore,
@@ -10,9 +8,10 @@ use crate::io::{
108
EVENT_QUEUE_PERSISTENCE_KEY, EVENT_QUEUE_PERSISTENCE_PRIMARY_NAMESPACE,
119
EVENT_QUEUE_PERSISTENCE_SECONDARY_NAMESPACE,
1210
};
13-
use crate::logger::{log_debug, log_error, log_info, Logger};
11+
use crate::logger::{log_error, log_info, Logger};
12+
use crate::types::Sweeper;
1413

15-
use lightning::chain::chaininterface::{BroadcasterInterface, ConfirmationTarget, FeeEstimator};
14+
use lightning::chain::chaininterface::ConfirmationTarget;
1615
use lightning::events::Event as LdkEvent;
1716
use lightning::events::PaymentPurpose;
1817
use lightning::impl_writeable_tlv_based_enum;
@@ -22,8 +21,8 @@ use lightning::util::errors::APIError;
2221
use lightning::util::persist::KVStore;
2322
use lightning::util::ser::{Readable, ReadableArgs, Writeable, Writer};
2423

25-
use bitcoin::secp256k1::{PublicKey, Secp256k1};
26-
use bitcoin::{LockTime, OutPoint, PackedLockTime};
24+
use bitcoin::secp256k1::PublicKey;
25+
use bitcoin::{LockTime, OutPoint};
2726
use rand::{thread_rng, Rng};
2827
use std::collections::VecDeque;
2928
use std::ops::Deref;
@@ -246,8 +245,8 @@ where
246245
event_queue: Arc<EventQueue<K, L>>,
247246
channel_manager: Arc<ChannelManager<K>>,
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>,
@@ -260,16 +259,16 @@ where
260259
pub fn new(
261260
wallet: Arc<Wallet<bdk::database::SqliteDatabase, L>>, event_queue: Arc<EventQueue<K, L>>,
262261
channel_manager: Arc<ChannelManager<K>>, network_graph: Arc<NetworkGraph>,
263-
keys_manager: Arc<KeysManager>, payment_store: Arc<PaymentStore<K, L>>,
262+
payment_store: Arc<PaymentStore<K, L>>, output_sweeper: Arc<Sweeper<K>>,
264263
runtime: Arc<RwLock<Option<tokio::runtime::Runtime>>>, logger: L, config: Arc<Config>,
265264
) -> Self {
266265
Self {
267266
event_queue,
268267
wallet,
269268
channel_manager,
270269
network_graph,
271-
keys_manager,
272270
payment_store,
271+
output_sweeper,
273272
logger,
274273
runtime,
275274
config,
@@ -574,39 +573,7 @@ where
574573
}
575574
}
576575
LdkEvent::SpendableOutputs { outputs, channel_id: _ } => {
577-
// TODO: We should eventually remember the outputs and supply them to the wallet's coin selection, once BDK allows us to do so.
578-
let destination_address = self.wallet.get_new_address().unwrap_or_else(|e| {
579-
log_error!(self.logger, "Failed to get destination address: {}", e);
580-
panic!("Failed to get destination address");
581-
});
582-
583-
let output_descriptors = &outputs.iter().collect::<Vec<_>>();
584-
let tx_feerate = self
585-
.wallet
586-
.get_est_sat_per_1000_weight(ConfirmationTarget::NonAnchorChannelFee);
587-
588-
// We set nLockTime to the current height to discourage fee sniping.
589-
let cur_height = self.channel_manager.current_best_block().height();
590-
let locktime: PackedLockTime =
591-
LockTime::from_height(cur_height).map_or(PackedLockTime::ZERO, |l| l.into());
592-
let res = self.keys_manager.spend_spendable_outputs(
593-
output_descriptors,
594-
Vec::new(),
595-
destination_address.script_pubkey(),
596-
tx_feerate,
597-
Some(locktime),
598-
&Secp256k1::new(),
599-
);
600-
601-
match res {
602-
Ok(Some(spending_tx)) => self.wallet.broadcast_transactions(&[&spending_tx]),
603-
Ok(None) => {
604-
log_debug!(self.logger, "Omitted spending static outputs: {:?}", outputs);
605-
}
606-
Err(err) => {
607-
log_error!(self.logger, "Error spending outputs: {:?}", err);
608-
}
609-
}
576+
self.output_sweeper.add_outputs(outputs)
610577
}
611578
LdkEvent::OpenChannelRequest {
612579
temporary_channel_id,

src/lib.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,9 @@ use gossip::GossipSource;
119119
use payment_store::PaymentStore;
120120
pub use payment_store::{PaymentDetails, PaymentDirection, PaymentStatus};
121121
use peer_store::{PeerInfo, PeerStore};
122-
use types::{ChainMonitor, ChannelManager, KeysManager, NetworkGraph, PeerManager, Router, Scorer};
122+
use types::{
123+
ChainMonitor, ChannelManager, KeysManager, NetworkGraph, PeerManager, Router, Scorer, Sweeper,
124+
};
123125
pub use types::{ChannelDetails, PeerDetails, UserChannelId};
124126
use wallet::Wallet;
125127

@@ -290,6 +292,7 @@ pub struct Node<K: KVStore + Sync + Send + 'static> {
290292
event_queue: Arc<EventQueue<K, Arc<FilesystemLogger>>>,
291293
channel_manager: Arc<ChannelManager<K>>,
292294
chain_monitor: Arc<ChainMonitor<K>>,
295+
output_sweeper: Arc<Sweeper<K>>,
293296
peer_manager: Arc<PeerManager<K>>,
294297
keys_manager: Arc<KeysManager>,
295298
network_graph: Arc<NetworkGraph>,
@@ -413,6 +416,7 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
413416
let tx_sync = Arc::clone(&self.tx_sync);
414417
let sync_cman = Arc::clone(&self.channel_manager);
415418
let sync_cmon = Arc::clone(&self.chain_monitor);
419+
let sync_sweeper = Arc::clone(&self.output_sweeper);
416420
let sync_logger = Arc::clone(&self.logger);
417421
let mut stop_sync = self.stop_receiver.clone();
418422
let wallet_sync_interval_secs =
@@ -430,6 +434,7 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
430434
let confirmables = vec![
431435
&*sync_cman as &(dyn Confirm + Sync + Send),
432436
&*sync_cmon as &(dyn Confirm + Sync + Send),
437+
&*sync_sweeper as &(dyn Confirm + Sync + Send),
433438
];
434439
let now = Instant::now();
435440
match tx_sync.sync(confirmables).await {
@@ -652,8 +657,8 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
652657
Arc::clone(&self.event_queue),
653658
Arc::clone(&self.channel_manager),
654659
Arc::clone(&self.network_graph),
655-
Arc::clone(&self.keys_manager),
656660
Arc::clone(&self.payment_store),
661+
Arc::clone(&self.output_sweeper),
657662
Arc::clone(&self.runtime),
658663
Arc::clone(&self.logger),
659664
Arc::clone(&self.config),
@@ -989,10 +994,12 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
989994
let tx_sync = Arc::clone(&self.tx_sync);
990995
let sync_cman = Arc::clone(&self.channel_manager);
991996
let sync_cmon = Arc::clone(&self.chain_monitor);
997+
let sync_sweeper = Arc::clone(&self.output_sweeper);
992998
let sync_logger = Arc::clone(&self.logger);
993999
let confirmables = vec![
9941000
&*sync_cman as &(dyn Confirm + Sync + Send),
9951001
&*sync_cmon as &(dyn Confirm + Sync + Send),
1002+
&*sync_sweeper as &(dyn Confirm + Sync + Send),
9961003
];
9971004

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

src/types.rs

Lines changed: 4 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
use crate::wallet::{Wallet, WalletKeysManager};
34

45
use lightning::chain::chainmonitor;
@@ -104,6 +105,9 @@ impl lightning::onion_message::MessageRouter for FakeMessageRouter {
104105
}
105106
}
106107

108+
pub(crate) type Sweeper<K> =
109+
OutputSweeper<K, Arc<EsploraSyncClient<Arc<FilesystemLogger>>>, Arc<FilesystemLogger>>;
110+
107111
/// A local, potentially user-provided, identifier of a channel.
108112
///
109113
/// By default, this will be randomly generated for the user to ensure local uniqueness.

0 commit comments

Comments
 (0)