@@ -332,14 +332,15 @@ impl Readable for CounterpartyCommitmentParameters {
332332	} 
333333} 
334334
335- /// An entry for an [`OnchainEvent`], stating the block height when the event was observed and the  
336- /// transaction causing it. 
335+ /// An entry for an [`OnchainEvent`], stating the block height and hash  when the event was 
336+ /// observed, as well as the  transaction causing it. 
337337/// 
338338/// Used to determine when the on-chain event can be considered safe from a chain reorganization. 
339339#[ derive( PartialEq ,  Eq ) ]  
340340struct  OnchainEventEntry  { 
341341	txid :  Txid , 
342342	height :  u32 , 
343+ 	block_hash :  Option < BlockHash > ,  // Added as optional, will be filled in for any entry generated on 0.0.113 or after 
343344	event :  OnchainEvent , 
344345	transaction :  Option < Transaction > ,  // Added as optional, but always filled in, in LDK 0.0.110 
345346} 
@@ -440,6 +441,7 @@ impl Writeable for OnchainEventEntry {
440441			( 0 ,  self . txid,  required) , 
441442			( 1 ,  self . transaction,  option) , 
442443			( 2 ,  self . height,  required) , 
444+ 			( 3 ,  self . block_hash,  option) , 
443445			( 4 ,  self . event,  required) , 
444446		} ) ; 
445447		Ok ( ( ) ) 
@@ -450,16 +452,18 @@ impl MaybeReadable for OnchainEventEntry {
450452	fn  read < R :  io:: Read > ( reader :  & mut  R )  -> Result < Option < Self > ,  DecodeError >  { 
451453		let  mut  txid = Txid :: all_zeros ( ) ; 
452454		let  mut  transaction = None ; 
455+ 		let  mut  block_hash = None ; 
453456		let  mut  height = 0 ; 
454457		let  mut  event = None ; 
455458		read_tlv_fields ! ( reader,  { 
456459			( 0 ,  txid,  required) , 
457460			( 1 ,  transaction,  option) , 
458461			( 2 ,  height,  required) , 
462+ 			( 3 ,  block_hash,  option) , 
459463			( 4 ,  event,  ignorable) , 
460464		} ) ; 
461465		if  let  Some ( ev)  = event { 
462- 			Ok ( Some ( Self  {  txid,  transaction,  height,  event :  ev } ) ) 
466+ 			Ok ( Some ( Self  {  txid,  transaction,  height,  block_hash ,   event :  ev } ) ) 
463467		}  else  { 
464468			Ok ( None ) 
465469		} 
@@ -1482,11 +1486,11 @@ impl<Signer: Sign> ChannelMonitor<Signer> {
14821486	} 
14831487
14841488	/// Returns the set of txids that should be monitored for re-organization out of the chain. 
1485- pub  fn  get_relevant_txids ( & self )  -> Vec < Txid >  { 
1489+ pub  fn  get_relevant_txids ( & self )  -> Vec < ( Txid ,   Option < BlockHash > ) >  { 
14861490		let  inner = self . inner . lock ( ) . unwrap ( ) ; 
1487- 		let  mut  txids:  Vec < Txid >  = inner. onchain_events_awaiting_threshold_conf 
1491+ 		let  mut  txids:  Vec < ( Txid ,   Option < BlockHash > ) >  = inner. onchain_events_awaiting_threshold_conf 
14881492			. iter ( ) 
1489- 			. map ( |entry| entry. txid ) 
1493+ 			. map ( |entry| ( entry. txid ,  entry . block_hash ) ) 
14901494			. chain ( inner. onchain_tx_handler . get_relevant_txids ( ) . into_iter ( ) ) 
14911495			. collect ( ) ; 
14921496		txids. sort_unstable ( ) ; 
@@ -1939,7 +1943,7 @@ impl<Signer: Sign> ChannelMonitor<Signer> {
19391943/// been revoked yet, the previous one, we we will never "forget" to resolve an HTLC. 
19401944macro_rules!  fail_unbroadcast_htlcs { 
19411945	( $self:  expr,  $commitment_tx_type:  expr,  $commitment_txid_confirmed:  expr,  $commitment_tx_confirmed:  expr, 
1942- 	 $commitment_tx_conf_height:  expr,  $confirmed_htlcs_list:  expr,  $logger:  expr)  => {  { 
1946+ 	 $commitment_tx_conf_height:  expr,  $commitment_tx_conf_hash :  expr ,  $ confirmed_htlcs_list:  expr,  $logger:  expr)  => {  { 
19431947		debug_assert_eq!( $commitment_tx_confirmed. txid( ) ,  $commitment_txid_confirmed) ; 
19441948
19451949		macro_rules! check_htlc_fails { 
@@ -1983,6 +1987,7 @@ macro_rules! fail_unbroadcast_htlcs {
19831987								txid:  $commitment_txid_confirmed, 
19841988								transaction:  Some ( $commitment_tx_confirmed. clone( ) ) , 
19851989								height:  $commitment_tx_conf_height, 
1990+ 								block_hash:  Some ( * $commitment_tx_conf_hash) , 
19861991								event:  OnchainEvent :: HTLCUpdate  { 
19871992									source:  ( * * source) . clone( ) , 
19881993									payment_hash:  htlc. payment_hash. clone( ) , 
@@ -2401,7 +2406,7 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
24012406/// Returns packages to claim the revoked output(s), as well as additional outputs to watch and 
24022407/// general information about the output that is to the counterparty in the commitment 
24032408/// transaction. 
2404- fn  check_spend_counterparty_transaction < L :  Deref > ( & mut  self ,  tx :  & Transaction ,  height :  u32 ,  logger :  & L ) 
2409+ fn  check_spend_counterparty_transaction < L :  Deref > ( & mut  self ,  tx :  & Transaction ,  height :  u32 ,  block_hash :   & BlockHash ,   logger :  & L ) 
24052410		-> ( Vec < PackageTemplate > ,  TransactionOutputs ,  CommitmentTxCounterpartyOutputInfo ) 
24062411	where  L :: Target :  Logger  { 
24072412		// Most secp and related errors trying to create keys means we have no hope of constructing 
@@ -2472,13 +2477,13 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
24722477
24732478				if  let  Some ( per_commitment_data)  = per_commitment_option { 
24742479					fail_unbroadcast_htlcs ! ( self ,  "revoked_counterparty" ,  commitment_txid,  tx,  height, 
2475- 						per_commitment_data. iter( ) . map( |( htlc,  htlc_source) |
2480+ 						block_hash ,   per_commitment_data. iter( ) . map( |( htlc,  htlc_source) |
24762481							( htlc,  htlc_source. as_ref( ) . map( |htlc_source| htlc_source. as_ref( ) ) ) 
24772482						) ,  logger) ; 
24782483				}  else  { 
24792484					debug_assert ! ( false ,  "We should have per-commitment option for any recognized old commitment txn" ) ; 
24802485					fail_unbroadcast_htlcs ! ( self ,  "revoked counterparty" ,  commitment_txid,  tx,  height, 
2481- 						[ ] . iter( ) . map( |reference| * reference) ,  logger) ; 
2486+ 						block_hash ,   [ ] . iter( ) . map( |reference| * reference) ,  logger) ; 
24822487				} 
24832488			} 
24842489		}  else  if  let  Some ( per_commitment_data)  = per_commitment_option { 
@@ -2495,7 +2500,7 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
24952500			self . counterparty_commitment_txn_on_chain . insert ( commitment_txid,  commitment_number) ; 
24962501
24972502			log_info ! ( logger,  "Got broadcast of non-revoked counterparty commitment transaction {}" ,  commitment_txid) ; 
2498- 			fail_unbroadcast_htlcs ! ( self ,  "counterparty" ,  commitment_txid,  tx,  height, 
2503+ 			fail_unbroadcast_htlcs ! ( self ,  "counterparty" ,  commitment_txid,  tx,  height,  block_hash , 
24992504				per_commitment_data. iter( ) . map( |( htlc,  htlc_source) |
25002505					( htlc,  htlc_source. as_ref( ) . map( |htlc_source| htlc_source. as_ref( ) ) ) 
25012506				) ,  logger) ; 
@@ -2631,7 +2636,7 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
26312636		( claimable_outpoints,  Some ( ( htlc_txid,  outputs) ) ) 
26322637	} 
26332638
2634- 	// Returns (1) `PackageTemplate`s that can be given to the OnChainTxHandler , so that the handler can 
2639+ 	// Returns (1) `PackageTemplate`s that can be given to the OnchainTxHandler , so that the handler can 
26352640	// broadcast transactions claiming holder HTLC commitment outputs and (2) a holder revokable 
26362641	// script so we can detect whether a holder transaction has been seen on-chain. 
26372642	fn  get_broadcasted_holder_claims ( & self ,  holder_tx :  & HolderSignedTx ,  conf_height :  u32 )  -> ( Vec < PackageTemplate > ,  Option < ( Script ,  PublicKey ,  PublicKey ) > )  { 
@@ -2676,7 +2681,7 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
26762681/// revoked using data in holder_claimable_outpoints. 
26772682/// Should not be used if check_spend_revoked_transaction succeeds. 
26782683/// Returns None unless the transaction is definitely one of our commitment transactions. 
2679- fn  check_spend_holder_transaction < L :  Deref > ( & mut  self ,  tx :  & Transaction ,  height :  u32 ,  logger :  & L )  -> Option < ( Vec < PackageTemplate > ,  TransactionOutputs ) >  where  L :: Target :  Logger  { 
2684+ fn  check_spend_holder_transaction < L :  Deref > ( & mut  self ,  tx :  & Transaction ,  height :  u32 ,  block_hash :   & BlockHash ,   logger :  & L )  -> Option < ( Vec < PackageTemplate > ,  TransactionOutputs ) >  where  L :: Target :  Logger  { 
26802685		let  commitment_txid = tx. txid ( ) ; 
26812686		let  mut  claim_requests = Vec :: new ( ) ; 
26822687		let  mut  watch_outputs = Vec :: new ( ) ; 
@@ -2699,7 +2704,7 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
26992704			let  mut  to_watch = self . get_broadcasted_holder_watch_outputs ( & self . current_holder_commitment_tx ,  tx) ; 
27002705			append_onchain_update ! ( res,  to_watch) ; 
27012706			fail_unbroadcast_htlcs ! ( self ,  "latest holder" ,  commitment_txid,  tx,  height, 
2702- 				self . current_holder_commitment_tx. htlc_outputs. iter( ) 
2707+ 				block_hash ,   self . current_holder_commitment_tx. htlc_outputs. iter( ) 
27032708				. map( |( htlc,  _,  htlc_source) | ( htlc,  htlc_source. as_ref( ) ) ) ,  logger) ; 
27042709		}  else  if  let  & Some ( ref  holder_tx)  = & self . prev_holder_signed_commitment_tx  { 
27052710			if  holder_tx. txid  == commitment_txid { 
@@ -2708,7 +2713,7 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
27082713				let  res = self . get_broadcasted_holder_claims ( holder_tx,  height) ; 
27092714				let  mut  to_watch = self . get_broadcasted_holder_watch_outputs ( holder_tx,  tx) ; 
27102715				append_onchain_update ! ( res,  to_watch) ; 
2711- 				fail_unbroadcast_htlcs ! ( self ,  "previous holder" ,  commitment_txid,  tx,  height, 
2716+ 				fail_unbroadcast_htlcs ! ( self ,  "previous holder" ,  commitment_txid,  tx,  height,  block_hash , 
27122717					holder_tx. htlc_outputs. iter( ) . map( |( htlc,  _,  htlc_source) | ( htlc,  htlc_source. as_ref( ) ) ) , 
27132718					logger) ; 
27142719			} 
@@ -2816,7 +2821,7 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
28162821
28172822		if  height > self . best_block . height ( )  { 
28182823			self . best_block  = BestBlock :: new ( block_hash,  height) ; 
2819- 			self . block_confirmed ( height,  vec ! [ ] ,  vec ! [ ] ,  vec ! [ ] ,  & broadcaster,  & fee_estimator,  & logger) 
2824+ 			self . block_confirmed ( height,  block_hash ,   vec ! [ ] ,  vec ! [ ] ,  vec ! [ ] ,  & broadcaster,  & fee_estimator,  & logger) 
28202825		}  else  if  block_hash != self . best_block . block_hash ( )  { 
28212826			self . best_block  = BestBlock :: new ( block_hash,  height) ; 
28222827			self . onchain_events_awaiting_threshold_conf . retain ( |ref  entry| entry. height  <= height) ; 
@@ -2868,14 +2873,14 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
28682873					let  mut  commitment_tx_to_counterparty_output = None ; 
28692874					if  ( tx. input [ 0 ] . sequence . 0  >> 8 * 3 )  as  u8  == 0x80  && ( tx. lock_time . 0  >> 8 * 3 )  as  u8  == 0x20  { 
28702875						let  ( mut  new_outpoints,  new_outputs,  counterparty_output_idx_sats)  =
2871- 							self . check_spend_counterparty_transaction ( & tx,  height,  & logger) ; 
2876+ 							self . check_spend_counterparty_transaction ( & tx,  height,  & block_hash ,   & logger) ; 
28722877						commitment_tx_to_counterparty_output = counterparty_output_idx_sats; 
28732878						if  !new_outputs. 1 . is_empty ( )  { 
28742879							watch_outputs. push ( new_outputs) ; 
28752880						} 
28762881						claimable_outpoints. append ( & mut  new_outpoints) ; 
28772882						if  new_outpoints. is_empty ( )  { 
2878- 							if  let  Some ( ( mut  new_outpoints,  new_outputs) )  = self . check_spend_holder_transaction ( & tx,  height,  & logger)  { 
2883+ 							if  let  Some ( ( mut  new_outpoints,  new_outputs) )  = self . check_spend_holder_transaction ( & tx,  height,  & block_hash ,   & logger)  { 
28792884								debug_assert ! ( commitment_tx_to_counterparty_output. is_none( ) , 
28802885									"A commitment transaction matched as both a counterparty and local commitment tx?" ) ; 
28812886								if  !new_outputs. 1 . is_empty ( )  { 
@@ -2891,6 +2896,7 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
28912896						txid, 
28922897						transaction :  Some ( ( * tx) . clone ( ) ) , 
28932898						height, 
2899+ 						block_hash :  Some ( block_hash) , 
28942900						event :  OnchainEvent :: FundingSpendConfirmation  { 
28952901							on_local_output_csv :  balance_spendable_csv, 
28962902							commitment_tx_to_counterparty_output, 
@@ -2909,16 +2915,16 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
29092915			// While all commitment/HTLC-Success/HTLC-Timeout transactions have one input, HTLCs 
29102916			// can also be resolved in a few other ways which can have more than one output. Thus, 
29112917			// we call is_resolving_htlc_output here outside of the tx.input.len() == 1 check. 
2912- 			self . is_resolving_htlc_output ( & tx,  height,  & logger) ; 
2918+ 			self . is_resolving_htlc_output ( & tx,  height,  & block_hash ,   & logger) ; 
29132919
2914- 			self . is_paying_spendable_output ( & tx,  height,  & logger) ; 
2920+ 			self . is_paying_spendable_output ( & tx,  height,  & block_hash ,   & logger) ; 
29152921		} 
29162922
29172923		if  height > self . best_block . height ( )  { 
29182924			self . best_block  = BestBlock :: new ( block_hash,  height) ; 
29192925		} 
29202926
2921- 		self . block_confirmed ( height,  txn_matched,  watch_outputs,  claimable_outpoints,  & broadcaster,  & fee_estimator,  & logger) 
2927+ 		self . block_confirmed ( height,  block_hash ,   txn_matched,  watch_outputs,  claimable_outpoints,  & broadcaster,  & fee_estimator,  & logger) 
29222928	} 
29232929
29242930	/// Update state for new block(s)/transaction(s) confirmed. Note that the caller must update 
@@ -2931,6 +2937,7 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
29312937fn  block_confirmed < B :  Deref ,  F :  Deref ,  L :  Deref > ( 
29322938		& mut  self , 
29332939		conf_height :  u32 , 
2940+ 		conf_hash :  BlockHash , 
29342941		txn_matched :  Vec < & Transaction > , 
29352942		mut  watch_outputs :  Vec < TransactionOutputs > , 
29362943		mut  claimable_outpoints :  Vec < PackageTemplate > , 
@@ -3235,7 +3242,7 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
32353242
32363243	/// Check if any transaction broadcasted is resolving HTLC output by a success or timeout on a holder 
32373244/// or counterparty commitment tx, if so send back the source, preimage if found and payment_hash of resolved HTLC 
3238- fn  is_resolving_htlc_output < L :  Deref > ( & mut  self ,  tx :  & Transaction ,  height :  u32 ,  logger :  & L )  where  L :: Target :  Logger  { 
3245+ fn  is_resolving_htlc_output < L :  Deref > ( & mut  self ,  tx :  & Transaction ,  height :  u32 ,  block_hash :   & BlockHash ,   logger :  & L )  where  L :: Target :  Logger  { 
32393246		' outer_loop:  for  input in  & tx. input  { 
32403247			let  mut  payment_data = None ; 
32413248			let  htlc_claim = HTLCClaim :: from_witness ( & input. witness ) ; 
@@ -3320,7 +3327,7 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
33203327								log_claim!( $tx_info,  $holder_tx,  htlc_output,  false ) ; 
33213328								let  outbound_htlc = $holder_tx == htlc_output. offered; 
33223329								self . onchain_events_awaiting_threshold_conf. push( OnchainEventEntry  { 
3323- 									txid:  tx. txid( ) ,  height,  transaction:  Some ( tx. clone( ) ) , 
3330+ 									txid:  tx. txid( ) ,  height,  block_hash :   Some ( * block_hash ) ,   transaction:  Some ( tx. clone( ) ) , 
33243331									event:  OnchainEvent :: HTLCSpendConfirmation  { 
33253332										commitment_tx_output_idx:  input. previous_output. vout, 
33263333										preimage:  if  accepted_preimage_claim || offered_preimage_claim { 
@@ -3364,6 +3371,7 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
33643371						self . onchain_events_awaiting_threshold_conf . push ( OnchainEventEntry  { 
33653372							txid :  tx. txid ( ) , 
33663373							height, 
3374+ 							block_hash :  Some ( * block_hash) , 
33673375							transaction :  Some ( tx. clone ( ) ) , 
33683376							event :  OnchainEvent :: HTLCSpendConfirmation  { 
33693377								commitment_tx_output_idx :  input. previous_output . vout , 
@@ -3387,6 +3395,7 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
33873395							txid :  tx. txid ( ) , 
33883396							transaction :  Some ( tx. clone ( ) ) , 
33893397							height, 
3398+ 							block_hash :  Some ( * block_hash) , 
33903399							event :  OnchainEvent :: HTLCSpendConfirmation  { 
33913400								commitment_tx_output_idx :  input. previous_output . vout , 
33923401								preimage :  Some ( payment_preimage) , 
@@ -3414,6 +3423,7 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
34143423						txid :  tx. txid ( ) , 
34153424						transaction :  Some ( tx. clone ( ) ) , 
34163425						height, 
3426+ 						block_hash :  Some ( * block_hash) , 
34173427						event :  OnchainEvent :: HTLCUpdate  { 
34183428							source,  payment_hash, 
34193429							htlc_value_satoshis :  Some ( amount_msat / 1000 ) , 
@@ -3428,7 +3438,7 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
34283438	} 
34293439
34303440	/// Check if any transaction broadcasted is paying fund back to some address we can assume to own 
3431- fn  is_paying_spendable_output < L :  Deref > ( & mut  self ,  tx :  & Transaction ,  height :  u32 ,  logger :  & L )  where  L :: Target :  Logger  { 
3441+ fn  is_paying_spendable_output < L :  Deref > ( & mut  self ,  tx :  & Transaction ,  height :  u32 ,  block_hash :   & BlockHash ,   logger :  & L )  where  L :: Target :  Logger  { 
34323442		let  mut  spendable_output = None ; 
34333443		for  ( i,  outp)  in  tx. output . iter ( ) . enumerate ( )  {  // There is max one spendable output for any channel tx, including ones generated by us 
34343444			if  i > :: core:: u16:: MAX  as  usize  { 
@@ -3488,6 +3498,7 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
34883498				txid :  tx. txid ( ) , 
34893499				transaction :  Some ( tx. clone ( ) ) , 
34903500				height, 
3501+ 				block_hash :  Some ( * block_hash) , 
34913502				event :  OnchainEvent :: MaturingOutput  {  descriptor :  spendable_output. clone ( )  } , 
34923503			} ; 
34933504			log_info ! ( logger,  "Received spendable output {}, spendable at height {}" ,  log_spendable!( spendable_output) ,  entry. confirmation_threshold( ) ) ; 
@@ -3529,7 +3540,7 @@ where
35293540		self . 0 . best_block_updated ( header,  height,  & * self . 1 ,  & * self . 2 ,  & * self . 3 ) ; 
35303541	} 
35313542
3532- 	fn  get_relevant_txids ( & self )  -> Vec < Txid >  { 
3543+ 	fn  get_relevant_txids ( & self )  -> Vec < ( Txid ,   Option < BlockHash > ) >  { 
35333544		self . 0 . get_relevant_txids ( ) 
35343545	} 
35353546} 
0 commit comments