@@ -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} ;
@@ -1008,6 +1011,7 @@ mod tests {
1008
1011
logger : Arc < test_utils:: TestLogger > ,
1009
1012
best_block : BestBlock ,
1010
1013
scorer : Arc < LockingWrapper < TestScorer > > ,
1014
+ sweeper : Arc < OutputSweeper < Arc < test_utils:: TestBroadcaster > , Arc < KeysManager > , Arc < dyn Filter + Sync + Send > , Arc < FilesystemStore > , Arc < test_utils:: TestLogger > > > ,
1011
1015
}
1012
1016
1013
1017
impl Node {
@@ -1270,10 +1274,30 @@ mod tests {
1270
1274
let router = Arc :: new ( DefaultRouter :: new ( network_graph. clone ( ) , logger. clone ( ) , Arc :: clone ( & keys_manager) , scorer. clone ( ) , Default :: default ( ) ) ) ;
1271
1275
let chain_source = Arc :: new ( test_utils:: TestChainSource :: new ( Network :: Bitcoin ) ) ;
1272
1276
let kv_store = Arc :: new ( FilesystemStore :: new ( format ! ( "{}_persister_{}" , & persist_dir, i) . into ( ) ) ) ;
1277
+ let now = Duration :: from_secs ( genesis_block. header . time as u64 ) ;
1278
+ let keys_manager = Arc :: new ( KeysManager :: new ( & seed, now. as_secs ( ) , now. subsec_nanos ( ) ) ) ;
1273
1279
let chain_monitor = Arc :: new ( chainmonitor:: ChainMonitor :: new ( Some ( chain_source. clone ( ) ) , tx_broadcaster. clone ( ) , logger. clone ( ) , fee_estimator. clone ( ) , kv_store. clone ( ) ) ) ;
1274
1280
let best_block = BestBlock :: from_network ( network) ;
1275
1281
let params = ChainParameters { network, best_block } ;
1276
1282
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 ) ) ;
1283
+
1284
+ let spend_fee_estimator = Arc :: clone ( & fee_estimator) ;
1285
+ let spend_keys_manager = Arc :: clone ( & keys_manager) ;
1286
+ let spend_outputs_callback = move |output_descriptors : & [ & SpendableOutputDescriptor ] | {
1287
+ let fee_rate = spend_fee_estimator
1288
+ . get_est_sat_per_1000_weight ( ConfirmationTarget :: NonAnchorChannelFee ) ;
1289
+ spend_keys_manager. spend_spendable_outputs (
1290
+ output_descriptors,
1291
+ Vec :: new ( ) ,
1292
+ ScriptBuf :: new ( ) ,
1293
+ fee_rate,
1294
+ None ,
1295
+ & Secp256k1 :: new ( ) ,
1296
+ )
1297
+ } ;
1298
+ let sweeper = Arc :: new ( OutputSweeper :: new ( Arc :: clone ( & tx_broadcaster) ,
1299
+ Arc :: clone ( & keys_manager) , Arc :: clone ( & kv_store) , best_block,
1300
+ None :: < Arc < dyn Filter + Sync + Send > > , Arc :: clone ( & logger) , None , spend_outputs_callback) ) ;
1277
1301
let p2p_gossip_sync = Arc :: new ( P2PGossipSync :: new ( network_graph. clone ( ) , Some ( chain_source. clone ( ) ) , logger. clone ( ) ) ) ;
1278
1302
let rapid_gossip_sync = Arc :: new ( RapidGossipSync :: new ( network_graph. clone ( ) , logger. clone ( ) ) ) ;
1279
1303
let msg_handler = MessageHandler {
@@ -1282,7 +1306,7 @@ mod tests {
1282
1306
onion_message_handler : IgnoringMessageHandler { } , custom_message_handler : IgnoringMessageHandler { }
1283
1307
} ;
1284
1308
let peer_manager = Arc :: new ( PeerManager :: new ( msg_handler, 0 , & seed, logger. clone ( ) , keys_manager. clone ( ) ) ) ;
1285
- 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 } ;
1309
+ 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 } ;
1286
1310
nodes. push ( node) ;
1287
1311
}
1288
1312
@@ -1351,15 +1375,18 @@ mod tests {
1351
1375
1 => {
1352
1376
node. node . transactions_confirmed ( & header, & txdata, height) ;
1353
1377
node. chain_monitor . transactions_confirmed ( & header, & txdata, height) ;
1378
+ node. sweeper . transactions_confirmed ( & header, & txdata, height) ;
1354
1379
} ,
1355
1380
x if x == depth => {
1356
1381
node. node . best_block_updated ( & header, height) ;
1357
1382
node. chain_monitor . best_block_updated ( & header, height) ;
1383
+ node. sweeper . best_block_updated ( & header, height) ;
1358
1384
} ,
1359
1385
_ => { } ,
1360
1386
}
1361
1387
}
1362
1388
}
1389
+
1363
1390
fn confirm_transaction ( node : & mut Node , tx : & Transaction ) {
1364
1391
confirm_transaction_depth ( node, tx, ANTI_REORG_DELAY ) ;
1365
1392
}
@@ -1591,6 +1618,9 @@ mod tests {
1591
1618
let _as_channel_update = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendChannelUpdate , nodes[ 1 ] . node. get_our_node_id( ) ) ;
1592
1619
nodes[ 1 ] . node . handle_channel_ready ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_funding) ;
1593
1620
let _bs_channel_update = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendChannelUpdate , nodes[ 0 ] . node. get_our_node_id( ) ) ;
1621
+ let broadcast_funding = nodes[ 0 ] . tx_broadcaster . txn_broadcasted . lock ( ) . unwrap ( ) . pop ( ) . unwrap ( ) ;
1622
+ assert_eq ! ( broadcast_funding. txid( ) , funding_tx. txid( ) ) ;
1623
+ assert ! ( nodes[ 0 ] . tx_broadcaster. txn_broadcasted. lock( ) . unwrap( ) . is_empty( ) ) ;
1594
1624
1595
1625
if !std:: thread:: panicking ( ) {
1596
1626
bg_processor. stop ( ) . unwrap ( ) ;
@@ -1616,10 +1646,22 @@ mod tests {
1616
1646
. recv_timeout ( Duration :: from_secs ( EVENT_DEADLINE ) )
1617
1647
. expect ( "Events not handled within deadline" ) ;
1618
1648
match event {
1619
- Event :: SpendableOutputs { .. } => { } ,
1649
+ Event :: SpendableOutputs { outputs, channel_id } => {
1650
+ nodes[ 0 ] . sweeper . track_spendable_outputs ( outputs, channel_id, false ) ;
1651
+ } ,
1620
1652
_ => panic ! ( "Unexpected event: {:?}" , event) ,
1621
1653
}
1622
1654
1655
+ assert_eq ! ( nodes[ 0 ] . sweeper. tracked_spendable_outputs( ) . len( ) , 1 ) ;
1656
+ let tracked_output = nodes[ 0 ] . sweeper . tracked_spendable_outputs ( ) . first ( ) . unwrap ( ) . clone ( ) ;
1657
+ let sweep_tx = nodes[ 0 ] . tx_broadcaster . txn_broadcasted . lock ( ) . unwrap ( ) . pop ( ) . unwrap ( ) ;
1658
+ assert_eq ! ( sweep_tx. txid( ) , tracked_output. latest_spending_tx. as_ref( ) . unwrap( ) . txid( ) ) ;
1659
+
1660
+ confirm_transaction_depth ( & mut nodes[ 0 ] , & sweep_tx, 5 ) ;
1661
+ assert_eq ! ( nodes[ 0 ] . sweeper. tracked_spendable_outputs( ) . len( ) , 1 ) ;
1662
+ confirm_transaction_depth ( & mut nodes[ 0 ] , & sweep_tx, ANTI_REORG_DELAY ) ;
1663
+ assert_eq ! ( nodes[ 0 ] . sweeper. tracked_spendable_outputs( ) . len( ) , 0 ) ;
1664
+
1623
1665
if !std:: thread:: panicking ( ) {
1624
1666
bg_processor. stop ( ) . unwrap ( ) ;
1625
1667
}
0 commit comments