@@ -918,17 +918,18 @@ 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 } ;
931- use lightning:: { get_event_msg, get_event} ;
932933 use lightning:: ln:: PaymentHash ;
933934 use lightning:: ln:: channelmanager;
934935 use lightning:: ln:: channelmanager:: { BREAKDOWN_TIMEOUT , ChainParameters , MIN_CLTV_EXPIRY_DELTA , PaymentId } ;
@@ -946,6 +947,7 @@ mod tests {
946947 CHANNEL_MANAGER_PERSISTENCE_PRIMARY_NAMESPACE , CHANNEL_MANAGER_PERSISTENCE_SECONDARY_NAMESPACE , CHANNEL_MANAGER_PERSISTENCE_KEY ,
947948 NETWORK_GRAPH_PERSISTENCE_PRIMARY_NAMESPACE , NETWORK_GRAPH_PERSISTENCE_SECONDARY_NAMESPACE , NETWORK_GRAPH_PERSISTENCE_KEY ,
948949 SCORER_PERSISTENCE_PRIMARY_NAMESPACE , SCORER_PERSISTENCE_SECONDARY_NAMESPACE , SCORER_PERSISTENCE_KEY } ;
950+ use lightning:: util:: sweep:: OutputSweeper ;
949951 use lightning_persister:: fs_store:: FilesystemStore ;
950952 use std:: collections:: VecDeque ;
951953 use std:: { fs, env} ;
@@ -1007,6 +1009,7 @@ mod tests {
10071009 logger : Arc < test_utils:: TestLogger > ,
10081010 best_block : BestBlock ,
10091011 scorer : Arc < LockingWrapper < TestScorer > > ,
1012+ sweeper : Arc < OutputSweeper < Arc < test_utils:: TestBroadcaster > , Arc < KeysManager > , Arc < dyn Filter + Sync + Send > , Arc < FilesystemStore > , Arc < test_utils:: TestLogger > > > ,
10101013 }
10111014
10121015 impl Node {
@@ -1269,10 +1272,29 @@ mod tests {
12691272 let kv_store = Arc :: new ( FilesystemStore :: new ( format ! ( "{}_persister_{}" , & persist_dir, i) . into ( ) ) ) ;
12701273 let now = Duration :: from_secs ( genesis_block. header . time as u64 ) ;
12711274 let keys_manager = Arc :: new ( KeysManager :: new ( & seed, now. as_secs ( ) , now. subsec_nanos ( ) ) ) ;
1275+
12721276 let chain_monitor = Arc :: new ( chainmonitor:: ChainMonitor :: new ( Some ( chain_source. clone ( ) ) , tx_broadcaster. clone ( ) , logger. clone ( ) , fee_estimator. clone ( ) , kv_store. clone ( ) ) ) ;
12731277 let best_block = BestBlock :: from_network ( network) ;
12741278 let params = ChainParameters { network, best_block } ;
12751279 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 ) ) ;
1280+
1281+ let spend_fee_estimator = Arc :: clone ( & fee_estimator) ;
1282+ let spend_keys_manager = Arc :: clone ( & keys_manager) ;
1283+ let spend_outputs_callback = move |output_descriptors : & [ & SpendableOutputDescriptor ] | {
1284+ let fee_rate = spend_fee_estimator
1285+ . get_est_sat_per_1000_weight ( ConfirmationTarget :: NonAnchorChannelFee ) ;
1286+ spend_keys_manager. spend_spendable_outputs (
1287+ output_descriptors,
1288+ Vec :: new ( ) ,
1289+ ScriptBuf :: new ( ) ,
1290+ fee_rate,
1291+ None ,
1292+ & Secp256k1 :: new ( ) ,
1293+ )
1294+ } ;
1295+ let sweeper = Arc :: new ( OutputSweeper :: new ( Arc :: clone ( & tx_broadcaster) ,
1296+ Arc :: clone ( & keys_manager) , Arc :: clone ( & kv_store) , best_block,
1297+ None :: < Arc < dyn Filter + Sync + Send > > , Arc :: clone ( & logger) , None , spend_outputs_callback) ) ;
12761298 let p2p_gossip_sync = Arc :: new ( P2PGossipSync :: new ( network_graph. clone ( ) , Some ( chain_source. clone ( ) ) , logger. clone ( ) ) ) ;
12771299 let rapid_gossip_sync = Arc :: new ( RapidGossipSync :: new ( network_graph. clone ( ) , logger. clone ( ) ) ) ;
12781300 let msg_handler = MessageHandler {
@@ -1281,7 +1303,7 @@ mod tests {
12811303 onion_message_handler : IgnoringMessageHandler { } , custom_message_handler : IgnoringMessageHandler { }
12821304 } ;
12831305 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 } ;
1306+ 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 } ;
12851307 nodes. push ( node) ;
12861308 }
12871309
@@ -1350,15 +1372,18 @@ mod tests {
13501372 1 => {
13511373 node. node . transactions_confirmed ( & header, & txdata, height) ;
13521374 node. chain_monitor . transactions_confirmed ( & header, & txdata, height) ;
1375+ node. sweeper . transactions_confirmed ( & header, & txdata, height) ;
13531376 } ,
13541377 x if x == depth => {
13551378 node. node . best_block_updated ( & header, height) ;
13561379 node. chain_monitor . best_block_updated ( & header, height) ;
1380+ node. sweeper . best_block_updated ( & header, height) ;
13571381 } ,
13581382 _ => { } ,
13591383 }
13601384 }
13611385 }
1386+
13621387 fn confirm_transaction ( node : & mut Node , tx : & Transaction ) {
13631388 confirm_transaction_depth ( node, tx, ANTI_REORG_DELAY ) ;
13641389 }
@@ -1590,6 +1615,9 @@ mod tests {
15901615 let _as_channel_update = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendChannelUpdate , nodes[ 1 ] . node. get_our_node_id( ) ) ;
15911616 nodes[ 1 ] . node . handle_channel_ready ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_funding) ;
15921617 let _bs_channel_update = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendChannelUpdate , nodes[ 0 ] . node. get_our_node_id( ) ) ;
1618+ let broadcast_funding = nodes[ 0 ] . tx_broadcaster . txn_broadcasted . lock ( ) . unwrap ( ) . pop ( ) . unwrap ( ) ;
1619+ assert_eq ! ( broadcast_funding. txid( ) , funding_tx. txid( ) ) ;
1620+ assert ! ( nodes[ 0 ] . tx_broadcaster. txn_broadcasted. lock( ) . unwrap( ) . is_empty( ) ) ;
15931621
15941622 if !std:: thread:: panicking ( ) {
15951623 bg_processor. stop ( ) . unwrap ( ) ;
@@ -1615,10 +1643,22 @@ mod tests {
16151643 . recv_timeout ( Duration :: from_secs ( EVENT_DEADLINE ) )
16161644 . expect ( "Events not handled within deadline" ) ;
16171645 match event {
1618- Event :: SpendableOutputs { .. } => { } ,
1646+ Event :: SpendableOutputs { outputs, channel_id } => {
1647+ nodes[ 0 ] . sweeper . track_spendable_outputs ( outputs, channel_id, false ) ;
1648+ } ,
16191649 _ => panic ! ( "Unexpected event: {:?}" , event) ,
16201650 }
16211651
1652+ assert_eq ! ( nodes[ 0 ] . sweeper. tracked_spendable_outputs( ) . len( ) , 1 ) ;
1653+ let tracked_output = nodes[ 0 ] . sweeper . tracked_spendable_outputs ( ) . first ( ) . unwrap ( ) . clone ( ) ;
1654+ let sweep_tx = nodes[ 0 ] . tx_broadcaster . txn_broadcasted . lock ( ) . unwrap ( ) . pop ( ) . unwrap ( ) ;
1655+ assert_eq ! ( sweep_tx. txid( ) , tracked_output. latest_spending_tx. as_ref( ) . unwrap( ) . txid( ) ) ;
1656+
1657+ confirm_transaction_depth ( & mut nodes[ 0 ] , & sweep_tx, 5 ) ;
1658+ assert_eq ! ( nodes[ 0 ] . sweeper. tracked_spendable_outputs( ) . len( ) , 1 ) ;
1659+ confirm_transaction_depth ( & mut nodes[ 0 ] , & sweep_tx, ANTI_REORG_DELAY ) ;
1660+ assert_eq ! ( nodes[ 0 ] . sweeper. tracked_spendable_outputs( ) . len( ) , 0 ) ;
1661+
16221662 if !std:: thread:: panicking ( ) {
16231663 bg_processor. stop ( ) . unwrap ( ) ;
16241664 }
0 commit comments