@@ -918,14 +918,16 @@ impl Drop for BackgroundProcessor {
918918
919919#[ cfg( all( feature = "std" , test) ) ]
920920mod tests {
921+ use bitcoin:: ScriptBuf ;
921922 use bitcoin:: blockdata:: constants:: { genesis_block, ChainHash } ;
922923 use bitcoin:: blockdata:: locktime:: absolute:: LockTime ;
923924 use bitcoin:: blockdata:: transaction:: { Transaction , TxOut } ;
924925 use bitcoin:: network:: constants:: Network ;
925926 use bitcoin:: secp256k1:: { SecretKey , PublicKey , Secp256k1 } ;
926- use lightning:: chain:: { BestBlock , Confirm , chainmonitor} ;
927+ use lightning:: chain:: { BestBlock , Confirm , chainmonitor, Filter } ;
927928 use lightning:: chain:: channelmonitor:: ANTI_REORG_DELAY ;
928- use lightning:: sign:: { InMemorySigner , KeysManager } ;
929+ use lightning:: chain:: chaininterface:: { ConfirmationTarget , FeeEstimator } ;
930+ use lightning:: sign:: { InMemorySigner , KeysManager , SpendableOutputDescriptor } ;
929931 use lightning:: chain:: transaction:: OutPoint ;
930932 use lightning:: events:: { Event , PathFailure , MessageSendEventsProvider , MessageSendEvent } ;
931933 use lightning:: { get_event_msg, get_event} ;
@@ -946,6 +948,7 @@ mod tests {
946948 CHANNEL_MANAGER_PERSISTENCE_PRIMARY_NAMESPACE , CHANNEL_MANAGER_PERSISTENCE_SECONDARY_NAMESPACE , CHANNEL_MANAGER_PERSISTENCE_KEY ,
947949 NETWORK_GRAPH_PERSISTENCE_PRIMARY_NAMESPACE , NETWORK_GRAPH_PERSISTENCE_SECONDARY_NAMESPACE , NETWORK_GRAPH_PERSISTENCE_KEY ,
948950 SCORER_PERSISTENCE_PRIMARY_NAMESPACE , SCORER_PERSISTENCE_SECONDARY_NAMESPACE , SCORER_PERSISTENCE_KEY } ;
951+ use lightning:: util:: sweep:: OutputSweeper ;
949952 use lightning_persister:: fs_store:: FilesystemStore ;
950953 use std:: collections:: VecDeque ;
951954 use std:: { fs, env} ;
@@ -1007,6 +1010,7 @@ mod tests {
10071010 logger : Arc < test_utils:: TestLogger > ,
10081011 best_block : BestBlock ,
10091012 scorer : Arc < LockingWrapper < TestScorer > > ,
1013+ sweeper : Arc < OutputSweeper < Arc < test_utils:: TestBroadcaster > , Arc < KeysManager > , Arc < dyn Filter + Sync + Send > , Arc < FilesystemStore > , Arc < test_utils:: TestLogger > > > ,
10101014 }
10111015
10121016 impl Node {
@@ -1269,10 +1273,29 @@ mod tests {
12691273 let kv_store = Arc :: new ( FilesystemStore :: new ( format ! ( "{}_persister_{}" , & persist_dir, i) . into ( ) ) ) ;
12701274 let now = Duration :: from_secs ( genesis_block. header . time as u64 ) ;
12711275 let keys_manager = Arc :: new ( KeysManager :: new ( & seed, now. as_secs ( ) , now. subsec_nanos ( ) ) ) ;
1276+
12721277 let chain_monitor = Arc :: new ( chainmonitor:: ChainMonitor :: new ( Some ( chain_source. clone ( ) ) , tx_broadcaster. clone ( ) , logger. clone ( ) , fee_estimator. clone ( ) , kv_store. clone ( ) ) ) ;
12731278 let best_block = BestBlock :: from_network ( network) ;
12741279 let params = ChainParameters { network, best_block } ;
12751280 let manager = Arc :: new ( ChannelManager :: new ( fee_estimator. clone ( ) , chain_monitor. clone ( ) , tx_broadcaster. clone ( ) , router. clone ( ) , logger. clone ( ) , keys_manager. clone ( ) , keys_manager. clone ( ) , keys_manager. clone ( ) , UserConfig :: default ( ) , params, genesis_block. header . time ) ) ;
1281+
1282+ let spend_fee_estimator = Arc :: clone ( & fee_estimator) ;
1283+ let spend_keys_manager = Arc :: clone ( & keys_manager) ;
1284+ let spend_outputs_callback = move |output_descriptors : & [ & SpendableOutputDescriptor ] | {
1285+ let fee_rate = spend_fee_estimator
1286+ . get_est_sat_per_1000_weight ( ConfirmationTarget :: NonAnchorChannelFee ) ;
1287+ spend_keys_manager. spend_spendable_outputs (
1288+ output_descriptors,
1289+ Vec :: new ( ) ,
1290+ ScriptBuf :: new ( ) ,
1291+ fee_rate,
1292+ None ,
1293+ & Secp256k1 :: new ( ) ,
1294+ )
1295+ } ;
1296+ let sweeper = Arc :: new ( OutputSweeper :: new ( Arc :: clone ( & tx_broadcaster) ,
1297+ Arc :: clone ( & keys_manager) , Arc :: clone ( & kv_store) , best_block,
1298+ None :: < Arc < dyn Filter + Sync + Send > > , Arc :: clone ( & logger) , None , spend_outputs_callback) ) ;
12761299 let p2p_gossip_sync = Arc :: new ( P2PGossipSync :: new ( network_graph. clone ( ) , Some ( chain_source. clone ( ) ) , logger. clone ( ) ) ) ;
12771300 let rapid_gossip_sync = Arc :: new ( RapidGossipSync :: new ( network_graph. clone ( ) , logger. clone ( ) ) ) ;
12781301 let msg_handler = MessageHandler {
@@ -1281,7 +1304,7 @@ mod tests {
12811304 onion_message_handler : IgnoringMessageHandler { } , custom_message_handler : IgnoringMessageHandler { }
12821305 } ;
12831306 let peer_manager = Arc :: new ( PeerManager :: new ( msg_handler, 0 , & seed, logger. clone ( ) , keys_manager. clone ( ) ) ) ;
1284- let node = Node { node : manager, p2p_gossip_sync, rapid_gossip_sync, peer_manager, chain_monitor, kv_store, tx_broadcaster, network_graph, logger, best_block, scorer } ;
1307+ let node = Node { node : manager, p2p_gossip_sync, rapid_gossip_sync, peer_manager, chain_monitor, kv_store, tx_broadcaster, network_graph, logger, best_block, scorer, sweeper } ;
12851308 nodes. push ( node) ;
12861309 }
12871310
@@ -1350,15 +1373,18 @@ mod tests {
13501373 1 => {
13511374 node. node . transactions_confirmed ( & header, & txdata, height) ;
13521375 node. chain_monitor . transactions_confirmed ( & header, & txdata, height) ;
1376+ node. sweeper . transactions_confirmed ( & header, & txdata, height) ;
13531377 } ,
13541378 x if x == depth => {
13551379 node. node . best_block_updated ( & header, height) ;
13561380 node. chain_monitor . best_block_updated ( & header, height) ;
1381+ node. sweeper . best_block_updated ( & header, height) ;
13571382 } ,
13581383 _ => { } ,
13591384 }
13601385 }
13611386 }
1387+
13621388 fn confirm_transaction ( node : & mut Node , tx : & Transaction ) {
13631389 confirm_transaction_depth ( node, tx, ANTI_REORG_DELAY ) ;
13641390 }
@@ -1590,6 +1616,9 @@ mod tests {
15901616 let _as_channel_update = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendChannelUpdate , nodes[ 1 ] . node. get_our_node_id( ) ) ;
15911617 nodes[ 1 ] . node . handle_channel_ready ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_funding) ;
15921618 let _bs_channel_update = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendChannelUpdate , nodes[ 0 ] . node. get_our_node_id( ) ) ;
1619+ let broadcast_funding = nodes[ 0 ] . tx_broadcaster . txn_broadcasted . lock ( ) . unwrap ( ) . pop ( ) . unwrap ( ) ;
1620+ assert_eq ! ( broadcast_funding. txid( ) , funding_tx. txid( ) ) ;
1621+ assert ! ( nodes[ 0 ] . tx_broadcaster. txn_broadcasted. lock( ) . unwrap( ) . is_empty( ) ) ;
15931622
15941623 if !std:: thread:: panicking ( ) {
15951624 bg_processor. stop ( ) . unwrap ( ) ;
@@ -1615,10 +1644,22 @@ mod tests {
16151644 . recv_timeout ( Duration :: from_secs ( EVENT_DEADLINE ) )
16161645 . expect ( "Events not handled within deadline" ) ;
16171646 match event {
1618- Event :: SpendableOutputs { .. } => { } ,
1647+ Event :: SpendableOutputs { outputs, channel_id } => {
1648+ nodes[ 0 ] . sweeper . track_spendable_outputs ( outputs, channel_id, false ) ;
1649+ } ,
16191650 _ => panic ! ( "Unexpected event: {:?}" , event) ,
16201651 }
16211652
1653+ assert_eq ! ( nodes[ 0 ] . sweeper. tracked_spendable_outputs( ) . len( ) , 1 ) ;
1654+ let tracked_output = nodes[ 0 ] . sweeper . tracked_spendable_outputs ( ) . first ( ) . unwrap ( ) . clone ( ) ;
1655+ let sweep_tx = nodes[ 0 ] . tx_broadcaster . txn_broadcasted . lock ( ) . unwrap ( ) . pop ( ) . unwrap ( ) ;
1656+ assert_eq ! ( sweep_tx. txid( ) , tracked_output. latest_spending_tx. as_ref( ) . unwrap( ) . txid( ) ) ;
1657+
1658+ confirm_transaction_depth ( & mut nodes[ 0 ] , & sweep_tx, 5 ) ;
1659+ assert_eq ! ( nodes[ 0 ] . sweeper. tracked_spendable_outputs( ) . len( ) , 1 ) ;
1660+ confirm_transaction_depth ( & mut nodes[ 0 ] , & sweep_tx, ANTI_REORG_DELAY ) ;
1661+ assert_eq ! ( nodes[ 0 ] . sweeper. tracked_spendable_outputs( ) . len( ) , 0 ) ;
1662+
16221663 if !std:: thread:: panicking ( ) {
16231664 bg_processor. stop ( ) . unwrap ( ) ;
16241665 }
0 commit comments