@@ -826,6 +826,13 @@ pub(crate) struct ChannelMonitorImpl<Signer: Sign> {
826826 /// spending CSV for revocable outputs).
827827 htlcs_resolved_on_chain : Vec < IrrevocablyResolvedHTLC > ,
828828
829+ /// The set of `SpendableOutput` events which we have already passed upstream to be claimed.
830+ /// These are tracked explicitly to ensure that we don't generate the same events redundantly
831+ /// if users duplicatively confirm old transactions. Specifically for transactions claiming a
832+ /// revoked remote outpoint we otherwise have no tracking at all once they've reached
833+ /// [`ANTI_REORG_DELAY`], so we have to track them here.
834+ spendable_txids_confirmed : Vec < Txid > ,
835+
829836 // We simply modify best_block in Channel's block_connected so that serialization is
830837 // consistent but hopefully the users' copy handles block_connected in a consistent way.
831838 // (we do *not*, however, update them in update_monitor to ensure any local user copies keep
@@ -1071,6 +1078,7 @@ impl<Signer: Sign> Writeable for ChannelMonitorImpl<Signer> {
10711078 ( 7 , self . funding_spend_seen, required) ,
10721079 ( 9 , self . counterparty_node_id, option) ,
10731080 ( 11 , self . confirmed_commitment_tx_counterparty_output, option) ,
1081+ ( 13 , self . spendable_txids_confirmed, vec_type) ,
10741082 } ) ;
10751083
10761084 Ok ( ( ) )
@@ -1179,6 +1187,7 @@ impl<Signer: Sign> ChannelMonitor<Signer> {
11791187 funding_spend_confirmed : None ,
11801188 confirmed_commitment_tx_counterparty_output : None ,
11811189 htlcs_resolved_on_chain : Vec :: new ( ) ,
1190+ spendable_txids_confirmed : Vec :: new ( ) ,
11821191
11831192 best_block,
11841193 counterparty_node_id : Some ( counterparty_node_id) ,
@@ -3042,6 +3051,7 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
30423051 self . pending_events . push ( Event :: SpendableOutputs {
30433052 outputs : vec ! [ descriptor]
30443053 } ) ;
3054+ self . spendable_txids_confirmed . push ( entry. txid ) ;
30453055 } ,
30463056 OnchainEvent :: HTLCSpendConfirmation { commitment_tx_output_idx, preimage, .. } => {
30473057 self . htlcs_resolved_on_chain . push ( IrrevocablyResolvedHTLC {
@@ -3777,13 +3787,15 @@ impl<'a, K: KeysInterface> ReadableArgs<&'a K>
37773787 let mut funding_spend_seen = Some ( false ) ;
37783788 let mut counterparty_node_id = None ;
37793789 let mut confirmed_commitment_tx_counterparty_output = None ;
3790+ let mut spendable_txids_confirmed = Some ( Vec :: new ( ) ) ;
37803791 read_tlv_fields ! ( reader, {
37813792 ( 1 , funding_spend_confirmed, option) ,
37823793 ( 3 , htlcs_resolved_on_chain, vec_type) ,
37833794 ( 5 , pending_monitor_events, vec_type) ,
37843795 ( 7 , funding_spend_seen, option) ,
37853796 ( 9 , counterparty_node_id, option) ,
37863797 ( 11 , confirmed_commitment_tx_counterparty_output, option) ,
3798+ ( 13 , spendable_txids_confirmed, vec_type) ,
37873799 } ) ;
37883800
37893801 let mut secp_ctx = Secp256k1 :: new ( ) ;
@@ -3836,6 +3848,7 @@ impl<'a, K: KeysInterface> ReadableArgs<&'a K>
38363848 funding_spend_confirmed,
38373849 confirmed_commitment_tx_counterparty_output,
38383850 htlcs_resolved_on_chain : htlcs_resolved_on_chain. unwrap ( ) ,
3851+ spendable_txids_confirmed : spendable_txids_confirmed. unwrap ( ) ,
38393852
38403853 best_block,
38413854 counterparty_node_id,
0 commit comments