@@ -50,7 +50,7 @@ use crate::chain::Filter;
50
50
use crate :: util:: logger:: { Logger , Record } ;
51
51
use crate :: util:: ser:: { Readable , ReadableArgs , RequiredWrapper , MaybeReadable , UpgradableRequired , Writer , Writeable , U48 } ;
52
52
use crate :: util:: byte_utils;
53
- use crate :: events:: { Event , EventHandler } ;
53
+ use crate :: events:: { ClosureReason , Event , EventHandler } ;
54
54
use crate :: events:: bump_transaction:: { AnchorDescriptor , BumpTransactionEvent } ;
55
55
56
56
use crate :: prelude:: * ;
@@ -155,6 +155,17 @@ pub enum MonitorEvent {
155
155
/// A monitor event containing an HTLCUpdate.
156
156
HTLCEvent ( HTLCUpdate ) ,
157
157
158
+ /// Indicates we broadcasted the channel's latest commitment transaction and thus closed the
159
+ /// channel. Holds information the channel and why it was closed.
160
+ HolderForceClosedWithInfo {
161
+ /// The reason the channel was closed.
162
+ reason : ClosureReason ,
163
+ /// The funding outpoint of the channel.
164
+ outpoint : OutPoint ,
165
+ /// The channel ID of the channel.
166
+ channel_id : ChannelId ,
167
+ } ,
168
+
158
169
/// Indicates we broadcasted the channel's latest commitment transaction and thus closed the
159
170
/// channel.
160
171
HolderForceClosed ( OutPoint ) ,
@@ -184,6 +195,11 @@ impl_writeable_tlv_based_enum_upgradable!(MonitorEvent,
184
195
( 2 , monitor_update_id, required) ,
185
196
( 4 , channel_id, required) ,
186
197
} ,
198
+ ( 5 , HolderForceClosedWithInfo ) => {
199
+ ( 0 , reason, upgradable_required) ,
200
+ ( 2 , outpoint, required) ,
201
+ ( 4 , channel_id, required) ,
202
+ } ,
187
203
;
188
204
( 2 , HTLCEvent ) ,
189
205
( 4 , HolderForceClosed ) ,
@@ -1059,6 +1075,7 @@ impl<Signer: WriteableEcdsaChannelSigner> Writeable for ChannelMonitorImpl<Signe
1059
1075
writer. write_all ( & ( self . pending_monitor_events . iter ( ) . filter ( |ev| match ev {
1060
1076
MonitorEvent :: HTLCEvent ( _) => true ,
1061
1077
MonitorEvent :: HolderForceClosed ( _) => true ,
1078
+ MonitorEvent :: HolderForceClosedWithInfo { .. } => true ,
1062
1079
_ => false ,
1063
1080
} ) . count ( ) as u64 ) . to_be_bytes ( ) ) ?;
1064
1081
for event in self . pending_monitor_events . iter ( ) {
@@ -1068,6 +1085,14 @@ impl<Signer: WriteableEcdsaChannelSigner> Writeable for ChannelMonitorImpl<Signe
1068
1085
upd. write ( writer) ?;
1069
1086
} ,
1070
1087
MonitorEvent :: HolderForceClosed ( _) => 1u8 . write ( writer) ?,
1088
+ MonitorEvent :: HolderForceClosedWithInfo {
1089
+ reason, outpoint, channel_id
1090
+ } => {
1091
+ 2u8 . write ( writer) ?;
1092
+ reason. write ( writer) ?;
1093
+ outpoint. write ( writer) ?;
1094
+ channel_id. write ( writer) ?;
1095
+ } ,
1071
1096
_ => { } , // Covered in the TLV writes below
1072
1097
}
1073
1098
}
@@ -2700,7 +2725,7 @@ impl<Signer: WriteableEcdsaChannelSigner> ChannelMonitorImpl<Signer> {
2700
2725
}
2701
2726
}
2702
2727
2703
- fn generate_claimable_outpoints_and_watch_outputs ( & mut self ) -> ( Vec < PackageTemplate > , Vec < TransactionOutputs > ) {
2728
+ fn generate_claimable_outpoints_and_watch_outputs ( & mut self , is_htlc_timeout : bool ) -> ( Vec < PackageTemplate > , Vec < TransactionOutputs > ) {
2704
2729
let funding_outp = HolderFundingOutput :: build (
2705
2730
self . funding_redeemscript . clone ( ) ,
2706
2731
self . channel_value_satoshis ,
@@ -2712,7 +2737,20 @@ impl<Signer: WriteableEcdsaChannelSigner> ChannelMonitorImpl<Signer> {
2712
2737
self . best_block . height ( ) , self . best_block . height ( )
2713
2738
) ;
2714
2739
let mut claimable_outpoints = vec ! [ commitment_package] ;
2740
+ let reason = if is_htlc_timeout {
2741
+ ClosureReason :: HTLCsTimedOut
2742
+ } else {
2743
+ ClosureReason :: HolderForceClosed
2744
+ } ;
2745
+ let event = MonitorEvent :: HolderForceClosedWithInfo {
2746
+ reason,
2747
+ outpoint : self . funding_info . 0 ,
2748
+ channel_id : self . channel_id ,
2749
+ } ;
2750
+ self . pending_monitor_events . push ( event) ;
2751
+ // add old version as well for backwards compatability
2715
2752
self . pending_monitor_events . push ( MonitorEvent :: HolderForceClosed ( self . funding_info . 0 ) ) ;
2753
+
2716
2754
// Although we aren't signing the transaction directly here, the transaction will be signed
2717
2755
// in the claim that is queued to OnchainTxHandler. We set holder_tx_signed here to reject
2718
2756
// new channel updates.
@@ -2748,7 +2786,7 @@ impl<Signer: WriteableEcdsaChannelSigner> ChannelMonitorImpl<Signer> {
2748
2786
F :: Target : FeeEstimator ,
2749
2787
L :: Target : Logger ,
2750
2788
{
2751
- let ( claimable_outpoints, _) = self . generate_claimable_outpoints_and_watch_outputs ( ) ;
2789
+ let ( claimable_outpoints, _) = self . generate_claimable_outpoints_and_watch_outputs ( false ) ;
2752
2790
self . onchain_tx_handler . update_claims_view_from_requests (
2753
2791
claimable_outpoints, self . best_block . height ( ) , self . best_block . height ( ) , broadcaster,
2754
2792
fee_estimator, logger
@@ -3787,7 +3825,7 @@ impl<Signer: WriteableEcdsaChannelSigner> ChannelMonitorImpl<Signer> {
3787
3825
3788
3826
let should_broadcast = self . should_broadcast_holder_commitment_txn ( logger) ;
3789
3827
if should_broadcast {
3790
- let ( mut new_outpoints, mut new_outputs) = self . generate_claimable_outpoints_and_watch_outputs ( ) ;
3828
+ let ( mut new_outpoints, mut new_outputs) = self . generate_claimable_outpoints_and_watch_outputs ( true ) ;
3791
3829
claimable_outpoints. append ( & mut new_outpoints) ;
3792
3830
watch_outputs. append ( & mut new_outputs) ;
3793
3831
}
@@ -4532,9 +4570,35 @@ impl<'a, 'b, ES: EntropySource, SP: SignerProvider> ReadableArgs<(&'a ES, &'b SP
4532
4570
let ev = match <u8 as Readable >:: read ( reader) ? {
4533
4571
0 => MonitorEvent :: HTLCEvent ( Readable :: read ( reader) ?) ,
4534
4572
1 => MonitorEvent :: HolderForceClosed ( funding_info. 0 ) ,
4573
+ 2 => {
4574
+ let reason: Option < ClosureReason > = MaybeReadable :: read ( reader) ?;
4575
+ let outpoint: OutPoint = Readable :: read ( reader) ?;
4576
+ let channel_id: ChannelId = Readable :: read ( reader) ?;
4577
+ MonitorEvent :: HolderForceClosedWithInfo {
4578
+ reason : reason. unwrap_or ( ClosureReason :: HolderForceClosed ) ,
4579
+ outpoint,
4580
+ channel_id,
4581
+ }
4582
+ } ,
4535
4583
_ => return Err ( DecodeError :: InvalidValue )
4536
4584
} ;
4537
- pending_monitor_events. as_mut ( ) . unwrap ( ) . push ( ev) ;
4585
+
4586
+ match & ev {
4587
+ MonitorEvent :: HolderForceClosed ( _) => {
4588
+ let events = pending_monitor_events. as_mut ( ) . unwrap ( ) ;
4589
+ // only insert if there is no HolderForceClosedWithInfo event
4590
+ if !events. iter ( ) . any ( |e| matches ! ( e, MonitorEvent :: HolderForceClosedWithInfo { .. } ) ) {
4591
+ events. push ( ev) ;
4592
+ }
4593
+ }
4594
+ MonitorEvent :: HolderForceClosedWithInfo { ..} => {
4595
+ // if there is a HolderForceClosed event, override it with this one
4596
+ let events = pending_monitor_events. as_mut ( ) . unwrap ( ) ;
4597
+ events. retain ( |e| !matches ! ( e, MonitorEvent :: HolderForceClosed ( _) ) ) ;
4598
+ events. push ( ev) ;
4599
+ }
4600
+ _ => pending_monitor_events. as_mut ( ) . unwrap ( ) . push ( ev) ,
4601
+ } ;
4538
4602
}
4539
4603
4540
4604
let pending_events_len: u64 = Readable :: read ( reader) ?;
0 commit comments