@@ -4,18 +4,19 @@ mod cli;
44mod convert;
55mod disk;
66mod hex_utils;
7+ mod sweep;
78
89use crate :: bitcoind_client:: BitcoindClient ;
910use crate :: disk:: FilesystemLogger ;
1011use bitcoin:: blockdata:: transaction:: Transaction ;
1112use bitcoin:: consensus:: encode;
1213use bitcoin:: network:: constants:: Network ;
13- use bitcoin:: secp256k1:: Secp256k1 ;
1414use bitcoin:: BlockHash ;
1515use bitcoin_bech32:: WitnessProgram ;
1616use lightning:: chain;
17- use lightning:: chain:: chaininterface:: { BroadcasterInterface , ConfirmationTarget , FeeEstimator } ;
18- use lightning:: chain:: keysinterface:: { EntropySource , InMemorySigner , KeysManager } ;
17+ use lightning:: chain:: keysinterface:: {
18+ EntropySource , InMemorySigner , KeysManager , SpendableOutputDescriptor ,
19+ } ;
1920use lightning:: chain:: { chainmonitor, ChannelMonitorUpdateStatus } ;
2021use lightning:: chain:: { Filter , Watch } ;
2122use lightning:: events:: { Event , PaymentFailureReason , PaymentPurpose } ;
@@ -30,6 +31,7 @@ use lightning::routing::gossip;
3031use lightning:: routing:: gossip:: { NodeId , P2PGossipSync } ;
3132use lightning:: routing:: router:: DefaultRouter ;
3233use lightning:: util:: config:: UserConfig ;
34+ use lightning:: util:: persist:: KVStorePersister ;
3335use lightning:: util:: ser:: ReadableArgs ;
3436use lightning_background_processor:: { process_events_async, GossipSync } ;
3537use lightning_block_sync:: init;
@@ -52,6 +54,8 @@ use std::sync::atomic::{AtomicBool, Ordering};
5254use std:: sync:: { Arc , Mutex } ;
5355use std:: time:: { Duration , SystemTime } ;
5456
57+ pub ( crate ) const PENDING_SPENDABLE_OUTPUT_DIR : & ' static str = "pending_spendable_outputs" ;
58+
5559pub ( crate ) enum HTLCStatus {
5660 Pending ,
5761 Succeeded ,
@@ -107,7 +111,7 @@ async fn handle_ldk_events(
107111 channel_manager : & Arc < ChannelManager > , bitcoind_client : & BitcoindClient ,
108112 network_graph : & NetworkGraph , keys_manager : & KeysManager ,
109113 inbound_payments : & PaymentInfoStorage , outbound_payments : & PaymentInfoStorage ,
110- network : Network , event : Event ,
114+ persister : & Arc < FilesystemPersister > , network : Network , event : Event ,
111115) {
112116 match event {
113117 Event :: FundingGenerationReady {
@@ -331,20 +335,23 @@ async fn handle_ldk_events(
331335 } ) ;
332336 }
333337 Event :: SpendableOutputs { outputs } => {
334- let destination_address = bitcoind_client. get_new_address ( ) . await ;
335- let output_descriptors = & outputs. iter ( ) . map ( |a| a) . collect :: < Vec < _ > > ( ) ;
336- let tx_feerate =
337- bitcoind_client. get_est_sat_per_1000_weight ( ConfirmationTarget :: Normal ) ;
338- let spending_tx = keys_manager
339- . spend_spendable_outputs (
340- output_descriptors,
341- Vec :: new ( ) ,
342- destination_address. script_pubkey ( ) ,
343- tx_feerate,
344- & Secp256k1 :: new ( ) ,
345- )
346- . unwrap ( ) ;
347- bitcoind_client. broadcast_transaction ( & spending_tx) ;
338+ // SpendableOutputDescriptors, of which outputs is a vec of, are critical to keep track
339+ // of! While a `StaticOutput` descriptor is just an output to a static, well-known key,
340+ // other descriptors are not currently ever regenerated for you by LDK. Once we return
341+ // from this method, the descriptor will be gone, and you may lose track of some funds.
342+ //
343+ // Here we simply persist them to disk, with a background task running which will try
344+ // to spend them regularly (possibly duplicatively/RBF'ing them). These can just be
345+ // treated as normal funds where possible - they are only spendable by us and there is
346+ // no rush to claim them.
347+ for output in outputs {
348+ let key = hex_utils:: hex_str ( & keys_manager. get_secure_random_bytes ( ) ) ;
349+ // Note that if the type here changes our read code needs to change as well.
350+ let output: SpendableOutputDescriptor = output;
351+ persister
352+ . persist ( & format ! ( "{}/{}" , PENDING_SPENDABLE_OUTPUT_DIR , key) , & output)
353+ . unwrap ( ) ;
354+ }
348355 }
349356 Event :: ChannelPending { channel_id, counterparty_node_id, .. } => {
350357 println ! (
@@ -693,6 +700,7 @@ async fn start_ldk() {
693700 let keys_manager_event_listener = Arc :: clone ( & keys_manager) ;
694701 let inbound_payments_event_listener = Arc :: clone ( & inbound_payments) ;
695702 let outbound_payments_event_listener = Arc :: clone ( & outbound_payments) ;
703+ let persister_event_listener = Arc :: clone ( & persister) ;
696704 let network = args. network ;
697705 let event_handler = move |event : Event | {
698706 let channel_manager_event_listener = Arc :: clone ( & channel_manager_event_listener) ;
@@ -701,6 +709,7 @@ async fn start_ldk() {
701709 let keys_manager_event_listener = Arc :: clone ( & keys_manager_event_listener) ;
702710 let inbound_payments_event_listener = Arc :: clone ( & inbound_payments_event_listener) ;
703711 let outbound_payments_event_listener = Arc :: clone ( & outbound_payments_event_listener) ;
712+ let persister_event_listener = Arc :: clone ( & persister_event_listener) ;
704713 async move {
705714 handle_ldk_events (
706715 & channel_manager_event_listener,
@@ -709,6 +718,7 @@ async fn start_ldk() {
709718 & keys_manager_event_listener,
710719 & inbound_payments_event_listener,
711720 & outbound_payments_event_listener,
721+ & persister_event_listener,
712722 network,
713723 event,
714724 )
@@ -722,7 +732,7 @@ async fn start_ldk() {
722732 // Step 20: Background Processing
723733 let ( bp_exit, bp_exit_check) = tokio:: sync:: watch:: channel ( ( ) ) ;
724734 let background_processor = tokio:: spawn ( process_events_async (
725- persister,
735+ Arc :: clone ( & persister) ,
726736 event_handler,
727737 chain_monitor. clone ( ) ,
728738 channel_manager. clone ( ) ,
@@ -793,7 +803,8 @@ async fn start_ldk() {
793803 let mut interval = tokio:: time:: interval ( Duration :: from_secs ( 3600 ) ) ;
794804 loop {
795805 // Don't bother trying to announce if we don't have any public channls, though our
796- // peers should drop such an announcement anyway.
806+ // peers should drop such an announcement anyway. Note that announcement may not
807+ // propagate until we have a channel with 6+ confirmations.
797808 if chan_man. list_channels ( ) . iter ( ) . any ( |chan| chan. is_public ) {
798809 peer_man. broadcast_node_announcement (
799810 [ 0 ; 3 ] ,
@@ -805,6 +816,14 @@ async fn start_ldk() {
805816 }
806817 } ) ;
807818
819+ tokio:: spawn ( sweep:: periodic_sweep (
820+ ldk_data_dir. clone ( ) ,
821+ Arc :: clone ( & keys_manager) ,
822+ Arc :: clone ( & logger) ,
823+ Arc :: clone ( & persister) ,
824+ Arc :: clone ( & bitcoind_client) ,
825+ ) ) ;
826+
808827 // Start the CLI.
809828 cli:: poll_for_user_input (
810829 Arc :: clone ( & peer_manager) ,
@@ -814,7 +833,7 @@ async fn start_ldk() {
814833 Arc :: clone ( & onion_messenger) ,
815834 inbound_payments,
816835 outbound_payments,
817- ldk_data_dir. clone ( ) ,
836+ ldk_data_dir,
818837 network,
819838 Arc :: clone ( & logger) ,
820839 )
0 commit comments