@@ -1931,7 +1931,6 @@ impl FundingScope {
1931
1931
self.channel_transaction_parameters.funding_outpoint
1932
1932
}
1933
1933
1934
- #[cfg(splicing)]
1935
1934
fn get_funding_txid(&self) -> Option<Txid> {
1936
1935
self.channel_transaction_parameters.funding_outpoint.map(|txo| txo.txid)
1937
1936
}
@@ -8984,7 +8983,7 @@ impl<SP: Deref> FundedChannel<SP> where
8984
8983
8985
8984
#[cfg(splicing)]
8986
8985
if let Some(confirmed_funding_index) = confirmed_funding_index {
8987
- let pending_splice = match self.pending_splice.as_ref () {
8986
+ let pending_splice = match self.pending_splice.as_mut () {
8988
8987
Some(pending_splice) => pending_splice,
8989
8988
None => {
8990
8989
// TODO: Move pending_funding into pending_splice
@@ -8993,8 +8992,26 @@ impl<SP: Deref> FundedChannel<SP> where
8993
8992
return Err(ClosureReason::ProcessingError { err });
8994
8993
},
8995
8994
};
8996
- let funding = self.pending_funding.get (confirmed_funding_index).unwrap();
8995
+ let funding = self.pending_funding.get_mut (confirmed_funding_index).unwrap();
8997
8996
8997
+ // Check if the splice funding transaction was unconfirmed
8998
+ if funding.get_funding_tx_confirmations(height) == 0 {
8999
+ funding.funding_tx_confirmation_height = 0;
9000
+ if let Some(sent_funding_txid) = pending_splice.sent_funding_txid {
9001
+ if Some(sent_funding_txid) == funding.get_funding_txid() {
9002
+ log_warn!(
9003
+ logger,
9004
+ "Unconfirming sent splice_locked txid {} for channel {}",
9005
+ sent_funding_txid,
9006
+ &self.context.channel_id,
9007
+ );
9008
+ pending_splice.sent_funding_txid = None;
9009
+ }
9010
+ }
9011
+ }
9012
+
9013
+ let pending_splice = self.pending_splice.as_ref().unwrap();
9014
+ let funding = self.pending_funding.get(confirmed_funding_index).unwrap();
8998
9015
if let Some(splice_locked) = self.check_get_splice_locked(pending_splice, funding, height) {
8999
9016
log_info!(logger, "Sending a splice_locked to our peer for channel {}", &self.context.channel_id);
9000
9017
@@ -9017,30 +9034,44 @@ impl<SP: Deref> FundedChannel<SP> where
9017
9034
Ok((None, timed_out_htlcs, announcement_sigs))
9018
9035
}
9019
9036
9020
- /// Indicates the funding transaction is no longer confirmed in the main chain. This may
9037
+ /// Checks if any funding transaction is no longer confirmed in the main chain. This may
9021
9038
/// force-close the channel, but may also indicate a harmless reorganization of a block or two
9022
- /// before the channel has reached channel_ready and we can just wait for more blocks.
9023
- pub fn funding_transaction_unconfirmed<L: Deref>(&mut self, logger: &L) -> Result<(), ClosureReason> where L::Target: Logger {
9024
- if self.funding.funding_tx_confirmation_height != 0 {
9025
- // We handle the funding disconnection by calling best_block_updated with a height one
9026
- // below where our funding was connected, implying a reorg back to conf_height - 1.
9027
- let reorg_height = self.funding.funding_tx_confirmation_height - 1;
9028
- // We use the time field to bump the current time we set on channel updates if its
9029
- // larger. If we don't know that time has moved forward, we can just set it to the last
9030
- // time we saw and it will be ignored.
9031
- let best_time = self.context.update_time_counter;
9032
-
9033
- match self.do_best_block_updated(reorg_height, best_time, None::<(ChainHash, &&dyn NodeSigner, &UserConfig)>, logger) {
9034
- Ok((channel_ready, timed_out_htlcs, announcement_sigs)) => {
9035
- assert!(channel_ready.is_none(), "We can't generate a funding with 0 confirmations?");
9036
- assert!(timed_out_htlcs.is_empty(), "We can't have accepted HTLCs with a timeout before our funding confirmation?");
9037
- assert!(announcement_sigs.is_none(), "We can't generate an announcement_sigs with 0 confirmations?");
9038
- Ok(())
9039
- },
9040
- Err(e) => Err(e)
9039
+ /// before the channel has reached channel_ready or splice_locked, and we can just wait for more
9040
+ /// blocks.
9041
+ pub fn transaction_unconfirmed<L: Deref>(
9042
+ &mut self, txid: &Txid, logger: &L,
9043
+ ) -> Result<(), ClosureReason>
9044
+ where
9045
+ L::Target: Logger,
9046
+ {
9047
+ let unconfirmed_funding = core::iter::once(&mut self.funding)
9048
+ .chain(self.pending_funding.iter_mut())
9049
+ .find(|funding| funding.get_funding_txid() == Some(*txid));
9050
+
9051
+ if let Some(funding) = unconfirmed_funding {
9052
+ if funding.funding_tx_confirmation_height != 0 {
9053
+ // We handle the funding disconnection by calling best_block_updated with a height one
9054
+ // below where our funding was connected, implying a reorg back to conf_height - 1.
9055
+ let reorg_height = funding.funding_tx_confirmation_height - 1;
9056
+ // We use the time field to bump the current time we set on channel updates if its
9057
+ // larger. If we don't know that time has moved forward, we can just set it to the last
9058
+ // time we saw and it will be ignored.
9059
+ let best_time = self.context.update_time_counter;
9060
+
9061
+ match self.do_best_block_updated(reorg_height, best_time, None::<(ChainHash, &&dyn NodeSigner, &UserConfig)>, logger) {
9062
+ Ok((channel_ready, timed_out_htlcs, announcement_sigs)) => {
9063
+ assert!(channel_ready.is_none(), "We can't generate a funding with 0 confirmations?");
9064
+ assert!(timed_out_htlcs.is_empty(), "We can't have accepted HTLCs with a timeout before our funding confirmation?");
9065
+ assert!(announcement_sigs.is_none(), "We can't generate an announcement_sigs with 0 confirmations?");
9066
+ Ok(())
9067
+ },
9068
+ Err(e) => Err(e),
9069
+ }
9070
+ } else {
9071
+ // We never learned about the funding confirmation anyway, just ignore
9072
+ Ok(())
9041
9073
}
9042
9074
} else {
9043
- // We never learned about the funding confirmation anyway, just ignore
9044
9075
Ok(())
9045
9076
}
9046
9077
}
0 commit comments