@@ -5804,6 +5804,62 @@ fn bolt2_open_channel_sending_node_checks_part2() {
5804
5804
assert ! ( PublicKey :: from_slice( & node0_to_1_send_open_channel. delayed_payment_basepoint. serialize( ) ) . is_ok( ) ) ;
5805
5805
}
5806
5806
5807
+ #[ test]
5808
+ fn test_holding_cell_htlc_with_pending_fee_update ( ) {
5809
+ let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
5810
+ let node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
5811
+ let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None ] ) ;
5812
+ let mut nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
5813
+ let chan = create_announced_chan_between_nodes_with_value ( & nodes, 0 , 1 , 100000 , 95000000 , InitFeatures :: supported ( ) , InitFeatures :: supported ( ) ) ;
5814
+
5815
+ // First nodes[0] generates an update_fee, setting the channel's
5816
+ // pending_update_fee.
5817
+ nodes[ 0 ] . node . update_fee ( chan. 2 , get_feerate ! ( nodes[ 0 ] , chan. 2 ) + 20 ) . unwrap ( ) ;
5818
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
5819
+
5820
+ let events_0 = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
5821
+ assert_eq ! ( events_0. len( ) , 1 ) ;
5822
+ let ( update_msg, commitment_signed) = match events_0[ 0 ] { // (1)
5823
+ MessageSendEvent :: UpdateHTLCs { updates : msgs:: CommitmentUpdate { ref update_fee, ref commitment_signed, .. } , .. } => {
5824
+ ( update_fee. as_ref ( ) , commitment_signed)
5825
+ } ,
5826
+ _ => panic ! ( "Unexpected event" ) ,
5827
+ } ;
5828
+
5829
+ nodes[ 1 ] . node . handle_update_fee ( & nodes[ 0 ] . node . get_our_node_id ( ) , update_msg. unwrap ( ) ) ;
5830
+
5831
+ let mut chan_stat = get_channel_value_stat ! ( nodes[ 0 ] , chan. 2 ) ;
5832
+ let their_channel_reserve = chan_stat. channel_reserve_msat ;
5833
+ let commit_tx_fee_base = chan_stat. commit_tx_fee_outbound ;
5834
+ let commit_tx_fee_per_htlc = COMMITMENT_TX_WEIGHT_PER_HTLC * get_feerate ! ( nodes[ 0 ] , chan. 2 ) ;
5835
+ let fee_spike_reserve = 2 * get_feerate ! ( nodes[ 0 ] , chan. 2 ) ;
5836
+
5837
+ let max_can_send = 5000000 - their_channel_reserve - commit_tx_fee_base - 2 * commit_tx_fee_per_htlc - fee_spike_reserve;
5838
+ let route = nodes[ 0 ] . router . get_route ( & nodes[ 1 ] . node . get_our_node_id ( ) , None , & [ ] , max_can_send, TEST_FINAL_CLTV ) . unwrap ( ) ;
5839
+ let ( _, our_payment_hash) = get_payment_preimage_hash ! ( nodes[ 0 ] ) ;
5840
+
5841
+ // Send a payment which passes reserve checks but gets stuck in the holding cell.
5842
+ nodes[ 0 ] . node . send_payment ( & route, our_payment_hash, & None ) . unwrap ( ) ;
5843
+ chan_stat = get_channel_value_stat ! ( nodes[ 0 ] , chan. 2 ) ;
5844
+ assert_eq ! ( chan_stat. holding_cell_outbound_amount_msat, max_can_send) ;
5845
+
5846
+ // Flush the pending fee update.
5847
+ nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , commitment_signed) ;
5848
+ let ( as_revoke_and_ack, _) = get_revoke_commit_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
5849
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
5850
+ nodes[ 0 ] . node . handle_revoke_and_ack ( & nodes[ 1 ] . node . get_our_node_id ( ) , & as_revoke_and_ack) ;
5851
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
5852
+
5853
+ // Upon receipt of the RAA, there will be an attempt to resend the holding cell
5854
+ // HTLC, but now that the fee has been raised the payment will now fail, causing
5855
+ // it to be put back in the holding cell.
5856
+ chan_stat = get_channel_value_stat ! ( nodes[ 0 ] , chan. 2 ) ;
5857
+ assert_eq ! ( chan_stat. holding_cell_outbound_amount_msat, max_can_send) ;
5858
+ nodes[ 0 ] . logger . assert_log ( "lightning::ln::channel" . to_string ( ) , "Freeing holding cell with 1 HTLC updates" . to_string ( ) , 1 ) ;
5859
+ let failure_log = format ! ( "Failed to send HTLC with payment_hash {} due to Cannot send value that would put us over their reserve value" , log_bytes!( our_payment_hash. 0 ) ) ;
5860
+ nodes[ 0 ] . logger . assert_log ( "lightning::ln::channel" . to_string ( ) , failure_log. to_string ( ) , 1 ) ;
5861
+ }
5862
+
5807
5863
// BOLT 2 Requirements for the Sender when constructing and sending an update_add_htlc message.
5808
5864
// BOLT 2 Requirement: MUST NOT offer amount_msat it cannot pay for in the remote commitment transaction at the current feerate_per_kw (see "Updating Fees") while maintaining its channel reserve.
5809
5865
//TODO: I don't believe this is explicitly enforced when sending an HTLC but as the Fee aspect of the BOLT specs is in flux leaving this as a TODO.
0 commit comments