Merge pull request #2248 from TheBlueMatt/2023-04-gossip-check
[rust-lightning] / lightning / src / ln / channel.rs
index 691ce3425dae94316dafac7d59e2fd6f5ff73277..f68d7433e4a0c6ebcb257ff96ab3ca7d38477e25 100644 (file)
@@ -2534,7 +2534,13 @@ impl<SP: Deref> Channel<SP> where
                                                          obscure_factor,
                                                          holder_commitment_tx, best_block, self.context.counterparty_node_id);
 
-               channel_monitor.provide_latest_counterparty_commitment_tx(counterparty_initial_bitcoin_tx.txid, Vec::new(), self.context.cur_counterparty_commitment_transaction_number, self.context.counterparty_cur_commitment_point.unwrap(), logger);
+               channel_monitor.provide_initial_counterparty_commitment_tx(
+                       counterparty_initial_bitcoin_tx.txid, Vec::new(),
+                       self.context.cur_counterparty_commitment_transaction_number,
+                       self.context.counterparty_cur_commitment_point.unwrap(),
+                       counterparty_initial_commitment_tx.feerate_per_kw(),
+                       counterparty_initial_commitment_tx.to_broadcaster_value_sat(),
+                       counterparty_initial_commitment_tx.to_countersignatory_value_sat(), logger);
 
                assert_eq!(self.context.channel_state & (ChannelState::MonitorUpdateInProgress as u32), 0); // We have no had any monitor(s) yet to fail update!
                self.context.channel_state = ChannelState::FundingSent as u32;
@@ -5290,7 +5296,9 @@ impl<SP: Deref> Channel<SP> where
                }
                self.context.resend_order = RAACommitmentOrder::RevokeAndACKFirst;
 
-               let (counterparty_commitment_txid, mut htlcs_ref) = self.build_commitment_no_state_update(logger);
+               let (mut htlcs_ref, counterparty_commitment_tx) =
+                       self.build_commitment_no_state_update(logger);
+               let counterparty_commitment_txid = counterparty_commitment_tx.trust().txid();
                let htlcs: Vec<(HTLCOutputInCommitment, Option<Box<HTLCSource>>)> =
                        htlcs_ref.drain(..).map(|(htlc, htlc_source)| (htlc, htlc_source.map(|source_ref| Box::new(source_ref.clone())))).collect();
 
@@ -5305,17 +5313,23 @@ impl<SP: Deref> Channel<SP> where
                                commitment_txid: counterparty_commitment_txid,
                                htlc_outputs: htlcs.clone(),
                                commitment_number: self.context.cur_counterparty_commitment_transaction_number,
-                               their_per_commitment_point: self.context.counterparty_cur_commitment_point.unwrap()
+                               their_per_commitment_point: self.context.counterparty_cur_commitment_point.unwrap(),
+                               feerate_per_kw: Some(counterparty_commitment_tx.feerate_per_kw()),
+                               to_broadcaster_value_sat: Some(counterparty_commitment_tx.to_broadcaster_value_sat()),
+                               to_countersignatory_value_sat: Some(counterparty_commitment_tx.to_countersignatory_value_sat()),
                        }]
                };
                self.context.channel_state |= ChannelState::AwaitingRemoteRevoke as u32;
                monitor_update
        }
 
-       fn build_commitment_no_state_update<L: Deref>(&self, logger: &L) -> (Txid, Vec<(HTLCOutputInCommitment, Option<&HTLCSource>)>) where L::Target: Logger {
+       fn build_commitment_no_state_update<L: Deref>(&self, logger: &L)
+       -> (Vec<(HTLCOutputInCommitment, Option<&HTLCSource>)>, CommitmentTransaction)
+       where L::Target: Logger
+       {
                let counterparty_keys = self.context.build_remote_transaction_keys();
                let commitment_stats = self.context.build_commitment_transaction(self.context.cur_counterparty_commitment_transaction_number, &counterparty_keys, false, true, logger);
-               let counterparty_commitment_txid = commitment_stats.tx.trust().txid();
+               let counterparty_commitment_tx = commitment_stats.tx;
 
                #[cfg(any(test, fuzzing))]
                {
@@ -5335,7 +5349,7 @@ impl<SP: Deref> Channel<SP> where
                        }
                }
 
-               (counterparty_commitment_txid, commitment_stats.htlcs_included)
+               (commitment_stats.htlcs_included, counterparty_commitment_tx)
        }
 
        /// Only fails in case of signer rejection. Used for channel_reestablish commitment_signed
@@ -6457,7 +6471,7 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
                self.generate_accept_channel_message()
        }
 
-       fn funding_created_signature<L: Deref>(&mut self, sig: &Signature, logger: &L) -> Result<(Txid, CommitmentTransaction, Signature), ChannelError> where L::Target: Logger {
+       fn funding_created_signature<L: Deref>(&mut self, sig: &Signature, logger: &L) -> Result<(CommitmentTransaction, CommitmentTransaction, Signature), ChannelError> where L::Target: Logger {
                let funding_script = self.context.get_funding_redeemscript();
 
                let keys = self.context.build_holder_transaction_keys(self.context.cur_holder_commitment_transaction_number);
@@ -6489,7 +6503,7 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
                                        .map_err(|_| ChannelError::Close("Failed to get signatures for new commitment_signed".to_owned()))?.0;
 
                                // We sign "counterparty" commitment transaction, allowing them to broadcast the tx if they wish.
-                               Ok((counterparty_initial_bitcoin_tx.txid, initial_commitment_tx, counterparty_signature))
+                               Ok((counterparty_initial_commitment_tx, initial_commitment_tx, counterparty_signature))
                        }
                }
        }
@@ -6521,7 +6535,7 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
                // funding_created_signature may fail.
                self.context.holder_signer.as_mut().provide_channel_parameters(&self.context.channel_transaction_parameters);
 
-               let (counterparty_initial_commitment_txid, initial_commitment_tx, signature) = match self.funding_created_signature(&msg.signature, logger) {
+               let (counterparty_initial_commitment_tx, initial_commitment_tx, signature) = match self.funding_created_signature(&msg.signature, logger) {
                        Ok(res) => res,
                        Err(ChannelError::Close(e)) => {
                                self.context.channel_transaction_parameters.funding_outpoint = None;
@@ -6562,7 +6576,12 @@ impl<SP: Deref> InboundV1Channel<SP> where SP::Target: SignerProvider {
                                                          obscure_factor,
                                                          holder_commitment_tx, best_block, self.context.counterparty_node_id);
 
-               channel_monitor.provide_latest_counterparty_commitment_tx(counterparty_initial_commitment_txid, Vec::new(), self.context.cur_counterparty_commitment_transaction_number, self.context.counterparty_cur_commitment_point.unwrap(), logger);
+               channel_monitor.provide_initial_counterparty_commitment_tx(
+                       counterparty_initial_commitment_tx.trust().txid(), Vec::new(),
+                       self.context.cur_counterparty_commitment_transaction_number,
+                       self.context.counterparty_cur_commitment_point.unwrap(), self.context.feerate_per_kw,
+                       counterparty_initial_commitment_tx.to_broadcaster_value_sat(),
+                       counterparty_initial_commitment_tx.to_countersignatory_value_sat(), logger);
 
                self.context.channel_state = ChannelState::FundingSent as u32;
                self.context.channel_id = funding_txo.to_channel_id();