@@ -918,14 +918,16 @@ impl Drop for BackgroundProcessor {
918
918
919
919
#[ cfg( all( feature = "std" , test) ) ]
920
920
mod tests {
921
+ use bitcoin:: ScriptBuf ;
921
922
use bitcoin:: blockdata:: constants:: { genesis_block, ChainHash } ;
922
923
use bitcoin:: blockdata:: locktime:: absolute:: LockTime ;
923
924
use bitcoin:: blockdata:: transaction:: { Transaction , TxOut } ;
924
925
use bitcoin:: network:: constants:: Network ;
925
926
use bitcoin:: secp256k1:: { SecretKey , PublicKey , Secp256k1 } ;
926
- use lightning:: chain:: { BestBlock , Confirm , chainmonitor} ;
927
+ use lightning:: chain:: { BestBlock , Confirm , chainmonitor, Filter } ;
927
928
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 } ;
929
931
use lightning:: chain:: transaction:: OutPoint ;
930
932
use lightning:: events:: { Event , PathFailure , MessageSendEventsProvider , MessageSendEvent } ;
931
933
use lightning:: { get_event_msg, get_event} ;
@@ -946,6 +948,7 @@ mod tests {
946
948
CHANNEL_MANAGER_PERSISTENCE_PRIMARY_NAMESPACE , CHANNEL_MANAGER_PERSISTENCE_SECONDARY_NAMESPACE , CHANNEL_MANAGER_PERSISTENCE_KEY ,
947
949
NETWORK_GRAPH_PERSISTENCE_PRIMARY_NAMESPACE , NETWORK_GRAPH_PERSISTENCE_SECONDARY_NAMESPACE , NETWORK_GRAPH_PERSISTENCE_KEY ,
948
950
SCORER_PERSISTENCE_PRIMARY_NAMESPACE , SCORER_PERSISTENCE_SECONDARY_NAMESPACE , SCORER_PERSISTENCE_KEY } ;
951
+ use lightning:: util:: sweep:: OutputSweeper ;
949
952
use lightning_persister:: fs_store:: FilesystemStore ;
950
953
use std:: collections:: VecDeque ;
951
954
use std:: { fs, env} ;
@@ -1007,6 +1010,7 @@ mod tests {
1007
1010
logger : Arc < test_utils:: TestLogger > ,
1008
1011
best_block : BestBlock ,
1009
1012
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 > > > ,
1010
1014
}
1011
1015
1012
1016
impl Node {
@@ -1269,10 +1273,29 @@ mod tests {
1269
1273
let kv_store = Arc :: new ( FilesystemStore :: new ( format ! ( "{}_persister_{}" , & persist_dir, i) . into ( ) ) ) ;
1270
1274
let now = Duration :: from_secs ( genesis_block. header . time as u64 ) ;
1271
1275
let keys_manager = Arc :: new ( KeysManager :: new ( & seed, now. as_secs ( ) , now. subsec_nanos ( ) ) ) ;
1276
+
1272
1277
let chain_monitor = Arc :: new ( chainmonitor:: ChainMonitor :: new ( Some ( chain_source. clone ( ) ) , tx_broadcaster. clone ( ) , logger. clone ( ) , fee_estimator. clone ( ) , kv_store. clone ( ) ) ) ;
1273
1278
let best_block = BestBlock :: from_network ( network) ;
1274
1279
let params = ChainParameters { network, best_block } ;
1275
1280
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) ) ;
1276
1299
let p2p_gossip_sync = Arc :: new ( P2PGossipSync :: new ( network_graph. clone ( ) , Some ( chain_source. clone ( ) ) , logger. clone ( ) ) ) ;
1277
1300
let rapid_gossip_sync = Arc :: new ( RapidGossipSync :: new ( network_graph. clone ( ) , logger. clone ( ) ) ) ;
1278
1301
let msg_handler = MessageHandler {
@@ -1281,7 +1304,7 @@ mod tests {
1281
1304
onion_message_handler : IgnoringMessageHandler { } , custom_message_handler : IgnoringMessageHandler { }
1282
1305
} ;
1283
1306
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 } ;
1285
1308
nodes. push ( node) ;
1286
1309
}
1287
1310
@@ -1350,15 +1373,18 @@ mod tests {
1350
1373
1 => {
1351
1374
node. node . transactions_confirmed ( & header, & txdata, height) ;
1352
1375
node. chain_monitor . transactions_confirmed ( & header, & txdata, height) ;
1376
+ node. sweeper . transactions_confirmed ( & header, & txdata, height) ;
1353
1377
} ,
1354
1378
x if x == depth => {
1355
1379
node. node . best_block_updated ( & header, height) ;
1356
1380
node. chain_monitor . best_block_updated ( & header, height) ;
1381
+ node. sweeper . best_block_updated ( & header, height) ;
1357
1382
} ,
1358
1383
_ => { } ,
1359
1384
}
1360
1385
}
1361
1386
}
1387
+
1362
1388
fn confirm_transaction ( node : & mut Node , tx : & Transaction ) {
1363
1389
confirm_transaction_depth ( node, tx, ANTI_REORG_DELAY ) ;
1364
1390
}
@@ -1590,6 +1616,9 @@ mod tests {
1590
1616
let _as_channel_update = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendChannelUpdate , nodes[ 1 ] . node. get_our_node_id( ) ) ;
1591
1617
nodes[ 1 ] . node . handle_channel_ready ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_funding) ;
1592
1618
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( ) ) ;
1593
1622
1594
1623
if !std:: thread:: panicking ( ) {
1595
1624
bg_processor. stop ( ) . unwrap ( ) ;
@@ -1615,10 +1644,22 @@ mod tests {
1615
1644
. recv_timeout ( Duration :: from_secs ( EVENT_DEADLINE ) )
1616
1645
. expect ( "Events not handled within deadline" ) ;
1617
1646
match event {
1618
- Event :: SpendableOutputs { .. } => { } ,
1647
+ Event :: SpendableOutputs { outputs, channel_id } => {
1648
+ nodes[ 0 ] . sweeper . track_spendable_outputs ( outputs, channel_id, false ) ;
1649
+ } ,
1619
1650
_ => panic ! ( "Unexpected event: {:?}" , event) ,
1620
1651
}
1621
1652
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
+
1622
1663
if !std:: thread:: panicking ( ) {
1623
1664
bg_processor. stop ( ) . unwrap ( ) ;
1624
1665
}
0 commit comments