@@ -918,17 +918,18 @@ 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
- use lightning:: { get_event_msg, get_event} ;
932
933
use lightning:: ln:: PaymentHash ;
933
934
use lightning:: ln:: channelmanager;
934
935
use lightning:: ln:: channelmanager:: { BREAKDOWN_TIMEOUT , ChainParameters , MIN_CLTV_EXPIRY_DELTA , PaymentId } ;
@@ -946,6 +947,7 @@ mod tests {
946
947
CHANNEL_MANAGER_PERSISTENCE_PRIMARY_NAMESPACE , CHANNEL_MANAGER_PERSISTENCE_SECONDARY_NAMESPACE , CHANNEL_MANAGER_PERSISTENCE_KEY ,
947
948
NETWORK_GRAPH_PERSISTENCE_PRIMARY_NAMESPACE , NETWORK_GRAPH_PERSISTENCE_SECONDARY_NAMESPACE , NETWORK_GRAPH_PERSISTENCE_KEY ,
948
949
SCORER_PERSISTENCE_PRIMARY_NAMESPACE , SCORER_PERSISTENCE_SECONDARY_NAMESPACE , SCORER_PERSISTENCE_KEY } ;
950
+ use lightning:: util:: sweep:: OutputSweeper ;
949
951
use lightning_persister:: fs_store:: FilesystemStore ;
950
952
use std:: collections:: VecDeque ;
951
953
use std:: { fs, env} ;
@@ -1007,6 +1009,7 @@ mod tests {
1007
1009
logger : Arc < test_utils:: TestLogger > ,
1008
1010
best_block : BestBlock ,
1009
1011
scorer : Arc < LockingWrapper < TestScorer > > ,
1012
+ sweeper : Arc < OutputSweeper < Arc < test_utils:: TestBroadcaster > , Arc < KeysManager > , Arc < dyn Filter > , Arc < FilesystemStore > , Arc < test_utils:: TestLogger > > > ,
1010
1013
}
1011
1014
1012
1015
impl Node {
@@ -1269,10 +1272,29 @@ mod tests {
1269
1272
let kv_store = Arc :: new ( FilesystemStore :: new ( format ! ( "{}_persister_{}" , & persist_dir, i) . into ( ) ) ) ;
1270
1273
let now = Duration :: from_secs ( genesis_block. header . time as u64 ) ;
1271
1274
let keys_manager = Arc :: new ( KeysManager :: new ( & seed, now. as_secs ( ) , now. subsec_nanos ( ) ) ) ;
1275
+
1272
1276
let chain_monitor = Arc :: new ( chainmonitor:: ChainMonitor :: new ( Some ( chain_source. clone ( ) ) , tx_broadcaster. clone ( ) , logger. clone ( ) , fee_estimator. clone ( ) , kv_store. clone ( ) ) ) ;
1273
1277
let best_block = BestBlock :: from_network ( network) ;
1274
1278
let params = ChainParameters { network, best_block } ;
1275
1279
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 > > , Arc :: clone ( & logger) , None , spend_outputs_callback) ) ;
1276
1298
let p2p_gossip_sync = Arc :: new ( P2PGossipSync :: new ( network_graph. clone ( ) , Some ( chain_source. clone ( ) ) , logger. clone ( ) ) ) ;
1277
1299
let rapid_gossip_sync = Arc :: new ( RapidGossipSync :: new ( network_graph. clone ( ) , logger. clone ( ) ) ) ;
1278
1300
let msg_handler = MessageHandler {
@@ -1281,7 +1303,7 @@ mod tests {
1281
1303
onion_message_handler : IgnoringMessageHandler { } , custom_message_handler : IgnoringMessageHandler { }
1282
1304
} ;
1283
1305
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 } ;
1285
1307
nodes. push ( node) ;
1286
1308
}
1287
1309
@@ -1350,15 +1372,18 @@ mod tests {
1350
1372
1 => {
1351
1373
node. node . transactions_confirmed ( & header, & txdata, height) ;
1352
1374
node. chain_monitor . transactions_confirmed ( & header, & txdata, height) ;
1375
+ node. sweeper . transactions_confirmed ( & header, & txdata, height) ;
1353
1376
} ,
1354
1377
x if x == depth => {
1355
1378
node. node . best_block_updated ( & header, height) ;
1356
1379
node. chain_monitor . best_block_updated ( & header, height) ;
1380
+ node. sweeper . best_block_updated ( & header, height) ;
1357
1381
} ,
1358
1382
_ => { } ,
1359
1383
}
1360
1384
}
1361
1385
}
1386
+
1362
1387
fn confirm_transaction ( node : & mut Node , tx : & Transaction ) {
1363
1388
confirm_transaction_depth ( node, tx, ANTI_REORG_DELAY ) ;
1364
1389
}
@@ -1590,6 +1615,9 @@ mod tests {
1590
1615
let _as_channel_update = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendChannelUpdate , nodes[ 1 ] . node. get_our_node_id( ) ) ;
1591
1616
nodes[ 1 ] . node . handle_channel_ready ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_funding) ;
1592
1617
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( ) ) ;
1593
1621
1594
1622
if !std:: thread:: panicking ( ) {
1595
1623
bg_processor. stop ( ) . unwrap ( ) ;
@@ -1615,10 +1643,22 @@ mod tests {
1615
1643
. recv_timeout ( Duration :: from_secs ( EVENT_DEADLINE ) )
1616
1644
. expect ( "Events not handled within deadline" ) ;
1617
1645
match event {
1618
- Event :: SpendableOutputs { .. } => { } ,
1646
+ Event :: SpendableOutputs { outputs, channel_id } => {
1647
+ nodes[ 0 ] . sweeper . track_spendable_outputs ( outputs, channel_id, false ) ;
1648
+ } ,
1619
1649
_ => panic ! ( "Unexpected event: {:?}" , event) ,
1620
1650
}
1621
1651
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
+
1622
1662
if !std:: thread:: panicking ( ) {
1623
1663
bg_processor. stop ( ) . unwrap ( ) ;
1624
1664
}
0 commit comments