@@ -1268,6 +1268,14 @@ pub(crate) struct ChannelMonitorImpl<Signer: EcdsaChannelSigner> {
12681268 /// The node_id of our counterparty
12691269 counterparty_node_id : PublicKey ,
12701270
1271+ /// Controls whether the monitor is allowed to automatically broadcast the latest holder commitment transaction.
1272+ ///
1273+ /// This flag is set to `false` when a channel is force-closed with `should_broadcast: false`,
1274+ /// indicating that broadcasting the latest holder commitment transaction would be unsafe.
1275+ ///
1276+ /// Default: `true`.
1277+ allow_automated_broadcast : bool ,
1278+
12711279 /// Initial counterparty commmitment data needed to recreate the commitment tx
12721280 /// in the persistence pipeline for third-party watchtowers. This will only be present on
12731281 /// monitors created after 0.0.117.
@@ -1569,6 +1577,7 @@ impl<Signer: EcdsaChannelSigner> Writeable for ChannelMonitorImpl<Signer> {
15691577 ( 27 , self . first_confirmed_funding_txo, required) ,
15701578 ( 29 , self . initial_counterparty_commitment_tx, option) ,
15711579 ( 31 , self . funding. channel_parameters, required) ,
1580+ ( 33 , self . allow_automated_broadcast, required) ,
15721581 ( 32 , self . pending_funding, optional_vec) ,
15731582 } ) ;
15741583
@@ -1788,6 +1797,7 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitor<Signer> {
17881797
17891798 best_block,
17901799 counterparty_node_id : counterparty_node_id,
1800+ allow_automated_broadcast : true ,
17911801 initial_counterparty_commitment_info : None ,
17921802 initial_counterparty_commitment_tx : None ,
17931803 balances_empty_height : None ,
@@ -2144,7 +2154,7 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitor<Signer> {
21442154 /// may be to contact the other node operator out-of-band to coordinate other options available
21452155 /// to you.
21462156 #[ rustfmt:: skip]
2147- pub fn broadcast_latest_holder_commitment_txn < B : Deref , F : Deref , L : Deref > (
2157+ pub fn force_broadcast_latest_holder_commitment_txn_unsafe < B : Deref , F : Deref , L : Deref > (
21482158 & self , broadcaster : & B , fee_estimator : & F , logger : & L
21492159 )
21502160 where
@@ -3681,6 +3691,32 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
36813691 Ok ( ( ) )
36823692 }
36833693
3694+ fn maybe_broadcast_latest_holder_commitment_txn < B : Deref , F : Deref , L : Deref > (
3695+ & mut self , broadcaster : & B , fee_estimator : & LowerBoundedFeeEstimator < F > ,
3696+ logger : & WithChannelMonitor < L > ,
3697+ ) where
3698+ B :: Target : BroadcasterInterface ,
3699+ F :: Target : FeeEstimator ,
3700+ L :: Target : Logger ,
3701+ {
3702+ if !self . allow_automated_broadcast {
3703+ return ;
3704+ }
3705+ let detected_funding_spend = self . funding_spend_confirmed . is_some ( )
3706+ || self
3707+ . onchain_events_awaiting_threshold_conf
3708+ . iter ( )
3709+ . any ( |event| matches ! ( event. event, OnchainEvent :: FundingSpendConfirmation { .. } ) ) ;
3710+ if detected_funding_spend {
3711+ log_trace ! (
3712+ logger,
3713+ "Avoiding commitment broadcast, already detected confirmed spend onchain"
3714+ ) ;
3715+ return ;
3716+ }
3717+ self . queue_latest_holder_commitment_txn_for_broadcast ( broadcaster, fee_estimator, logger) ;
3718+ }
3719+
36843720 #[ rustfmt:: skip]
36853721 fn update_monitor < B : Deref , F : Deref , L : Deref > (
36863722 & mut self , updates : & ChannelMonitorUpdate , broadcaster : & B , fee_estimator : & F , logger : & WithChannelMonitor < L >
@@ -3774,28 +3810,14 @@ impl<Signer: EcdsaChannelSigner> ChannelMonitorImpl<Signer> {
37743810 ChannelMonitorUpdateStep :: ChannelForceClosed { should_broadcast } => {
37753811 log_trace ! ( logger, "Updating ChannelMonitor: channel force closed, should broadcast: {}" , should_broadcast) ;
37763812 self . lockdown_from_offchain = true ;
3777- if * should_broadcast {
3778- // There's no need to broadcast our commitment transaction if we've seen one
3779- // confirmed (even with 1 confirmation) as it'll be rejected as
3780- // duplicate/conflicting.
3781- let detected_funding_spend = self . funding_spend_confirmed . is_some ( ) ||
3782- self . onchain_events_awaiting_threshold_conf . iter ( ) . any (
3783- |event| matches ! ( event. event, OnchainEvent :: FundingSpendConfirmation { .. } ) ) ;
3784- if detected_funding_spend {
3785- log_trace ! ( logger, "Avoiding commitment broadcast, already detected confirmed spend onchain" ) ;
3786- continue ;
3787- }
3788- self . queue_latest_holder_commitment_txn_for_broadcast ( broadcaster, & bounded_fee_estimator, logger) ;
3789- } else if !self . holder_tx_signed {
3790- log_error ! ( logger, "WARNING: You have a potentially-unsafe holder commitment transaction available to broadcast" ) ;
3791- log_error ! ( logger, " in channel monitor for channel {}!" , & self . channel_id( ) ) ;
3792- log_error ! ( logger, " Read the docs for ChannelMonitor::broadcast_latest_holder_commitment_txn to take manual action!" ) ;
3793- } else {
3813+ self . allow_automated_broadcast = * should_broadcast;
3814+ if !* should_broadcast && self . holder_tx_signed {
37943815 // If we generated a MonitorEvent::HolderForceClosed, the ChannelManager
37953816 // will still give us a ChannelForceClosed event with !should_broadcast, but we
37963817 // shouldn't print the scary warning above.
37973818 log_info ! ( logger, "Channel off-chain state closed after we broadcasted our latest commitment transaction." ) ;
37983819 }
3820+ self . maybe_broadcast_latest_holder_commitment_txn ( broadcaster, & bounded_fee_estimator, logger) ;
37993821 } ,
38003822 ChannelMonitorUpdateStep :: ShutdownScript { scriptpubkey } => {
38013823 log_trace ! ( logger, "Updating ChannelMonitor with shutdown script" ) ;
@@ -5682,6 +5704,7 @@ impl<'a, 'b, ES: EntropySource, SP: SignerProvider> ReadableArgs<(&'a ES, &'b SP
56825704 let mut first_confirmed_funding_txo = RequiredWrapper ( None ) ;
56835705 let mut channel_parameters = None ;
56845706 let mut pending_funding = None ;
5707+ let mut allow_automated_broadcast = None ;
56855708 read_tlv_fields ! ( reader, {
56865709 ( 1 , funding_spend_confirmed, option) ,
56875710 ( 3 , htlcs_resolved_on_chain, optional_vec) ,
@@ -5700,6 +5723,7 @@ impl<'a, 'b, ES: EntropySource, SP: SignerProvider> ReadableArgs<(&'a ES, &'b SP
57005723 ( 29 , initial_counterparty_commitment_tx, option) ,
57015724 ( 31 , channel_parameters, ( option: ReadableArgs , None ) ) ,
57025725 ( 32 , pending_funding, optional_vec) ,
5726+ ( 33 , allow_automated_broadcast, option) ,
57035727 } ) ;
57045728 if let Some ( payment_preimages_with_info) = payment_preimages_with_info {
57055729 if payment_preimages_with_info. len ( ) != payment_preimages. len ( ) {
@@ -5864,6 +5888,7 @@ impl<'a, 'b, ES: EntropySource, SP: SignerProvider> ReadableArgs<(&'a ES, &'b SP
58645888
58655889 best_block,
58665890 counterparty_node_id : counterparty_node_id. unwrap ( ) ,
5891+ allow_automated_broadcast : allow_automated_broadcast. unwrap_or ( true ) ,
58675892 initial_counterparty_commitment_info,
58685893 initial_counterparty_commitment_tx,
58695894 balances_empty_height,
0 commit comments