Split up send_commitment into a const and non-const version
[rust-lightning] / src / ln / channel.rs
index f80b516492fb7cd1d6a9db670c7a9fe8669d3d21..0d0a22a9f50e7784f57cb8f4e45131af43909d21 100644 (file)
@@ -570,7 +570,7 @@ impl Channel {
                                                              &PublicKey::from_secret_key(&secp_ctx, &chan_keys.delayed_payment_base_key),
                                                              &chan_keys.htlc_base_key,
                                                              BREAKDOWN_TIMEOUT, our_channel_monitor_claim_script);
-               channel_monitor.set_their_htlc_base_key(&msg.htlc_basepoint);
+               channel_monitor.set_their_base_keys(&msg.htlc_basepoint, &msg.delayed_payment_basepoint);
                channel_monitor.set_their_to_self_delay(msg.to_self_delay);
 
                let mut chan = Channel {
@@ -1236,7 +1236,7 @@ impl Channel {
                // max_accepted_htlcs too small
                // dust_limit_satoshis too small
 
-               self.channel_monitor.set_their_htlc_base_key(&msg.htlc_basepoint);
+               self.channel_monitor.set_their_base_keys(&msg.htlc_basepoint, &msg.delayed_payment_basepoint);
 
                self.their_dust_limit_satoshis = msg.dust_limit_satoshis;
                self.their_max_htlc_value_in_flight_msat = cmp::min(msg.max_htlc_value_in_flight_msat, self.channel_value_satoshis * 1000);
@@ -2431,8 +2431,6 @@ impl Channel {
        }
        /// Only fails in case of bad keys
        fn send_commitment_no_status_check(&mut self) -> Result<(msgs::CommitmentSigned, ChannelMonitor), HandleError> {
-               let funding_script = self.get_funding_redeemscript();
-
                // We can upgrade the status of some HTLCs that are waiting on a commitment, even if we
                // fail to generate this, we still are at least at a position where upgrading their status
                // is acceptable.
@@ -2447,6 +2445,22 @@ impl Channel {
                        }
                }
 
+               match self.send_commitment_no_state_update() {
+                       Ok((res, remote_commitment_tx)) => {
+                               // Update state now that we've passed all the can-fail calls...
+                               self.channel_monitor.provide_latest_remote_commitment_tx_info(&remote_commitment_tx.0, remote_commitment_tx.1, self.cur_remote_commitment_transaction_number);
+                               self.channel_state |= ChannelState::AwaitingRemoteRevoke as u32;
+                               Ok((res, self.channel_monitor.clone()))
+                       },
+                       Err(e) => Err(e),
+               }
+       }
+
+       /// Only fails in case of bad keys. Used for channel_reestablish commitment_signed generation
+       /// when we shouldn't change HTLC/channel state.
+       fn send_commitment_no_state_update(&self) -> Result<(msgs::CommitmentSigned, (Transaction, Vec<HTLCOutputInCommitment>)), HandleError> {
+               let funding_script = self.get_funding_redeemscript();
+
                let remote_keys = self.build_remote_transaction_keys()?;
                let remote_commitment_tx = self.build_commitment_transaction(self.cur_remote_commitment_transaction_number, &remote_keys, false, true);
                let remote_commitment_txid = remote_commitment_tx.0.txid();
@@ -2463,15 +2477,11 @@ impl Channel {
                        htlc_sigs.push(self.secp_ctx.sign(&htlc_sighash, &our_htlc_key));
                }
 
-               // Update state now that we've passed all the can-fail calls...
-               self.channel_monitor.provide_latest_remote_commitment_tx_info(&remote_commitment_tx.0, remote_commitment_tx.1, self.cur_remote_commitment_transaction_number);
-               self.channel_state |= ChannelState::AwaitingRemoteRevoke as u32;
-
                Ok((msgs::CommitmentSigned {
                        channel_id: self.channel_id,
                        signature: our_sig,
                        htlc_signatures: htlc_sigs,
-               }, self.channel_monitor.clone()))
+               }, remote_commitment_tx))
        }
 
        /// Adds a pending outbound HTLC to this channel, and creates a signed commitment transaction
@@ -2551,10 +2561,7 @@ impl Channel {
                        }
                }
 
-               for htlc in self.pending_outbound_htlcs.drain(..) {
-                       if htlc.state == OutboundHTLCState::LocalAnnounced {
-                               dropped_outbound_htlcs.push((htlc.source, htlc.payment_hash));
-                       }
+               for _htlc in self.pending_outbound_htlcs.drain(..) {
                        //TODO: Do something with the remaining HTLCs
                        //(we need to have the ChannelManager monitor them so we can claim the inbound HTLCs
                        //which correspond)