@@ -723,6 +723,10 @@ pub(crate) struct ChannelMonitorImpl<Signer: Sign> {
723
723
best_block : BestBlock ,
724
724
725
725
secp_ctx : Secp256k1 < secp256k1:: All > , //TODO: dedup this a bit...
726
+
727
+ // Used to track that the channel was updated with ChannelForceClosed {should_broadcast: false}
728
+ // implying that it's unsafe to broadcast the latest holder commitment transaction.
729
+ allow_automated_broadcast : bool ,
726
730
}
727
731
728
732
/// Transaction outputs to watch for on-chain spends.
@@ -1059,6 +1063,8 @@ impl<Signer: Sign> ChannelMonitor<Signer> {
1059
1063
best_block,
1060
1064
1061
1065
secp_ctx,
1066
+
1067
+ allow_automated_broadcast : true ,
1062
1068
} ) ,
1063
1069
}
1064
1070
}
@@ -1110,15 +1116,26 @@ impl<Signer: Sign> ChannelMonitor<Signer> {
1110
1116
payment_hash, payment_preimage, broadcaster, fee_estimator, logger)
1111
1117
}
1112
1118
1113
- pub ( crate ) fn broadcast_latest_holder_commitment_txn < B : Deref , L : Deref > (
1119
+ pub ( crate ) fn maybe_broadcast_latest_holder_commitment_txn < B : Deref , L : Deref > (
1120
+ & self ,
1121
+ broadcaster : & B ,
1122
+ logger : & L ,
1123
+ ) where
1124
+ B :: Target : BroadcasterInterface ,
1125
+ L :: Target : Logger ,
1126
+ {
1127
+ self . inner . lock ( ) . unwrap ( ) . maybe_broadcast_latest_holder_commitment_txn ( broadcaster, logger)
1128
+ }
1129
+
1130
+ pub ( crate ) fn force_broadcast_latest_holder_commitment_txn_unsafe < B : Deref , L : Deref > (
1114
1131
& self ,
1115
1132
broadcaster : & B ,
1116
1133
logger : & L ,
1117
1134
) where
1118
1135
B :: Target : BroadcasterInterface ,
1119
1136
L :: Target : Logger ,
1120
1137
{
1121
- self . inner . lock ( ) . unwrap ( ) . broadcast_latest_holder_commitment_txn ( broadcaster, logger)
1138
+ self . inner . lock ( ) . unwrap ( ) . force_broadcast_latest_holder_commitment_txn_unsafe ( broadcaster, logger)
1122
1139
}
1123
1140
1124
1141
/// Updates a ChannelMonitor on the basis of some new information provided by the Channel
@@ -1923,7 +1940,22 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
1923
1940
}
1924
1941
}
1925
1942
1926
- pub ( crate ) fn broadcast_latest_holder_commitment_txn < B : Deref , L : Deref > ( & mut self , broadcaster : & B , logger : & L )
1943
+ pub ( crate ) fn maybe_broadcast_latest_holder_commitment_txn < B : Deref , L : Deref > ( & mut self , broadcaster : & B , logger : & L )
1944
+ where B :: Target : BroadcasterInterface ,
1945
+ L :: Target : Logger ,
1946
+ {
1947
+ if self . allow_automated_broadcast {
1948
+ for tx in self . get_latest_holder_commitment_txn ( logger) . iter ( ) {
1949
+ log_info ! ( logger, "Broadcasting local {}" , log_tx!( tx) ) ;
1950
+ broadcaster. broadcast_transaction ( tx) ;
1951
+ }
1952
+ self . pending_monitor_events . push ( MonitorEvent :: CommitmentTxConfirmed ( self . funding_info . 0 ) ) ;
1953
+ } else {
1954
+ log_error ! ( logger, "You have a toxic holder commitment transaction avaible in channel monitor, read comment in ChannelMonitor::get_latest_holder_commitment_txn to be informed of manual action to take" ) ;
1955
+ }
1956
+ }
1957
+
1958
+ pub ( crate ) fn force_broadcast_latest_holder_commitment_txn_unsafe < B : Deref , L : Deref > ( & mut self , broadcaster : & B , logger : & L )
1927
1959
where B :: Target : BroadcasterInterface ,
1928
1960
L :: Target : Logger ,
1929
1961
{
@@ -1934,6 +1966,8 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
1934
1966
self . pending_monitor_events . push ( MonitorEvent :: CommitmentTxConfirmed ( self . funding_info . 0 ) ) ;
1935
1967
}
1936
1968
1969
+
1970
+
1937
1971
pub fn update_monitor < B : Deref , F : Deref , L : Deref > ( & mut self , updates : & ChannelMonitorUpdate , broadcaster : & B , fee_estimator : & F , logger : & L ) -> Result < ( ) , ( ) >
1938
1972
where B :: Target : BroadcasterInterface ,
1939
1973
F :: Target : FeeEstimator ,
@@ -1989,8 +2023,9 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
1989
2023
log_trace ! ( logger, "Updating ChannelMonitor: channel force closed, should broadcast: {}" , should_broadcast) ;
1990
2024
self . lockdown_from_offchain = true ;
1991
2025
if * should_broadcast {
1992
- self . broadcast_latest_holder_commitment_txn ( broadcaster, logger) ;
2026
+ self . maybe_broadcast_latest_holder_commitment_txn ( broadcaster, logger) ;
1993
2027
} else if !self . holder_tx_signed {
2028
+ self . allow_automated_broadcast = false ;
1994
2029
log_error ! ( logger, "You have a toxic holder commitment transaction avaible in channel monitor, read comment in ChannelMonitor::get_latest_holder_commitment_txn to be informed of manual action to take" ) ;
1995
2030
} else {
1996
2031
// If we generated a MonitorEvent::CommitmentTxConfirmed, the ChannelManager
@@ -3397,6 +3432,8 @@ impl<'a, Signer: Sign, K: KeysInterface<Signer = Signer>> ReadableArgs<&'a K>
3397
3432
best_block,
3398
3433
3399
3434
secp_ctx,
3435
+
3436
+ allow_automated_broadcast : true ,
3400
3437
} ) ,
3401
3438
} ) )
3402
3439
}
0 commit comments