@@ -1685,6 +1685,38 @@ impl<Signer: WriteableEcdsaChannelSigner> ChannelMonitorImpl<Signer> {
1685
1685
let mut holder_timeout_spend_pending = None ;
1686
1686
let mut htlc_spend_pending = None ;
1687
1687
let mut holder_delayed_output_pending = None ;
1688
+
1689
+ let htlc_resolved = self . htlcs_resolved_on_chain . iter ( )
1690
+ . find ( |v| if v. commitment_tx_output_idx == Some ( htlc_commitment_tx_output_idx) {
1691
+ debug_assert ! ( htlc_spend_txid_opt. is_none( ) ) ;
1692
+ htlc_spend_txid_opt = v. resolving_txid . as_ref ( ) ;
1693
+ debug_assert ! ( htlc_spend_tx_opt. is_none( ) ) ;
1694
+ htlc_spend_tx_opt = v. resolving_tx . as_ref ( ) ;
1695
+ true
1696
+ } else { false } ) ;
1697
+
1698
+ let htlc_commitment_outpoint = BitcoinOutPoint :: new ( confirmed_txid. unwrap ( ) , htlc_commitment_tx_output_idx) ;
1699
+ let htlc_output_to_spend =
1700
+ if let Some ( txid) = htlc_spend_txid_opt {
1701
+ // Because HTLC transactions either only have 1 input and 1 output (pre-anchors) or
1702
+ // are signed with SIGHASH_SINGLE|ANYONECANPAY under BIP-0143 (post-anchors), we can
1703
+ // locate the correct output by ensuring its adjacent input spends the HTLC output
1704
+ // in the commitment.
1705
+ if let Some ( ref tx) = htlc_spend_tx_opt {
1706
+ let htlc_input_idx_opt = tx. input . iter ( ) . enumerate ( )
1707
+ . find ( |( _, input) | input. previous_output == htlc_commitment_outpoint)
1708
+ . map ( |( idx, _) | idx as u32 ) ;
1709
+ debug_assert ! ( htlc_input_idx_opt. is_some( ) ) ;
1710
+ BitcoinOutPoint :: new ( * txid, htlc_input_idx_opt. unwrap_or ( 0 ) )
1711
+ } else {
1712
+ debug_assert ! ( !self . onchain_tx_handler. channel_type_features( ) . supports_anchors_zero_fee_htlc_tx( ) ) ;
1713
+ BitcoinOutPoint :: new ( * txid, 0 )
1714
+ }
1715
+ } else {
1716
+ htlc_commitment_outpoint
1717
+ } ;
1718
+ let htlc_output_spend_pending = self . onchain_tx_handler . is_output_spend_pending ( & htlc_output_to_spend) ;
1719
+
1688
1720
for event in self . onchain_events_awaiting_threshold_conf . iter ( ) {
1689
1721
match event. event {
1690
1722
OnchainEvent :: HTLCUpdate { commitment_tx_output_idx, htlc_value_satoshis, .. }
@@ -1715,37 +1747,8 @@ impl<Signer: WriteableEcdsaChannelSigner> ChannelMonitorImpl<Signer> {
1715
1747
_ => { } ,
1716
1748
}
1717
1749
}
1718
- let htlc_resolved = self . htlcs_resolved_on_chain . iter ( )
1719
- . find ( |v| if v. commitment_tx_output_idx == Some ( htlc_commitment_tx_output_idx) {
1720
- debug_assert ! ( htlc_spend_txid_opt. is_none( ) ) ;
1721
- htlc_spend_txid_opt = v. resolving_txid . as_ref ( ) ;
1722
- debug_assert ! ( htlc_spend_tx_opt. is_none( ) ) ;
1723
- htlc_spend_tx_opt = v. resolving_tx . as_ref ( ) ;
1724
- true
1725
- } else { false } ) ;
1726
- debug_assert ! ( holder_timeout_spend_pending. is_some( ) as u8 + htlc_spend_pending. is_some( ) as u8 + htlc_resolved. is_some( ) as u8 <= 1 ) ;
1727
1750
1728
- let htlc_commitment_outpoint = BitcoinOutPoint :: new ( confirmed_txid. unwrap ( ) , htlc_commitment_tx_output_idx) ;
1729
- let htlc_output_to_spend =
1730
- if let Some ( txid) = htlc_spend_txid_opt {
1731
- // Because HTLC transactions either only have 1 input and 1 output (pre-anchors) or
1732
- // are signed with SIGHASH_SINGLE|ANYONECANPAY under BIP-0143 (post-anchors), we can
1733
- // locate the correct output by ensuring its adjacent input spends the HTLC output
1734
- // in the commitment.
1735
- if let Some ( ref tx) = htlc_spend_tx_opt {
1736
- let htlc_input_idx_opt = tx. input . iter ( ) . enumerate ( )
1737
- . find ( |( _, input) | input. previous_output == htlc_commitment_outpoint)
1738
- . map ( |( idx, _) | idx as u32 ) ;
1739
- debug_assert ! ( htlc_input_idx_opt. is_some( ) ) ;
1740
- BitcoinOutPoint :: new ( * txid, htlc_input_idx_opt. unwrap_or ( 0 ) )
1741
- } else {
1742
- debug_assert ! ( !self . onchain_tx_handler. channel_type_features( ) . supports_anchors_zero_fee_htlc_tx( ) ) ;
1743
- BitcoinOutPoint :: new ( * txid, 0 )
1744
- }
1745
- } else {
1746
- htlc_commitment_outpoint
1747
- } ;
1748
- let htlc_output_spend_pending = self . onchain_tx_handler . is_output_spend_pending ( & htlc_output_to_spend) ;
1751
+ debug_assert ! ( holder_timeout_spend_pending. is_some( ) as u8 + htlc_spend_pending. is_some( ) as u8 + htlc_resolved. is_some( ) as u8 <= 1 ) ;
1749
1752
1750
1753
if let Some ( conf_thresh) = holder_delayed_output_pending {
1751
1754
debug_assert ! ( holder_commitment) ;
0 commit comments