Skip to content

Commit 5c986fa

Browse files
author
Antoine Riard
committed
-f enforce affordability at holding free
1 parent 50b1401 commit 5c986fa

File tree

1 file changed

+12
-13
lines changed

1 file changed

+12
-13
lines changed

lightning/src/ln/channel.rs

+12-13
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,7 @@ struct HTLCStats {
292292
pending_htlcs_value_msat: u64,
293293
on_counterparty_tx_dust_exposure_msat: u64,
294294
on_holder_tx_dust_exposure_msat: u64,
295+
holding_cell_msat: u64,
295296
}
296297

297298
/// Used when calculating whether we or the remote can afford an additional HTLC.
@@ -1931,6 +1932,7 @@ impl<Signer: Sign> Channel<Signer> {
19311932
pending_htlcs_value_msat: 0,
19321933
on_counterparty_tx_dust_exposure_msat: 0,
19331934
on_holder_tx_dust_exposure_msat: 0,
1935+
holding_cell_msat: 0,
19341936
};
19351937

19361938
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> {
19541956
pending_htlcs_value_msat: 0,
19551957
on_counterparty_tx_dust_exposure_msat: 0,
19561958
on_holder_tx_dust_exposure_msat: 0,
1959+
holding_cell_msat: 0,
19571960
};
19581961

19591962
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> {
19721975
if let &HTLCUpdateAwaitingACK::AddHTLC { ref amount_msat, .. } = update {
19731976
stats.pending_htlcs += 1;
19741977
stats.pending_htlcs_value_msat += amount_msat;
1978+
stats.holding_cell_msat += amount_msat;
19751979
if *amount_msat / 1000 < counterparty_dust_limit_success_sat {
19761980
stats.on_counterparty_tx_dust_exposure_msat += amount_msat;
19771981
}
@@ -2448,7 +2452,7 @@ impl<Signer: Sign> Channel<Signer> {
24482452
let total_fee_sat = Channel::<Signer>::commit_tx_fee_sat(feerate_per_kw, num_htlcs);
24492453
if update_fee {
24502454
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 {
24522456
return Err((None, ChannelError::Close("Funding remote cannot afford proposed new fee".to_owned())));
24532457
}
24542458
}
@@ -2692,12 +2696,7 @@ impl<Signer: Sign> Channel<Signer> {
26922696
return Ok((None, htlcs_to_fail));
26932697
}
26942698
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)
27012700
} else {
27022701
None
27032702
};
@@ -2986,10 +2985,10 @@ impl<Signer: Sign> Channel<Signer> {
29862985
// Before proposing a feerate update, check that we can actually afford the new fee.
29872986
let inbound_stats = self.get_inbound_pending_htlc_stats(Some(feerate_per_kw));
29882987
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);
29902988
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 {
29932992
//TODO: auto-close after a number of failures?
29942993
log_debug!(logger, "Cannot afford to send new feerate at {}", feerate_per_kw);
29952994
return None;
@@ -4575,8 +4574,8 @@ impl<Signer: Sign> Channel<Signer> {
45754574
let counterparty_balance_msat = self.build_commitment_transaction(self.cur_holder_commitment_transaction_number, &keys, true, true, logger).5;
45764575
let htlc_candidate = HTLCCandidate::new(amount_msat, HTLCInitiator::LocalOffered);
45774576
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 {
45804579
return Err(ChannelError::Ignore("Cannot send value that would put counterparty balance under holder-announced channel reserve value".to_owned()));
45814580
}
45824581
}
@@ -4599,7 +4598,7 @@ impl<Signer: Sign> Channel<Signer> {
45994598
}
46004599
}
46014600

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;
46034602
if holder_balance_msat < amount_msat {
46044603
return Err(ChannelError::Ignore(format!("Cannot send value that would overdraw remaining funds. Amount: {}, pending value to self {}", amount_msat, holder_balance_msat)));
46054604
}

0 commit comments

Comments
 (0)