@@ -292,6 +292,7 @@ struct HTLCStats {
292
292
pending_htlcs_value_msat : u64 ,
293
293
on_counterparty_tx_dust_exposure_msat : u64 ,
294
294
on_holder_tx_dust_exposure_msat : u64 ,
295
+ holding_cell_msat : u64 ,
295
296
}
296
297
297
298
/// Used when calculating whether we or the remote can afford an additional HTLC.
@@ -1931,6 +1932,7 @@ impl<Signer: Sign> Channel<Signer> {
1931
1932
pending_htlcs_value_msat : 0 ,
1932
1933
on_counterparty_tx_dust_exposure_msat : 0 ,
1933
1934
on_holder_tx_dust_exposure_msat : 0 ,
1935
+ holding_cell_msat : 0 ,
1934
1936
} ;
1935
1937
1936
1938
let counterparty_dust_limit_timeout_sat = ( self . get_dust_buffer_feerate ( outbound_feerate_update) as u64 * HTLC_TIMEOUT_TX_WEIGHT / 1000 ) + self . counterparty_dust_limit_satoshis ;
@@ -1954,6 +1956,7 @@ impl<Signer: Sign> Channel<Signer> {
1954
1956
pending_htlcs_value_msat : 0 ,
1955
1957
on_counterparty_tx_dust_exposure_msat : 0 ,
1956
1958
on_holder_tx_dust_exposure_msat : 0 ,
1959
+ holding_cell_msat : 0 ,
1957
1960
} ;
1958
1961
1959
1962
let counterparty_dust_limit_success_sat = ( self . get_dust_buffer_feerate ( outbound_feerate_update) as u64 * HTLC_SUCCESS_TX_WEIGHT / 1000 ) + self . counterparty_dust_limit_satoshis ;
@@ -1972,6 +1975,7 @@ impl<Signer: Sign> Channel<Signer> {
1972
1975
if let & HTLCUpdateAwaitingACK :: AddHTLC { ref amount_msat, .. } = update {
1973
1976
stats. pending_htlcs += 1 ;
1974
1977
stats. pending_htlcs_value_msat += amount_msat;
1978
+ stats. holding_cell_msat += amount_msat;
1975
1979
if * amount_msat / 1000 < counterparty_dust_limit_success_sat {
1976
1980
stats. on_counterparty_tx_dust_exposure_msat += amount_msat;
1977
1981
}
@@ -2448,7 +2452,7 @@ impl<Signer: Sign> Channel<Signer> {
2448
2452
let total_fee_sat = Channel :: < Signer > :: commit_tx_fee_sat ( feerate_per_kw, num_htlcs) ;
2449
2453
if update_fee {
2450
2454
let counterparty_reserve_we_require = Channel :: < Signer > :: get_holder_selected_channel_reserve_satoshis ( self . channel_value_satoshis ) ;
2451
- if counterparty_balance_msat * 1000 < total_fee_sat + counterparty_reserve_we_require {
2455
+ if counterparty_balance_msat < total_fee_sat * 1000 + counterparty_reserve_we_require * 1000 {
2452
2456
return Err ( ( None , ChannelError :: Close ( "Funding remote cannot afford proposed new fee" . to_owned ( ) ) ) ) ;
2453
2457
}
2454
2458
}
@@ -2692,12 +2696,7 @@ impl<Signer: Sign> Channel<Signer> {
2692
2696
return Ok ( ( None , htlcs_to_fail) ) ;
2693
2697
}
2694
2698
let update_fee = if let Some ( feerate) = self . holding_cell_update_fee . take ( ) {
2695
- assert ! ( self . is_outbound( ) ) ;
2696
- self . pending_update_fee = Some ( ( feerate, FeeUpdateState :: Outbound ) ) ;
2697
- Some ( msgs:: UpdateFee {
2698
- channel_id : self . channel_id ,
2699
- feerate_per_kw : feerate as u32 ,
2700
- } )
2699
+ self . send_update_fee ( feerate, logger)
2701
2700
} else {
2702
2701
None
2703
2702
} ;
@@ -2986,10 +2985,10 @@ impl<Signer: Sign> Channel<Signer> {
2986
2985
// Before proposing a feerate update, check that we can actually afford the new fee.
2987
2986
let inbound_stats = self . get_inbound_pending_htlc_stats ( Some ( feerate_per_kw) ) ;
2988
2987
let outbound_stats = self . get_outbound_pending_htlc_stats ( Some ( feerate_per_kw) ) ;
2989
- let total_fee_sat = Channel :: < Signer > :: commit_tx_fee_sat ( feerate_per_kw, ( inbound_stats. pending_htlcs + CONCURRENT_INBOUND_HTLC_FEE_BUFFER + outbound_stats. pending_htlcs ) as usize ) ;
2990
2988
let keys = if let Ok ( keys) = self . build_holder_transaction_keys ( self . cur_holder_commitment_transaction_number ) { keys } else { return None ; } ;
2991
- let holder_balance_msat = self . build_commitment_transaction ( self . cur_holder_commitment_transaction_number , & keys, true , true , logger) . 4 ;
2992
- if holder_balance_msat * 1000 < total_fee_sat + self . counterparty_selected_channel_reserve_satoshis . unwrap ( ) {
2989
+ let ( _, _, num_htlcs, _, holder_balance_msat, _) = self . build_commitment_transaction ( self . cur_holder_commitment_transaction_number , & keys, true , true , logger) ;
2990
+ let total_fee_sat = Channel :: < Signer > :: commit_tx_fee_sat ( feerate_per_kw, num_htlcs + CONCURRENT_INBOUND_HTLC_FEE_BUFFER as usize ) ;
2991
+ if holder_balance_msat < total_fee_sat * 1000 + self . counterparty_selected_channel_reserve_satoshis . unwrap ( ) * 1000 {
2993
2992
//TODO: auto-close after a number of failures?
2994
2993
log_debug ! ( logger, "Cannot afford to send new feerate at {}" , feerate_per_kw) ;
2995
2994
return None ;
@@ -4575,8 +4574,8 @@ impl<Signer: Sign> Channel<Signer> {
4575
4574
let counterparty_balance_msat = self . build_commitment_transaction ( self . cur_holder_commitment_transaction_number , & keys, true , true , logger) . 5 ;
4576
4575
let htlc_candidate = HTLCCandidate :: new ( amount_msat, HTLCInitiator :: LocalOffered ) ;
4577
4576
let counterparty_commit_tx_fee_msat = self . next_remote_commit_tx_fee_msat ( htlc_candidate, None ) ;
4578
- let holder_selected_chan_reserve = Channel :: < Signer > :: get_holder_selected_channel_reserve_satoshis ( self . channel_value_satoshis ) ;
4579
- if counterparty_balance_msat < counterparty_commit_tx_fee_msat + holder_selected_chan_reserve {
4577
+ let holder_selected_chan_reserve_msat = Channel :: < Signer > :: get_holder_selected_channel_reserve_satoshis ( self . channel_value_satoshis ) * 1000 ;
4578
+ if counterparty_balance_msat < counterparty_commit_tx_fee_msat + holder_selected_chan_reserve_msat {
4580
4579
return Err ( ChannelError :: Ignore ( "Cannot send value that would put counterparty balance under holder-announced channel reserve value" . to_owned ( ) ) ) ;
4581
4580
}
4582
4581
}
@@ -4599,7 +4598,7 @@ impl<Signer: Sign> Channel<Signer> {
4599
4598
}
4600
4599
}
4601
4600
4602
- let holder_balance_msat = self . build_commitment_transaction ( self . cur_holder_commitment_transaction_number , & keys, true , true , logger) . 4 as u64 ;
4601
+ let holder_balance_msat = self . build_commitment_transaction ( self . cur_holder_commitment_transaction_number , & keys, true , true , logger) . 4 as u64 - outbound_stats . holding_cell_msat ;
4603
4602
if holder_balance_msat < amount_msat {
4604
4603
return Err ( ChannelError :: Ignore ( format ! ( "Cannot send value that would overdraw remaining funds. Amount: {}, pending value to self {}" , amount_msat, holder_balance_msat) ) ) ;
4605
4604
}
0 commit comments