@@ -2743,35 +2743,47 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
2743
2743
fn closure_conf_target ( & self ) -> ConfirmationTarget {
2744
2744
// Treat the sweep as urgent as long as there is at least one HTLC which is pending on a
2745
2745
// valid commitment transaction.
2746
+ let mut minimum_expiry = None ;
2747
+ let update_minimum_expiry = |local_minimum : Option < u32 > , global_minimum : & mut Option < u32 > | {
2748
+ if let Some ( expiry) = local_minimum {
2749
+ * global_minimum = Some ( global_minimum. map_or ( expiry, |m| cmp:: min ( expiry, m) ) ) ;
2750
+ }
2751
+ } ;
2752
+
2746
2753
if !self . current_holder_commitment_tx . htlc_outputs . is_empty ( ) {
2747
- let minimum_expiry = self . current_holder_commitment_tx . htlc_outputs
2754
+ let local_minimum_expiry = self . current_holder_commitment_tx . htlc_outputs
2748
2755
. iter ( )
2749
2756
. map ( |o| o. 0 . cltv_expiry )
2750
2757
. min ( ) ;
2751
- return ConfirmationTarget :: UrgentOnChainSweep ( minimum_expiry) ;
2758
+ update_minimum_expiry ( local_minimum_expiry , & mut minimum_expiry) ;
2752
2759
}
2753
2760
if self . prev_holder_signed_commitment_tx . as_ref ( ) . map ( |t| !t. htlc_outputs . is_empty ( ) ) . unwrap_or ( false ) {
2754
- let minimum_expiry = self . prev_holder_signed_commitment_tx . as_ref ( ) . map ( |t| t. htlc_outputs
2761
+ let local_minimum_expiry = self . prev_holder_signed_commitment_tx . as_ref ( ) . map ( |t| t. htlc_outputs
2755
2762
. iter ( )
2756
2763
. map ( |o| o. 0 . cltv_expiry )
2757
2764
. min ( )
2758
2765
) . flatten ( ) ;
2759
- return ConfirmationTarget :: UrgentOnChainSweep ( minimum_expiry) ;
2766
+ update_minimum_expiry ( local_minimum_expiry , & mut minimum_expiry) ;
2760
2767
}
2761
2768
if let Some ( txid) = self . current_counterparty_commitment_txid {
2762
2769
let claimable_outpoints = self . counterparty_claimable_outpoints . get ( & txid) . unwrap ( ) ;
2763
2770
if !claimable_outpoints. is_empty ( ) {
2764
- let minimum_expiry = claimable_outpoints. iter ( ) . map ( |o|o. 0 . cltv_expiry ) . min ( ) ;
2765
- return ConfirmationTarget :: UrgentOnChainSweep ( minimum_expiry) ;
2771
+ let local_minimum_expiry = claimable_outpoints. iter ( ) . map ( |o|o. 0 . cltv_expiry ) . min ( ) ;
2772
+ update_minimum_expiry ( local_minimum_expiry , & mut minimum_expiry) ;
2766
2773
}
2767
2774
}
2768
2775
if let Some ( txid) = self . prev_counterparty_commitment_txid {
2769
2776
let claimable_outpoints = self . counterparty_claimable_outpoints . get ( & txid) . unwrap ( ) ;
2770
2777
if !claimable_outpoints. is_empty ( ) {
2771
- let minimum_expiry = claimable_outpoints. iter ( ) . map ( |o|o. 0 . cltv_expiry ) . min ( ) ;
2772
- return ConfirmationTarget :: UrgentOnChainSweep ( minimum_expiry) ;
2778
+ let local_minimum_expiry = claimable_outpoints. iter ( ) . map ( |o|o. 0 . cltv_expiry ) . min ( ) ;
2779
+ update_minimum_expiry ( local_minimum_expiry , & mut minimum_expiry) ;
2773
2780
}
2774
2781
}
2782
+
2783
+ if let Some ( global_minimum) = minimum_expiry {
2784
+ return ConfirmationTarget :: UrgentOnChainSweep ( Some ( global_minimum) )
2785
+ }
2786
+
2775
2787
ConfirmationTarget :: OutputSpendingFee
2776
2788
}
2777
2789
0 commit comments