@@ -16,7 +16,7 @@ use bitcoin::blockdata::transaction::Transaction;
1616use bitcoin:: blockdata:: transaction:: OutPoint as BitcoinOutPoint ;
1717use bitcoin:: blockdata:: script:: Script ;
1818
19- use bitcoin:: hash_types:: Txid ;
19+ use bitcoin:: hash_types:: { Txid , BlockHash } ;
2020
2121use bitcoin:: secp256k1:: { Secp256k1 , ecdsa:: Signature } ;
2222use bitcoin:: secp256k1;
@@ -58,6 +58,7 @@ const MAX_ALLOC_SIZE: usize = 64*1024;
5858struct OnchainEventEntry {
5959 txid : Txid ,
6060 height : u32 ,
61+ block_hash : Option < BlockHash > , // Added as optional, will be filled in for any entry generated on 0.0.113 or after
6162 event : OnchainEvent ,
6263}
6364
@@ -92,6 +93,7 @@ impl Writeable for OnchainEventEntry {
9293 fn write < W : Writer > ( & self , writer : & mut W ) -> Result < ( ) , io:: Error > {
9394 write_tlv_fields ! ( writer, {
9495 ( 0 , self . txid, required) ,
96+ ( 1 , self . block_hash, option) ,
9597 ( 2 , self . height, required) ,
9698 ( 4 , self . event, required) ,
9799 } ) ;
@@ -103,14 +105,16 @@ impl MaybeReadable for OnchainEventEntry {
103105 fn read < R : io:: Read > ( reader : & mut R ) -> Result < Option < Self > , DecodeError > {
104106 let mut txid = Txid :: all_zeros ( ) ;
105107 let mut height = 0 ;
108+ let mut block_hash = None ;
106109 let mut event = None ;
107110 read_tlv_fields ! ( reader, {
108111 ( 0 , txid, required) ,
112+ ( 1 , block_hash, option) ,
109113 ( 2 , height, required) ,
110114 ( 4 , event, ignorable) ,
111115 } ) ;
112116 if let Some ( ev) = event {
113- Ok ( Some ( Self { txid, height, event : ev } ) )
117+ Ok ( Some ( Self { txid, height, block_hash , event : ev } ) )
114118 } else {
115119 Ok ( None )
116120 }
@@ -543,17 +547,22 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
543547
544548 /// Upon channelmonitor.block_connected(..) or upon provision of a preimage on the forward link
545549 /// for this channel, provide new relevant on-chain transactions and/or new claim requests.
546- /// Formerly this was named `block_connected`, but it is now also used for claiming an HTLC output
547- /// if we receive a preimage after force-close.
548- /// `conf_height` represents the height at which the transactions in `txn_matched` were
549- /// confirmed. This does not need to equal the current blockchain tip height, which should be
550- /// provided via `cur_height`, however it must never be higher than `cur_height`.
551- pub ( crate ) fn update_claims_view < B : Deref , F : Deref , L : Deref > ( & mut self , txn_matched : & [ & Transaction ] , requests : Vec < PackageTemplate > , conf_height : u32 , cur_height : u32 , broadcaster : & B , fee_estimator : & LowerBoundedFeeEstimator < F > , logger : & L )
552- where B :: Target : BroadcasterInterface ,
553- F :: Target : FeeEstimator ,
554- L :: Target : Logger ,
550+ /// Together with `update_claims_view_from_matched_txn` this used to be named
551+ /// `block_connected`, but it is now also used for claiming an HTLC output if we receive a
552+ /// preimage after force-close.
553+ ///
554+ /// `conf_height` represents the height at which the request was generated. This
555+ /// does not need to equal the current blockchain tip height, which should be provided via
556+ /// `cur_height`, however it must never be higher than `cur_height`.
557+ pub ( crate ) fn update_claims_view_from_requests < B : Deref , F : Deref , L : Deref > (
558+ & mut self , requests : Vec < PackageTemplate > , conf_height : u32 , cur_height : u32 ,
559+ broadcaster : & B , fee_estimator : & LowerBoundedFeeEstimator < F > , logger : & L
560+ ) where
561+ B :: Target : BroadcasterInterface ,
562+ F :: Target : FeeEstimator ,
563+ L :: Target : Logger ,
555564 {
556- log_debug ! ( logger, "Updating claims view at height {} with {} matched transactions in block {} and {} claim requests" , cur_height, txn_matched . len ( ) , conf_height , requests. len( ) ) ;
565+ log_debug ! ( logger, "Updating claims view at height {} with {} claim requests" , cur_height, requests. len( ) ) ;
557566 let mut preprocessed_requests = Vec :: with_capacity ( requests. len ( ) ) ;
558567 let mut aggregated_request = None ;
559568
@@ -633,7 +642,25 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
633642 self . pending_claim_requests . insert ( txid, req) ;
634643 }
635644 }
645+ }
636646
647+ /// Upon channelmonitor.block_connected(..) or upon provision of a preimage on the forward link
648+ /// for this channel, provide new relevant on-chain transactions and/or new claim requests.
649+ /// Together with `update_claims_view_from_requests` this used to be named `block_connected`,
650+ /// but it is now also used for claiming an HTLC output if we receive a preimage after force-close.
651+ ///
652+ /// `conf_height` represents the height at which the transactions in `txn_matched` were
653+ /// confirmed. This does not need to equal the current blockchain tip height, which should be
654+ /// provided via `cur_height`, however it must never be higher than `cur_height`.
655+ pub ( crate ) fn update_claims_view_from_matched_txn < B : Deref , F : Deref , L : Deref > (
656+ & mut self , txn_matched : & [ & Transaction ] , conf_height : u32 , conf_hash : BlockHash ,
657+ cur_height : u32 , broadcaster : & B , fee_estimator : & LowerBoundedFeeEstimator < F > , logger : & L
658+ ) where
659+ B :: Target : BroadcasterInterface ,
660+ F :: Target : FeeEstimator ,
661+ L :: Target : Logger ,
662+ {
663+ log_debug ! ( logger, "Updating claims view at height {} with {} matched transactions in block {}" , cur_height, txn_matched. len( ) , conf_height) ;
637664 let mut bump_candidates = HashMap :: new ( ) ;
638665 for tx in txn_matched {
639666 // Scan all input to verify is one of the outpoint spent is of interest for us
@@ -661,6 +688,7 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
661688 let entry = OnchainEventEntry {
662689 txid: tx. txid( ) ,
663690 height: conf_height,
691+ block_hash: Some ( conf_hash) ,
664692 event: OnchainEvent :: Claim { claim_request: first_claim_txid_height. 0 . clone( ) }
665693 } ;
666694 if !self . onchain_events_awaiting_threshold_conf. contains( & entry) {
@@ -701,6 +729,7 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
701729 let entry = OnchainEventEntry {
702730 txid : tx. txid ( ) ,
703731 height : conf_height,
732+ block_hash : Some ( conf_hash) ,
704733 event : OnchainEvent :: ContentiousOutpoint { package } ,
705734 } ;
706735 if !self . onchain_events_awaiting_threshold_conf . contains ( & entry) {
@@ -860,12 +889,12 @@ impl<ChannelSigner: Sign> OnchainTxHandler<ChannelSigner> {
860889 self . claimable_outpoints . get ( outpoint) . is_some ( )
861890 }
862891
863- pub ( crate ) fn get_relevant_txids ( & self ) -> Vec < Txid > {
864- let mut txids: Vec < Txid > = self . onchain_events_awaiting_threshold_conf
892+ pub ( crate ) fn get_relevant_txids ( & self ) -> Vec < ( Txid , Option < BlockHash > ) > {
893+ let mut txids: Vec < ( Txid , Option < BlockHash > ) > = self . onchain_events_awaiting_threshold_conf
865894 . iter ( )
866- . map ( |entry| entry. txid )
895+ . map ( |entry| ( entry. txid , entry . block_hash ) )
867896 . collect ( ) ;
868- txids. sort_unstable ( ) ;
897+ txids. sort_unstable_by_key ( | ( txid , _ ) | * txid ) ;
869898 txids. dedup ( ) ;
870899 txids
871900 }
0 commit comments