Skip to content

Commit aa6ea5d

Browse files
committed
Integrate OutputSweeper with EventHandler
1 parent 620667a commit aa6ea5d

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
@@ -7,6 +7,7 @@ use crate::io::{KVStore, CHANNEL_MANAGER_PERSISTENCE_KEY, CHANNEL_MANAGER_PERSIS
77
use crate::logger::{log_error, FilesystemLogger, Logger};
88
use crate::payment_store::PaymentStore;
99
use crate::peer_store::PeerStore;
10+
use crate::sweep::OutputSweeper;
1011
use crate::types::{
1112
ChainMonitor, ChannelManager, FakeMessageRouter, GossipSync, KeysManager, NetAddress,
1213
NetworkGraph, OnionMessenger, PeerManager,
@@ -716,6 +717,23 @@ fn build_with_store_internal<K: KVStore + Sync + Send + 'static>(
716717
}
717718
};
718719

720+
let best_block = channel_manager.current_best_block();
721+
let output_sweeper =
722+
match io::utils::read_spendable_outputs(Arc::clone(&kv_store), Arc::clone(&logger)) {
723+
Ok(outputs) => Arc::new(OutputSweeper::new(
724+
outputs,
725+
Arc::clone(&wallet),
726+
Arc::clone(&keys_manager),
727+
Arc::clone(&kv_store),
728+
best_block,
729+
Some(Arc::clone(&tx_sync)),
730+
Arc::clone(&logger),
731+
)),
732+
Err(_) => {
733+
return Err(BuildError::ReadFailed);
734+
}
735+
};
736+
719737
let (stop_sender, stop_receiver) = tokio::sync::watch::channel(());
720738

