@@ -9458,3 +9458,81 @@ fn test_non_final_funding_tx() {
9458
9458
assert ! ( nodes[ 0 ] . node. funding_transaction_generated( & temp_channel_id, & nodes[ 1 ] . node. get_our_node_id( ) , tx. clone( ) ) . is_ok( ) ) ;
9459
9459
get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendFundingCreated , nodes[ 1 ] . node. get_our_node_id( ) ) ;
9460
9460
}
9461
+
9462
+ #[ test]
9463
+ fn accept_busted_but_better_fee ( ) {
9464
+ // If a peer sends us a fee update that is too low, but higher than our previous channel
9465
+ // feerate, we should accept it. In the future we may want to consider closing the channel
9466
+ // later, but for now we only accept the update.
9467
+ let mut chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
9468
+ let node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
9469
+ let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None ] ) ;
9470
+ let nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
9471
+
9472
+ create_chan_between_nodes ( & nodes[ 0 ] , & nodes[ 1 ] , channelmanager:: provided_init_features ( ) , channelmanager:: provided_init_features ( ) ) ;
9473
+
9474
+ // Set nodes[1] to expect 5,000 sat/kW.
9475
+ {
9476
+ let mut feerate_lock = chanmon_cfgs[ 1 ] . fee_estimator . sat_per_kw . lock ( ) . unwrap ( ) ;
9477
+ * feerate_lock = 5000 ;
9478
+ }
9479
+
9480
+ // If nodes[0] increases their feerate, even if its not enough, nodes[1] should accept it.
9481
+ {
9482
+ let mut feerate_lock = chanmon_cfgs[ 0 ] . fee_estimator . sat_per_kw . lock ( ) . unwrap ( ) ;
9483
+ * feerate_lock = 1000 ;
9484
+ }
9485
+ nodes[ 0 ] . node . timer_tick_occurred ( ) ;
9486
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
9487
+
9488
+ let events = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
9489
+ assert_eq ! ( events. len( ) , 1 ) ;
9490
+ match events[ 0 ] {
9491
+ MessageSendEvent :: UpdateHTLCs { updates : msgs:: CommitmentUpdate { ref update_fee, ref commitment_signed, .. } , .. } => {
9492
+ nodes[ 1 ] . node . handle_update_fee ( & nodes[ 0 ] . node . get_our_node_id ( ) , update_fee. as_ref ( ) . unwrap ( ) ) ;
9493
+ commitment_signed_dance ! ( nodes[ 1 ] , nodes[ 0 ] , commitment_signed, false ) ;
9494
+ } ,
9495
+ _ => panic ! ( "Unexpected event" ) ,
9496
+ } ;
9497
+
9498
+ // If nodes[0] increases their feerate further, even if its not enough, nodes[1] should accept
9499
+ // it.
9500
+ {
9501
+ let mut feerate_lock = chanmon_cfgs[ 0 ] . fee_estimator . sat_per_kw . lock ( ) . unwrap ( ) ;
9502
+ * feerate_lock = 2000 ;
9503
+ }
9504
+ nodes[ 0 ] . node . timer_tick_occurred ( ) ;
9505
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
9506
+
9507
+ let events = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
9508
+ assert_eq ! ( events. len( ) , 1 ) ;
9509
+ match events[ 0 ] {
9510
+ MessageSendEvent :: UpdateHTLCs { updates : msgs:: CommitmentUpdate { ref update_fee, ref commitment_signed, .. } , .. } => {
9511
+ nodes[ 1 ] . node . handle_update_fee ( & nodes[ 0 ] . node . get_our_node_id ( ) , update_fee. as_ref ( ) . unwrap ( ) ) ;
9512
+ commitment_signed_dance ! ( nodes[ 1 ] , nodes[ 0 ] , commitment_signed, false ) ;
9513
+ } ,
9514
+ _ => panic ! ( "Unexpected event" ) ,
9515
+ } ;
9516
+
9517
+ // However, if nodes[0] decreases their feerate, nodes[1] should reject it and close the
9518
+ // channel.
9519
+ {
9520
+ let mut feerate_lock = chanmon_cfgs[ 0 ] . fee_estimator . sat_per_kw . lock ( ) . unwrap ( ) ;
9521
+ * feerate_lock = 1000 ;
9522
+ }
9523
+ nodes[ 0 ] . node . timer_tick_occurred ( ) ;
9524
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
9525
+
9526
+ let events = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
9527
+ assert_eq ! ( events. len( ) , 1 ) ;
9528
+ match events[ 0 ] {
9529
+ MessageSendEvent :: UpdateHTLCs { updates : msgs:: CommitmentUpdate { ref update_fee, .. } , .. } => {
9530
+ nodes[ 1 ] . node . handle_update_fee ( & nodes[ 0 ] . node . get_our_node_id ( ) , update_fee. as_ref ( ) . unwrap ( ) ) ;
9531
+ check_closed_event ! ( nodes[ 1 ] , 1 , ClosureReason :: ProcessingError {
9532
+ err: "Peer's feerate much too low. Actual: 1000. Our expected lower limit: 5000 (- 250)" . to_owned( ) } ) ;
9533
+ check_closed_broadcast ! ( nodes[ 1 ] , true ) ;
9534
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
9535
+ } ,
9536
+ _ => panic ! ( "Unexpected event" ) ,
9537
+ } ;
9538
+ }
0 commit comments