@@ -1464,3 +1464,59 @@ fn batch_funding_failure() {
1464
1464
check_closed_events ( & nodes[ 0 ] , & close) ;
1465
1465
assert_eq ! ( nodes[ 0 ] . node. list_channels( ) . len( ) , 0 ) ;
1466
1466
}
1467
+
1468
+ #[ test]
1469
+ fn test_force_closure_on_low_stale_fee ( ) {
1470
+ // Check that we force-close channels if they have a low fee and that has gotten stale (without
1471
+ // update).
1472
+ let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
1473
+ let node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
1474
+ let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None ] ) ;
1475
+ let nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
1476
+
1477
+ let chan_id = create_announced_chan_between_nodes ( & nodes, 0 , 1 ) . 2 ;
1478
+
1479
+ // Start by connecting lots of blocks to give LDK some feerate history
1480
+ for _ in 0 ..super :: channelmanager:: FEERATE_TRACKING_BLOCKS * 2 {
1481
+ connect_blocks ( & nodes[ 1 ] , 1 ) ;
1482
+ }
1483
+
1484
+ // Now connect a handful of blocks with a "high" feerate
1485
+ {
1486
+ let mut feerate_lock = chanmon_cfgs[ 1 ] . fee_estimator . sat_per_kw . lock ( ) . unwrap ( ) ;
1487
+ * feerate_lock *= 2 ;
1488
+ }
1489
+ for _ in 0 ..super :: channelmanager:: FEERATE_TRACKING_BLOCKS - 1 {
1490
+ connect_blocks ( & nodes[ 1 ] , 1 ) ;
1491
+ }
1492
+ assert ! ( nodes[ 1 ] . node. get_and_clear_pending_events( ) . is_empty( ) ) ;
1493
+
1494
+ // Now, note that one more block would cause us to force-close, it won't because we've dropped
1495
+ // the feerate
1496
+ {
1497
+ let mut feerate_lock = chanmon_cfgs[ 1 ] . fee_estimator . sat_per_kw . lock ( ) . unwrap ( ) ;
1498
+ * feerate_lock /= 2 ;
1499
+ }
1500
+ connect_blocks ( & nodes[ 1 ] , super :: channelmanager:: FEERATE_TRACKING_BLOCKS as u32 * 2 ) ;
1501
+ assert ! ( nodes[ 1 ] . node. get_and_clear_pending_events( ) . is_empty( ) ) ;
1502
+
1503
+ // Now, connect another FEERATE_TRACKING_BLOCKS - 1 blocks at a high feerate, note that none of
1504
+ // these will cause a force-closure because LDK only looks at the minimium feerate over the
1505
+ // last FEERATE_TRACKING_BLOCKS blocks.
1506
+ {
1507
+ let mut feerate_lock = chanmon_cfgs[ 1 ] . fee_estimator . sat_per_kw . lock ( ) . unwrap ( ) ;
1508
+ * feerate_lock *= 2 ;
1509
+ }
1510
+
1511
+ for _ in 0 ..super :: channelmanager:: FEERATE_TRACKING_BLOCKS - 1 {
1512
+ connect_blocks ( & nodes[ 1 ] , 1 ) ;
1513
+ }
1514
+ assert ! ( nodes[ 1 ] . node. get_and_clear_pending_events( ) . is_empty( ) ) ;
1515
+
1516
+ // Finally, connect one more block and check the force-close happened.
1517
+ connect_blocks ( & nodes[ 1 ] , 1 ) ;
1518
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
1519
+ check_closed_broadcast ( & nodes[ 1 ] , 1 , true ) ;
1520
+ let reason = ClosureReason :: PeerFeerateTooLow { peer_feerate_sat_per_kw : 253 , required_feerate_sat_per_kw : 253 * 2 } ;
1521
+ check_closed_events ( & nodes[ 1 ] , & [ ExpectedCloseEvent :: from_id_reason ( chan_id, false , reason) ] ) ;
1522
+ }
0 commit comments