From 56b73e77291d2fc8124f7092d03aa081eb86c54d Mon Sep 17 00:00:00 2001 From: Arik Sosman Date: Mon, 10 Feb 2025 22:27:36 -0800 Subject: [PATCH] f: return global minimum --- lightning/src/chain/channelmonitor.rs | 28 +++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/lightning/src/chain/channelmonitor.rs b/lightning/src/chain/channelmonitor.rs index 0bcca3b313c..f43687ad735 100644 --- a/lightning/src/chain/channelmonitor.rs +++ b/lightning/src/chain/channelmonitor.rs @@ -2743,35 +2743,47 @@ impl ChannelMonitorImpl { fn closure_conf_target(&self) -> ConfirmationTarget { // Treat the sweep as urgent as long as there is at least one HTLC which is pending on a // valid commitment transaction. + let mut minimum_expiry = None; + let update_minimum_expiry = |local_minimum: Option, global_minimum: &mut Option| { + if let Some(expiry) = local_minimum { + *global_minimum = Some(global_minimum.map_or(expiry, |m| cmp::min(expiry, m))); + } + }; + if !self.current_holder_commitment_tx.htlc_outputs.is_empty() { - let minimum_expiry = self.current_holder_commitment_tx.htlc_outputs + let local_minimum_expiry = self.current_holder_commitment_tx.htlc_outputs .iter() .map(|o| o.0.cltv_expiry) .min(); - return ConfirmationTarget::UrgentOnChainSweep(minimum_expiry); + update_minimum_expiry(local_minimum_expiry, &mut minimum_expiry); } if self.prev_holder_signed_commitment_tx.as_ref().map(|t| !t.htlc_outputs.is_empty()).unwrap_or(false) { - let minimum_expiry = self.prev_holder_signed_commitment_tx.as_ref().map(|t| t.htlc_outputs + let local_minimum_expiry = self.prev_holder_signed_commitment_tx.as_ref().map(|t| t.htlc_outputs .iter() .map(|o| o.0.cltv_expiry) .min() ).flatten(); - return ConfirmationTarget::UrgentOnChainSweep(minimum_expiry); + update_minimum_expiry(local_minimum_expiry, &mut minimum_expiry); } if let Some(txid) = self.current_counterparty_commitment_txid { let claimable_outpoints = self.counterparty_claimable_outpoints.get(&txid).unwrap(); if !claimable_outpoints.is_empty() { - let minimum_expiry = claimable_outpoints.iter().map(|o|o.0.cltv_expiry).min(); - return ConfirmationTarget::UrgentOnChainSweep(minimum_expiry); + let local_minimum_expiry = claimable_outpoints.iter().map(|o|o.0.cltv_expiry).min(); + update_minimum_expiry(local_minimum_expiry, &mut minimum_expiry); } } if let Some(txid) = self.prev_counterparty_commitment_txid { let claimable_outpoints = self.counterparty_claimable_outpoints.get(&txid).unwrap(); if !claimable_outpoints.is_empty() { - let minimum_expiry = claimable_outpoints.iter().map(|o|o.0.cltv_expiry).min(); - return ConfirmationTarget::UrgentOnChainSweep(minimum_expiry); + let local_minimum_expiry = claimable_outpoints.iter().map(|o|o.0.cltv_expiry).min(); + update_minimum_expiry(local_minimum_expiry, &mut minimum_expiry); } } + + if let Some(global_minimum) = minimum_expiry { + return ConfirmationTarget::UrgentOnChainSweep(Some(global_minimum)) + } + ConfirmationTarget::OutputSpendingFee }