721739
Ok(Node {
@@ -728,6 +746,7 @@ fn build_with_store_internal<K: KVStore + Sync + Send + 'static>(
728746
event_queue,
729747
channel_manager,
730748
chain_monitor,
749+
output_sweeper,
731750
peer_manager,
732751
keys_manager,
733752
network_graph,

src/event.rs

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

65
use crate::payment_store::{
76
PaymentDetails, PaymentDetailsUpdate, PaymentDirection, PaymentStatus, PaymentStore,
87
};
98

109
use crate::io::{KVStore, EVENT_QUEUE_PERSISTENCE_KEY, EVENT_QUEUE_PERSISTENCE_NAMESPACE};
11-
use crate::logger::{log_debug, log_error, log_info, Logger};
10+
use crate::logger::{log_error, log_info, Logger};
11+
use crate::types::Sweeper;
1212

13-
use lightning::chain::chaininterface::{BroadcasterInterface, ConfirmationTarget, FeeEstimator};
13+
use lightning::chain::chaininterface::ConfirmationTarget;
1414
use lightning::events::Event as LdkEvent;
1515
use lightning::events::PaymentPurpose;
1616
use lightning::impl_writeable_tlv_based_enum;
@@ -19,8 +19,8 @@ use lightning::routing::gossip::NodeId;
1919
use lightning::util::errors::APIError;
2020
use lightning::util::ser::{Readable, ReadableArgs, Writeable, Writer};
2121

22-
use bitcoin::secp256k1::{PublicKey, Secp256k1};
23-
use bitcoin::{LockTime, OutPoint, PackedLockTime};
22+
use bitcoin::secp256k1::PublicKey;
23+
use bitcoin::{LockTime, OutPoint};
2424
use rand::{thread_rng, Rng};
2525
use std::collections::VecDeque;
2626
use std::ops::Deref;
@@ -227,8 +227,8 @@ where
227227
event_queue: Arc<EventQueue<K, L>>,
228228
channel_manager: Arc<ChannelManager<K>>,
229229
network_graph: Arc<NetworkGraph>,
230-
keys_manager: Arc<KeysManager>,
231230
payment_store: Arc<PaymentStore<K, L>>,
231+
output_sweeper: Arc<Sweeper<K>>,
232232
runtime: Arc<RwLock<Option<tokio::runtime::Runtime>>>,
233233
logger: L,
234234
config: Arc<Config>,
@@ -241,16 +241,16 @@ where
241241
pub fn new(
242242
wallet: Arc<Wallet<bdk::database::SqliteDatabase, L>>, event_queue: Arc<EventQueue<K, L>>,
243243
channel_manager: Arc<ChannelManager<K>>, network_graph: Arc<NetworkGraph>,
244-
keys_manager: Arc<KeysManager>, payment_store: Arc<PaymentStore<K, L>>,
244+
payment_store: Arc<PaymentStore<K, L>>, output_sweeper: Arc<Sweeper<K>>,
245245
runtime: Arc<RwLock<Option<tokio::runtime::Runtime>>>, logger: L, config: Arc<Config>,
246246
) -> Self {
247247
Self {
248248
event_queue,
249249
wallet,
250250
channel_manager,
251251
network_graph,
252-
keys_manager,
253252
payment_store,
253+
output_sweeper,
254254
logger,
255255
runtime,
256256
config,
@@ -552,40 +552,7 @@ where
552552
});
553553
}
554554
}
555-
LdkEvent::SpendableOutputs { outputs } => {
556-
// TODO: We should eventually remember the outputs and supply them to the wallet's coin selection, once BDK allows us to do so.
557-
let destination_address = self.wallet.get_new_address().unwrap_or_else(|e| {
558-
log_error!(self.logger, "Failed to get destination address: {}", e);
559-
panic!("Failed to get destination address");
560-
});
561-
562-
let output_descriptors = &outputs.iter().collect::<Vec<_>>();
563-
let tx_feerate =
564-
self.wallet.get_est_sat_per_1000_weight(ConfirmationTarget::Normal);
565-
566-
// We set nLockTime to the current height to discourage fee sniping.
567-
let cur_height = self.channel_manager.current_best_block().height();
568-
let locktime: PackedLockTime =
569-
LockTime::from_height(cur_height).map_or(PackedLockTime::ZERO, |l| l.into());
570-
let res = self.keys_manager.spend_spendable_outputs(
571-
output_descriptors,
572-
Vec::new(),
573-
destination_address.script_pubkey(),
574-
tx_feerate,
575-
Some(locktime),
576-
&Secp256k1::new(),
577-
);
578-
579-
match res {
580-
Ok(Some(spending_tx)) => self.wallet.broadcast_transactions(&[&spending_tx]),
581-
Ok(None) => {
582-
log_debug!(self.logger, "Omitted spending static outputs: {:?}", outputs);
583-
}
584-
Err(err) => {
585-
log_error!(self.logger, "Error spending outputs: {:?}", err);
586-
}
587-
}
588-
}
555+
LdkEvent::SpendableOutputs { outputs } => self.output_sweeper.add_outputs(outputs),
589556
LdkEvent::OpenChannelRequest {
590557
temporary_channel_id,
591558
counterparty_node_id,

src/lib.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,9 @@ use io::KVStore;
120120
use payment_store::PaymentStore;
121121
pub use payment_store::{PaymentDetails, PaymentDirection, PaymentStatus};
122122
use peer_store::{PeerInfo, PeerStore};
123-
use types::{ChainMonitor, ChannelManager, KeysManager, NetworkGraph, PeerManager, Router, Scorer};
123+
use types::{
124+
ChainMonitor, ChannelManager, KeysManager, NetworkGraph, PeerManager, Router, Scorer, Sweeper,
125+
};
124126
pub use types::{ChannelDetails, ChannelId, PeerDetails, UserChannelId};
125127
use wallet::Wallet;
126128

@@ -280,6 +282,7 @@ pub struct Node<K: KVStore + Sync + Send + 'static> {
280282
event_queue: Arc<EventQueue<K, Arc<FilesystemLogger>>>,
281283
channel_manager: Arc<ChannelManager<K>>,
282284
chain_monitor: Arc<ChainMonitor<K>>,
285+
output_sweeper: Arc<Sweeper<K>>,
283286
peer_manager: Arc<PeerManager<K>>,
284287
keys_manager: Arc<KeysManager>,
285288
network_graph: Arc<NetworkGraph>,
@@ -403,6 +406,7 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
403406
let tx_sync = Arc::clone(&self.tx_sync);
404407
let sync_cman = Arc::clone(&self.channel_manager);
405408
let sync_cmon = Arc::clone(&self.chain_monitor);
409+
let sync_sweeper = Arc::clone(&self.output_sweeper);
406410
let sync_logger = Arc::clone(&self.logger);
407411
let mut stop_sync = self.stop_receiver.clone();
408412
let wallet_sync_interval_secs =
@@ -420,6 +424,7 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
420424
let confirmables = vec![
421425
&*sync_cman as &(dyn Confirm + Sync + Send),
422426
&*sync_cmon as &(dyn Confirm + Sync + Send),
427+
&*sync_sweeper as &(dyn Confirm + Sync + Send),
423428
];
424429
let now = Instant::now();
425430
match tx_sync.sync(confirmables).await {
@@ -642,8 +647,8 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
642647
Arc::clone(&self.event_queue),
643648
Arc::clone(&self.channel_manager),
644649
Arc::clone(&self.network_graph),
645-
Arc::clone(&self.keys_manager),
646650
Arc::clone(&self.payment_store),
651+
Arc::clone(&self.output_sweeper),
647652
Arc::clone(&self.runtime),
648653
Arc::clone(&self.logger),
649654
Arc::clone(&self.config),
@@ -974,10 +979,12 @@ impl<K: KVStore + Sync + Send + 'static> Node<K> {
974979
let tx_sync = Arc::clone(&self.tx_sync);
975980
let sync_cman = Arc::clone(&self.channel_manager);
976981
let sync_cmon = Arc::clone(&self.chain_monitor);
982+
let sync_sweeper = Arc::clone(&self.output_sweeper);
977983
let sync_logger = Arc::clone(&self.logger);
978984
let confirmables = vec![
979985
&*sync_cman as &(dyn Confirm + Sync + Send),
980986
&*sync_cmon as &(dyn Confirm + Sync + Send),
987+
&*sync_sweeper as &(dyn Confirm + Sync + Send),
981988
];
982989

983990
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;
@@ -107,6 +108,9 @@ impl lightning::onion_message::MessageRouter for FakeMessageRouter {
107108
}
108109
}
109110

111+
pub(crate) type Sweeper<K> =
112+
OutputSweeper<K, Arc<EsploraSyncClient<Arc<FilesystemLogger>>>, Arc<FilesystemLogger>>;
113+
110114
/// The global identifier of a channel.
111115
///
112116
/// Note that this will start out to be a temporary ID until channel funding negotiation is

0 commit comments

Comments
 (0)