Skip to content

Commit 572efa4

Browse files
committed
Consider fees and anchor in balances when checking reserve requirements
1 parent 78105f8 commit 572efa4

File tree

1 file changed

+44
-3
lines changed

1 file changed

+44
-3
lines changed

lightning/src/ln/channel.rs

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10402,6 +10402,43 @@ where
1040210402
Ok(splice_ack_msg)
1040310403
}
1040410404

10405+
/// Compute the channel balances (local & remote) by taking into account fees, anchor values, and dust limits.
10406+
#[cfg(splicing)]
10407+
fn compute_balances_less_fees(&self, channel_value_sats: u64, value_to_self_msat: u64, is_local: bool) -> (u64, u64) {
10408+
let feerate_per_kw = self.context.feerate_per_kw;
10409+
10410+
// compute 'raw' counterparty balance
10411+
let value_to_remote_msat: i64 = ((channel_value_sats * 1000) as i64).saturating_sub(value_to_self_msat as i64);
10412+
debug_assert!(value_to_remote_msat >= 0);
10413+
10414+
let total_fee_sat = commit_tx_fee_sat(feerate_per_kw, 0, &self.funding.channel_transaction_parameters.channel_type_features);
10415+
let anchors_val = if self.funding.channel_transaction_parameters.channel_type_features.supports_anchors_zero_fee_htlc_tx() { ANCHOR_OUTPUT_VALUE_SATOSHI * 2 } else { 0 } as i64;
10416+
10417+
// consider fees and anchor values
10418+
let (mut value_to_self, mut value_to_remote) = if self.funding.is_outbound() {
10419+
((value_to_self_msat as i64) / 1000 - anchors_val - total_fee_sat as i64, value_to_remote_msat / 1000)
10420+
} else {
10421+
((value_to_self_msat as i64) / 1000, value_to_remote_msat / 1000 - anchors_val - total_fee_sat as i64)
10422+
};
10423+
10424+
// consider dust limit
10425+
let broadcaster_dust_limit_satoshis = if is_local {
10426+
self.context.holder_dust_limit_satoshis
10427+
} else {
10428+
self.context.counterparty_dust_limit_satoshis
10429+
} as i64;
10430+
if value_to_self < broadcaster_dust_limit_satoshis {
10431+
value_to_self = 0;
10432+
}
10433+
debug_assert!(value_to_self >= 0);
10434+
if value_to_remote < broadcaster_dust_limit_satoshis {
10435+
value_to_remote = 0;
10436+
}
10437+
debug_assert!(value_to_remote >= 0);
10438+
10439+
(value_to_self as u64, value_to_remote as u64)
10440+
}
10441+
1040510442
/// Handle splice_ack
1040610443
#[cfg(splicing)]
1040710444
pub fn splice_ack(&mut self, msg: &msgs::SpliceAck) -> Result<(), ChannelError> {
@@ -10421,11 +10458,15 @@ where
1042110458
let post_channel_value = PendingSplice::compute_post_value(pre_channel_value, our_funding_contribution, their_funding_contribution_satoshis);
1042210459
let pre_balance_self = self.funding.value_to_self_msat;
1042310460
let post_balance_self = PendingSplice::add_checked(pre_balance_self, our_funding_contribution);
10424-
let pre_balance_counterparty = pre_channel_value.saturating_sub(pre_balance_self);
10425-
let post_balance_counterparty = post_channel_value.saturating_sub(post_balance_self);
10461+
let (pre_balance_self_less_fees, pre_balance_counterparty_less_fees) = self.compute_balances_less_fees(pre_channel_value, pre_balance_self, true);
10462+
let (post_balance_self_less_fees, post_balance_counterparty_less_fees) = self.compute_balances_less_fees(post_channel_value, post_balance_self, true);
1042610463
// Pre-check for reserve requirement
1042710464
// This will also be checked later at tx_complete
10428-
let _res = self.context.check_splice_balances_meet_v2_reserve_requirements(pre_balance_self, post_balance_self, pre_balance_counterparty, post_balance_counterparty, pre_channel_value, post_channel_value)?;
10465+
let _res = self.context.check_splice_balances_meet_v2_reserve_requirements(
10466+
pre_balance_self_less_fees, post_balance_self_less_fees,
10467+
pre_balance_counterparty_less_fees, post_balance_counterparty_less_fees,
10468+
pre_channel_value, post_channel_value
10469+
)?;
1042910470
Ok(())
1043010471
}
1043110472

0 commit comments

Comments
 (0)