diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs index ee8833484a4..07cea0e72c6 100644 --- a/lightning/src/ln/channel.rs +++ b/lightning/src/ln/channel.rs @@ -1561,6 +1561,10 @@ pub(super) struct ChannelContext where SP::Target: SignerProvider { /// If we can't release a [`ChannelMonitorUpdate`] until some external action completes, we /// store it here and only release it to the `ChannelManager` once it asks for it. blocked_monitor_updates: Vec, + // If we've sent `commtiment_signed` for an interactive transaction construction, + // but have not received `tx_signatures` we MUST set `next_funding_txid` to the + // txid of that interactive transaction, else we MUST NOT set it. + next_funding_txid: Option, } #[cfg(any(dual_funding, splicing))] @@ -2125,6 +2129,7 @@ impl ChannelContext where SP::Target: SignerProvider { local_initiated_shutdown: None, blocked_monitor_updates: Vec::new(), + next_funding_txid: None, }; Ok(channel_context) @@ -2345,6 +2350,7 @@ impl ChannelContext where SP::Target: SignerProvider { blocked_monitor_updates: Vec::new(), local_initiated_shutdown: None, + next_funding_txid: None, }) } @@ -4518,6 +4524,16 @@ impl Channel where self.context.channel_state.clear_waiting_for_batch(); } + #[cfg(any(dual_funding, splicing))] + pub fn set_next_funding_txid(&mut self, txid: &Txid) { + self.context.next_funding_txid = Some(*txid); + } + + #[cfg(any(dual_funding, splicing))] + pub fn clear_next_funding_txid(&mut self) { + self.context.next_funding_txid = None; + } + /// Unsets the existing funding information. /// /// This must only be used if the channel has not yet completed funding and has not been used. @@ -7504,10 +7520,7 @@ impl Channel where next_remote_commitment_number: INITIAL_COMMITMENT_NUMBER - self.context.cur_counterparty_commitment_transaction_number - 1, your_last_per_commitment_secret: remote_last_secret, my_current_per_commitment_point: dummy_pubkey, - // TODO(dual_funding): If we've sent `commtiment_signed` for an interactive transaction - // construction but have not received `tx_signatures` we MUST set `next_funding_txid` to the - // txid of that interactive transaction, else we MUST NOT set it. - next_funding_txid: None, + next_funding_txid: self.context.next_funding_txid, } } @@ -9434,6 +9447,7 @@ impl Writeable for Channel where SP::Target: SignerProvider { (43, malformed_htlcs, optional_vec), // Added in 0.0.119 // 45 and 47 are reserved for async signing (49, self.context.local_initiated_shutdown, option), // Added in 0.0.122 + (51, self.context.next_funding_txid, option), // Added in 0.0.124 }); Ok(()) @@ -10009,6 +10023,10 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch local_initiated_shutdown, blocked_monitor_updates: blocked_monitor_updates.unwrap(), + // If we've sent `commtiment_signed` for an interactive transaction construction, + // but have not received `tx_signatures` we MUST set `next_funding_txid` to the + // txid of that interactive transaction, else we MUST NOT set it. + next_funding_txid: None, }, #[cfg(any(dual_funding, splicing))] dual_funding_channel_context: None, diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs index 0bb6ece7e6b..1158009cabc 100644 --- a/lightning/src/ln/channelmanager.rs +++ b/lightning/src/ln/channelmanager.rs @@ -8020,6 +8020,7 @@ where peer_state.pending_msg_events.push(msg_send_event); } if let Some(signing_session) = signing_session_opt { + let funding_txid = signing_session.unsigned_tx.txid(); let (channel_id, channel_phase) = chan_phase_entry.remove_entry(); let res = match channel_phase { ChannelPhase::UnfundedOutboundV2(chan) => { @@ -8041,7 +8042,7 @@ where .into()))), }; match res { - Ok((channel, commitment_signed, funding_ready_for_sig_event_opt)) => { + Ok((mut channel, commitment_signed, funding_ready_for_sig_event_opt)) => { if let Some(funding_ready_for_sig_event) = funding_ready_for_sig_event_opt { let mut pending_events = self.pending_events.lock().unwrap(); pending_events.push_back((funding_ready_for_sig_event, None)); @@ -8057,6 +8058,7 @@ where update_fee: None, }, }); + channel.set_next_funding_txid(&funding_txid); peer_state.channel_by_id.insert(channel_id.clone(), ChannelPhase::Funded(channel)); }, Err((channel_phase, err)) => { @@ -8092,6 +8094,7 @@ where match channel_phase { ChannelPhase::Funded(chan) => { let (tx_signatures_opt, funding_tx_opt) = try_chan_phase_entry!(self, chan.tx_signatures(&msg), chan_phase_entry); + chan.clear_next_funding_txid(); if let Some(tx_signatures) = tx_signatures_opt { peer_state.pending_msg_events.push(events::MessageSendEvent::SendTxSignatures { node_id: *counterparty_node_id,