Merge pull request #199 from TheBlueMatt/2018-09-184-fixed-monitor
authorMatt Corallo <649246+TheBlueMatt@users.noreply.github.com>
Sun, 30 Sep 2018 01:09:50 +0000 (21:09 -0400)
committerGitHub <noreply@github.com>
Sun, 30 Sep 2018 01:09:50 +0000 (21:09 -0400)
Fix simple to_local revoked output claim and rebase #184

src/ln/channel.rs
src/ln/channelmanager.rs
src/ln/msgs.rs
src/ln/peer_handler.rs

index 83698f1172632ffc8903e4ee7cdb1091867e429f..a8550932d5ad597e4e16bef4cfdfe7ae68f8df3f 100644 (file)
@@ -285,6 +285,24 @@ pub(super) struct Channel {
        pending_inbound_htlcs: Vec<InboundHTLCOutput>,
        pending_outbound_htlcs: Vec<OutboundHTLCOutput>,
        holding_cell_htlc_updates: Vec<HTLCUpdateAwaitingACK>,
+
+       // pending_update_fee is filled when sending and receiving update_fee
+       // For outbound channel, feerate_per_kw is updated with the value from
+       // pending_update_fee when revoke_and_ack is received
+       //
+       // For inbound channel, feerate_per_kw is updated when it receives
+       // commitment_signed and revoke_and_ack is generated
+       // The pending value is kept when another pair of update_fee and commitment_signed
+       // is received during AwaitingRemoteRevoke and relieved when the expected
+       // revoke_and_ack is received and new commitment_signed is generated to be
+       // sent to the funder. Otherwise, the pending value is removed when receiving
+       // commitment_signed.
+       pending_update_fee: Option<u64>,
+       // update_fee() during ChannelState::AwaitingRemoteRevoke is hold in
+       // holdina_cell_update_fee then moved to pending_udpate_fee when revoke_and_ack
+       // is received. holding_cell_update_fee is updated when there are additional
+       // update_fee() during ChannelState::AwaitingRemoteRevoke.
+       holding_cell_update_fee: Option<u64>,
        next_local_htlc_id: u64,
        next_remote_htlc_id: u64,
        channel_update_count: u32,
@@ -445,6 +463,8 @@ impl Channel {
                        pending_inbound_htlcs: Vec::new(),
                        pending_outbound_htlcs: Vec::new(),
                        holding_cell_htlc_updates: Vec::new(),
+                       pending_update_fee: None,
+                       holding_cell_update_fee: None,
                        next_local_htlc_id: 0,
                        next_remote_htlc_id: 0,
                        channel_update_count: 1,
@@ -603,6 +623,8 @@ impl Channel {
                        pending_inbound_htlcs: Vec::new(),
                        pending_outbound_htlcs: Vec::new(),
                        holding_cell_htlc_updates: Vec::new(),
+                       pending_update_fee: None,
+                       holding_cell_update_fee: None,
                        next_local_htlc_id: 0,
                        next_remote_htlc_id: 0,
                        channel_update_count: 1,
@@ -695,7 +717,7 @@ impl Channel {
        /// generated by the peer which proposed adding the HTLCs, and thus we need to understand both
        /// which peer generated this transaction and "to whom" this transaction flows.
        #[inline]
-       fn build_commitment_transaction(&self, commitment_number: u64, keys: &TxCreationKeys, local: bool, generated_by_local: bool) -> (Transaction, Vec<HTLCOutputInCommitment>) {
+       fn build_commitment_transaction(&self, commitment_number: u64, keys: &TxCreationKeys, local: bool, generated_by_local: bool, feerate_per_kw: u64) -> (Transaction, Vec<HTLCOutputInCommitment>) {
                let obscured_commitment_transaction_number = self.get_commitment_transaction_number_obscure_factor() ^ (INITIAL_COMMITMENT_NUMBER - commitment_number);
 
                let txins = {
@@ -719,7 +741,7 @@ impl Channel {
                macro_rules! add_htlc_output {
                        ($htlc: expr, $outbound: expr) => {
                                if $outbound == local { // "offered HTLC output"
-                                       if $htlc.amount_msat / 1000 >= dust_limit_satoshis + (self.feerate_per_kw * HTLC_TIMEOUT_TX_WEIGHT / 1000) {
+                                       if $htlc.amount_msat / 1000 >= dust_limit_satoshis + (feerate_per_kw * HTLC_TIMEOUT_TX_WEIGHT / 1000) {
                                                let htlc_in_tx = get_htlc_in_commitment!($htlc, true);
                                                txouts.push((TxOut {
                                                        script_pubkey: chan_utils::get_htlc_redeemscript(&htlc_in_tx, &keys).to_v0_p2wsh(),
@@ -727,7 +749,7 @@ impl Channel {
                                                }, Some(htlc_in_tx)));
                                        }
                                } else {
-                                       if $htlc.amount_msat / 1000 >= dust_limit_satoshis + (self.feerate_per_kw * HTLC_SUCCESS_TX_WEIGHT / 1000) {
+                                       if $htlc.amount_msat / 1000 >= dust_limit_satoshis + (feerate_per_kw * HTLC_SUCCESS_TX_WEIGHT / 1000) {
                                                let htlc_in_tx = get_htlc_in_commitment!($htlc, false);
                                                txouts.push((TxOut { // "received HTLC output"
                                                        script_pubkey: chan_utils::get_htlc_redeemscript(&htlc_in_tx, &keys).to_v0_p2wsh(),
@@ -791,7 +813,8 @@ impl Channel {
                        }
                }
 
-               let total_fee: u64 = self.feerate_per_kw * (COMMITMENT_TX_BASE_WEIGHT + (txouts.len() as u64) * COMMITMENT_TX_WEIGHT_PER_HTLC) / 1000;
+
+               let total_fee: u64 = feerate_per_kw * (COMMITMENT_TX_BASE_WEIGHT + (txouts.len() as u64) * COMMITMENT_TX_WEIGHT_PER_HTLC) / 1000;
                let value_to_self: i64 = ((self.value_to_self_msat - local_htlc_total_msat) as i64 + value_to_self_msat_offset) / 1000 - if self.channel_outbound { total_fee as i64 } else { 0 };
                let value_to_remote: i64 = (((self.channel_value_satoshis * 1000 - self.value_to_self_msat - remote_htlc_total_msat) as i64 - value_to_self_msat_offset) / 1000) - if self.channel_outbound { 0 } else { total_fee as i64 };
 
@@ -983,8 +1006,8 @@ impl Channel {
        /// Builds the htlc-success or htlc-timeout transaction which spends a given HTLC output
        /// @local is used only to convert relevant internal structures which refer to remote vs local
        /// to decide value of outputs and direction of HTLCs.
-       fn build_htlc_transaction(&self, prev_hash: &Sha256dHash, htlc: &HTLCOutputInCommitment, local: bool, keys: &TxCreationKeys) -> Transaction {
-               chan_utils::build_htlc_transaction(prev_hash, self.feerate_per_kw, if local { self.their_to_self_delay } else { BREAKDOWN_TIMEOUT }, htlc, &keys.a_delayed_payment_key, &keys.revocation_key)
+       fn build_htlc_transaction(&self, prev_hash: &Sha256dHash, htlc: &HTLCOutputInCommitment, local: bool, keys: &TxCreationKeys, feerate_per_kw: u64) -> Transaction {
+               chan_utils::build_htlc_transaction(prev_hash, feerate_per_kw, if local { self.their_to_self_delay } else { BREAKDOWN_TIMEOUT }, htlc, &keys.a_delayed_payment_key, &keys.revocation_key)
        }
 
        fn create_htlc_tx_signature(&self, tx: &Transaction, htlc: &HTLCOutputInCommitment, keys: &TxCreationKeys) -> Result<(Script, Signature, bool), HandleError> {
@@ -1282,14 +1305,14 @@ impl Channel {
                let funding_script = self.get_funding_redeemscript();
 
                let local_keys = self.build_local_transaction_keys(self.cur_local_commitment_transaction_number)?;
-               let local_initial_commitment_tx = self.build_commitment_transaction(self.cur_local_commitment_transaction_number, &local_keys, true, false).0;
+               let local_initial_commitment_tx = self.build_commitment_transaction(self.cur_local_commitment_transaction_number, &local_keys, true, false, self.feerate_per_kw).0;
                let local_sighash = Message::from_slice(&bip143::SighashComponents::new(&local_initial_commitment_tx).sighash_all(&local_initial_commitment_tx.input[0], &funding_script, self.channel_value_satoshis)[..]).unwrap();
 
                // They sign the "local" commitment transaction, allowing us to broadcast the tx if we wish.
                secp_call!(self.secp_ctx.verify(&local_sighash, &sig, &self.their_funding_pubkey.unwrap()), "Invalid funding_created signature from peer", self.channel_id());
 
                let remote_keys = self.build_remote_transaction_keys()?;
-               let remote_initial_commitment_tx = self.build_commitment_transaction(self.cur_remote_commitment_transaction_number, &remote_keys, false, false).0;
+               let remote_initial_commitment_tx = self.build_commitment_transaction(self.cur_remote_commitment_transaction_number, &remote_keys, false, false, self.feerate_per_kw).0;
                let remote_sighash = Message::from_slice(&bip143::SighashComponents::new(&remote_initial_commitment_tx).sighash_all(&remote_initial_commitment_tx.input[0], &funding_script, self.channel_value_satoshis)[..]).unwrap();
 
                // We sign the "remote" commitment transaction, allowing them to broadcast the tx if they wish.
@@ -1356,7 +1379,7 @@ impl Channel {
                let funding_script = self.get_funding_redeemscript();
 
                let local_keys = self.build_local_transaction_keys(self.cur_local_commitment_transaction_number)?;
-               let mut local_initial_commitment_tx = self.build_commitment_transaction(self.cur_local_commitment_transaction_number, &local_keys, true, false).0;
+               let mut local_initial_commitment_tx = self.build_commitment_transaction(self.cur_local_commitment_transaction_number, &local_keys, true, false, self.feerate_per_kw).0;
                let local_sighash = Message::from_slice(&bip143::SighashComponents::new(&local_initial_commitment_tx).sighash_all(&local_initial_commitment_tx.input[0], &funding_script, self.channel_value_satoshis)[..]).unwrap();
 
                // They sign the "local" commitment transaction, allowing us to broadcast the tx if we wish.
@@ -1567,7 +1590,14 @@ impl Channel {
                let funding_script = self.get_funding_redeemscript();
 
                let local_keys = self.build_local_transaction_keys(self.cur_local_commitment_transaction_number)?;
-               let mut local_commitment_tx = self.build_commitment_transaction(self.cur_local_commitment_transaction_number, &local_keys, true, false);
+
+               let feerate_per_kw = if !self.channel_outbound && self.pending_update_fee.is_some() {
+                       self.pending_update_fee.unwrap()
+               } else {
+                       self.feerate_per_kw
+               };
+
+               let mut local_commitment_tx = self.build_commitment_transaction(self.cur_local_commitment_transaction_number, &local_keys, true, false, feerate_per_kw);
                let local_commitment_txid = local_commitment_tx.0.txid();
                let local_sighash = Message::from_slice(&bip143::SighashComponents::new(&local_commitment_tx.0).sighash_all(&local_commitment_tx.0.input[0], &funding_script, self.channel_value_satoshis)[..]).unwrap();
                secp_call!(self.secp_ctx.verify(&local_sighash, &msg.signature, &self.their_funding_pubkey.unwrap()), "Invalid commitment tx signature from peer", self.channel_id());
@@ -1582,7 +1612,7 @@ impl Channel {
 
                let mut htlcs_and_sigs = Vec::with_capacity(local_commitment_tx.1.len());
                for (idx, ref htlc) in local_commitment_tx.1.iter().enumerate() {
-                       let mut htlc_tx = self.build_htlc_transaction(&local_commitment_txid, htlc, true, &local_keys);
+                       let mut htlc_tx = self.build_htlc_transaction(&local_commitment_txid, htlc, true, &local_keys, feerate_per_kw);
                        let htlc_redeemscript = chan_utils::get_htlc_redeemscript(&htlc, &local_keys);
                        let htlc_sighash = Message::from_slice(&bip143::SighashComponents::new(&htlc_tx).sighash_all(&htlc_tx.input[0], &htlc_redeemscript, htlc.amount_msat / 1000)[..]).unwrap();
                        secp_call!(self.secp_ctx.verify(&htlc_sighash, &msg.htlc_signatures[idx], &local_keys.b_htlc_key), "Invalid HTLC tx siganture from peer", self.channel_id());
@@ -1600,9 +1630,22 @@ impl Channel {
                let per_commitment_secret = chan_utils::build_commitment_secret(self.local_keys.commitment_seed, self.cur_local_commitment_transaction_number + 1);
 
                // Update state now that we've passed all the can-fail calls...
+               let mut need_our_commitment = false;
+               if !self.channel_outbound {
+                       if let Some(fee_update) = self.pending_update_fee {
+                               self.feerate_per_kw = fee_update;
+                               // We later use the presence of pending_update_fee to indicate we should generate a
+                               // commitment_signed upon receipt of revoke_and_ack, so we can only set it to None
+                               // if we're not awaiting a revoke (ie will send a commitment_signed now).
+                               if (self.channel_state & ChannelState::AwaitingRemoteRevoke as u32) == 0 {
+                                       need_our_commitment = true;
+                                       self.pending_update_fee = None;
+                               }
+                       }
+               }
+
                self.channel_monitor.provide_latest_local_commitment_tx_info(local_commitment_tx.0, local_keys, self.feerate_per_kw, htlcs_and_sigs);
 
-               let mut need_our_commitment = false;
                for htlc in self.pending_inbound_htlcs.iter_mut() {
                        if htlc.state == InboundHTLCState::RemoteAnnounced {
                                htlc.state = InboundHTLCState::AwaitingRemoteRevokeToAnnounce;
@@ -1637,7 +1680,7 @@ impl Channel {
        /// Used to fulfill holding_cell_htlcs when we get a remote ack (or implicitly get it by them
        /// fulfilling or failing the last pending HTLC)
        fn free_holding_cell_htlcs(&mut self) -> Result<Option<(msgs::CommitmentUpdate, ChannelMonitor)>, HandleError> {
-               if self.holding_cell_htlc_updates.len() != 0 {
+               if self.holding_cell_htlc_updates.len() != 0 || self.holding_cell_update_fee.is_some() {
                        let mut htlc_updates = Vec::new();
                        mem::swap(&mut htlc_updates, &mut self.holding_cell_htlc_updates);
                        let mut update_add_htlcs = Vec::with_capacity(htlc_updates.len());
@@ -1694,18 +1737,28 @@ impl Channel {
                        //fail it back the route, if its a temporary issue we can ignore it...
                        match err {
                                None => {
-                                       if update_add_htlcs.is_empty() && update_fulfill_htlcs.is_empty() && update_fail_htlcs.is_empty() {
+                                       if update_add_htlcs.is_empty() && update_fulfill_htlcs.is_empty() && update_fail_htlcs.is_empty() && self.holding_cell_update_fee.is_none() {
                                                // This should never actually happen and indicates we got some Errs back
                                                // from update_fulfill_htlc/update_fail_htlc, but we handle it anyway in
                                                // case there is some strange way to hit duplicate HTLC removes.
                                                return Ok(None);
                                        }
+                                       let update_fee = if let Some(feerate) = self.holding_cell_update_fee {
+                                                       self.pending_update_fee = self.holding_cell_update_fee.take();
+                                                       Some(msgs::UpdateFee {
+                                                               channel_id: self.channel_id,
+                                                               feerate_per_kw: feerate as u32,
+                                                       })
+                                               } else {
+                                                       None
+                                               };
                                        let (commitment_signed, monitor_update) = self.send_commitment_no_status_check()?;
                                        Ok(Some((msgs::CommitmentUpdate {
                                                update_add_htlcs,
                                                update_fulfill_htlcs,
                                                update_fail_htlcs,
                                                update_fail_malformed_htlcs: Vec::new(),
+                                               update_fee: update_fee,
                                                commitment_signed,
                                        }, monitor_update)))
                                },
@@ -1801,6 +1854,24 @@ impl Channel {
                }
                self.value_to_self_msat = (self.value_to_self_msat as i64 + value_to_self_msat_diff) as u64;
 
+               if self.channel_outbound {
+                       if let Some(feerate) = self.pending_update_fee.take() {
+                               self.feerate_per_kw = feerate;
+                       }
+               } else {
+                       if let Some(feerate) = self.pending_update_fee {
+                               // Because a node cannot send two commitment_signed's in a row without getting a
+                               // revoke_and_ack from us (as it would otherwise not know the per_commitment_point
+                               // it should use to create keys with) and because a node can't send a
+                               // commitment_signed without changes, checking if the feerate is equal to the
+                               // pending feerate update is sufficient to detect require_commitment.
+                               if feerate == self.feerate_per_kw {
+                                       require_commitment = true;
+                                       self.pending_update_fee = None;
+                               }
+                       }
+               }
+
                match self.free_holding_cell_htlcs()? {
                        Some(mut commitment_update) => {
                                commitment_update.0.update_fail_htlcs.reserve(update_fail_htlcs.len());
@@ -1821,6 +1892,7 @@ impl Channel {
                                                update_fulfill_htlcs: Vec::new(),
                                                update_fail_htlcs,
                                                update_fail_malformed_htlcs,
+                                               update_fee: None,
                                                commitment_signed
                                        }), to_forward_infos, revoked_htlcs, monitor_update))
                                } else {
@@ -1828,6 +1900,43 @@ impl Channel {
                                }
                        }
                }
+
+       }
+
+       /// Adds a pending update to this channel. See the doc for send_htlc for
+       /// further details on the optionness of the return value.
+       /// You MUST call send_commitment prior to any other calls on this Channel
+       fn send_update_fee(&mut self, feerate_per_kw: u64) -> Option<msgs::UpdateFee> {
+               if !self.channel_outbound {
+                       panic!("Cannot send fee from inbound channel");
+               }
+
+               if !self.is_usable() {
+                       panic!("Cannot update fee until channel is fully established and we haven't started shutting down");
+               }
+
+               if (self.channel_state & (ChannelState::AwaitingRemoteRevoke as u32)) == (ChannelState::AwaitingRemoteRevoke as u32) {
+                       self.holding_cell_update_fee = Some(feerate_per_kw);
+                       return None;
+               }
+
+               debug_assert!(self.pending_update_fee.is_none());
+               self.pending_update_fee = Some(feerate_per_kw);
+
+               Some(msgs::UpdateFee {
+                       channel_id: self.channel_id,
+                       feerate_per_kw: feerate_per_kw as u32,
+               })
+       }
+
+       pub fn send_update_fee_and_commit(&mut self, feerate_per_kw: u64) -> Result<Option<(msgs::UpdateFee, msgs::CommitmentSigned, ChannelMonitor)>, HandleError> {
+               match self.send_update_fee(feerate_per_kw) {
+                       Some(update_fee) => {
+                               let (commitment_signed, monitor_update) = self.send_commitment_no_status_check()?;
+                               Ok(Some((update_fee, commitment_signed, monitor_update)))
+                       },
+                       None => Ok(None)
+               }
        }
 
        /// Removes any uncommitted HTLCs, to be used on peer disconnection, including any pending
@@ -1904,8 +2013,9 @@ impl Channel {
                        return Err(HandleError{err: "Peer sent update_fee when we needed a channel_reestablish", action: Some(msgs::ErrorAction::SendErrorMessage{msg: msgs::ErrorMessage{data: "Peer sent update_fee when we needed a channel_reestablish".to_string(), channel_id: msg.channel_id}})});
                }
                Channel::check_remote_fee(fee_estimator, msg.feerate_per_kw)?;
+
+               self.pending_update_fee = Some(msg.feerate_per_kw as u64);
                self.channel_update_count += 1;
-               self.feerate_per_kw = msg.feerate_per_kw as u64;
                Ok(())
        }
 
@@ -1981,6 +2091,7 @@ impl Channel {
                                                update_fulfill_htlcs: Vec::new(),
                                                update_fail_htlcs: Vec::new(),
                                                update_fail_malformed_htlcs: Vec::new(),
+                                               update_fee: None,
                                                commitment_signed: self.send_commitment_no_state_update().expect("It looks like we failed to re-generate a commitment_signed we had previously sent?").0,
                                        }), None));
                } else {
@@ -2230,6 +2341,11 @@ impl Channel {
                self.channel_value_satoshis
        }
 
+       #[cfg(test)]
+       pub fn get_feerate(&self) -> u64 {
+               self.feerate_per_kw
+       }
+
        //TODO: Testing purpose only, should be changed in another way after #81
        #[cfg(test)]
        pub fn get_local_keys(&self) -> &ChannelKeys {
@@ -2245,6 +2361,10 @@ impl Channel {
                self.announce_publicly
        }
 
+       pub fn is_outbound(&self) -> bool {
+               self.channel_outbound
+       }
+
        /// Gets the fee we'd want to charge for adding an HTLC output to this Channel
        /// Allowed in any state (including after shutdown)
        pub fn get_our_fee_base_msat(&self, fee_estimator: &FeeEstimator) -> u32 {
@@ -2469,7 +2589,7 @@ impl Channel {
                let funding_script = self.get_funding_redeemscript();
 
                let remote_keys = self.build_remote_transaction_keys()?;
-               let remote_initial_commitment_tx = self.build_commitment_transaction(self.cur_remote_commitment_transaction_number, &remote_keys, false, false).0;
+               let remote_initial_commitment_tx = self.build_commitment_transaction(self.cur_remote_commitment_transaction_number, &remote_keys, false, false, self.feerate_per_kw).0;
                let remote_sighash = Message::from_slice(&bip143::SighashComponents::new(&remote_initial_commitment_tx).sighash_all(&remote_initial_commitment_tx.input[0], &funding_script, self.channel_value_satoshis)[..]).unwrap();
 
                // We sign the "remote" commitment transaction, allowing them to broadcast the tx if they wish.
@@ -2672,7 +2792,7 @@ impl Channel {
                if (self.channel_state & (ChannelState::PeerDisconnected as u32)) == (ChannelState::PeerDisconnected as u32) {
                        panic!("Cannot create commitment tx while disconnected, as send_htlc will have returned an Err so a send_commitment precondition has been violated");
                }
-               let mut have_updates = false; // TODO initialize with "have we sent a fee update?"
+               let mut have_updates = self.pending_update_fee.is_some();
                for htlc in self.pending_outbound_htlcs.iter() {
                        if htlc.state == OutboundHTLCState::LocalAnnounced {
                                have_updates = true;
@@ -2716,8 +2836,15 @@ impl Channel {
        fn send_commitment_no_state_update(&self) -> Result<(msgs::CommitmentSigned, (Transaction, Vec<HTLCOutputInCommitment>)), HandleError> {
                let funding_script = self.get_funding_redeemscript();
 
+               let mut feerate_per_kw = self.feerate_per_kw;
+               if let Some(feerate) = self.pending_update_fee {
+                       if self.channel_outbound {
+                               feerate_per_kw = feerate;
+                       }
+               }
+
                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_tx = self.build_commitment_transaction(self.cur_remote_commitment_transaction_number, &remote_keys, false, true, feerate_per_kw);
                let remote_commitment_txid = remote_commitment_tx.0.txid();
                let remote_sighash = Message::from_slice(&bip143::SighashComponents::new(&remote_commitment_tx.0).sighash_all(&remote_commitment_tx.0.input[0], &funding_script, self.channel_value_satoshis)[..]).unwrap();
                let our_sig = self.secp_ctx.sign(&remote_sighash, &self.local_keys.funding_key);
@@ -2725,7 +2852,7 @@ impl Channel {
                let mut htlc_sigs = Vec::new();
 
                for ref htlc in remote_commitment_tx.1.iter() {
-                       let htlc_tx = self.build_htlc_transaction(&remote_commitment_txid, htlc, false, &remote_keys);
+                       let htlc_tx = self.build_htlc_transaction(&remote_commitment_txid, htlc, false, &remote_keys, feerate_per_kw);
                        let htlc_redeemscript = chan_utils::get_htlc_redeemscript(&htlc, &remote_keys);
                        let htlc_sighash = Message::from_slice(&bip143::SighashComponents::new(&htlc_tx).sighash_all(&htlc_tx.input[0], &htlc_redeemscript, htlc.amount_msat / 1000)[..]).unwrap();
                        let our_htlc_key = secp_derived_key!(chan_utils::derive_private_key(&self.secp_ctx, &remote_keys.per_commitment_point, &self.local_keys.htlc_base_key), self.channel_id());
@@ -2927,7 +3054,7 @@ mod tests {
 
                macro_rules! test_commitment {
                        ( $their_sig_hex: expr, $our_sig_hex: expr, $tx_hex: expr) => {
-                               unsigned_tx = chan.build_commitment_transaction(0xffffffffffff - 42, &keys, true, false);
+                               unsigned_tx = chan.build_commitment_transaction(0xffffffffffff - 42, &keys, true, false, chan.feerate_per_kw);
                                let their_signature = Signature::from_der(&secp_ctx, &hex::decode($their_sig_hex).unwrap()[..]).unwrap();
                                let sighash = Message::from_slice(&bip143::SighashComponents::new(&unsigned_tx.0).sighash_all(&unsigned_tx.0.input[0], &chan.get_funding_redeemscript(), chan.channel_value_satoshis)[..]).unwrap();
                                secp_ctx.verify(&sighash, &their_signature, &chan.their_funding_pubkey.unwrap()).unwrap();
@@ -2944,7 +3071,7 @@ mod tests {
                                let remote_signature = Signature::from_der(&secp_ctx, &hex::decode($their_sig_hex).unwrap()[..]).unwrap();
 
                                let ref htlc = unsigned_tx.1[$htlc_idx];
-                               let mut htlc_tx = chan.build_htlc_transaction(&unsigned_tx.0.txid(), &htlc, true, &keys);
+                               let mut htlc_tx = chan.build_htlc_transaction(&unsigned_tx.0.txid(), &htlc, true, &keys, chan.feerate_per_kw);
                                let htlc_redeemscript = chan_utils::get_htlc_redeemscript(&htlc, &keys);
                                let htlc_sighash = Message::from_slice(&bip143::SighashComponents::new(&htlc_tx).sighash_all(&htlc_tx.input[0], &htlc_redeemscript, htlc.amount_msat / 1000)[..]).unwrap();
                                secp_ctx.verify(&htlc_sighash, &remote_signature, &keys.b_htlc_key).unwrap();
index e6c636ae123173737cda3a1e7a65d1d3a46f68aa..93c5be5604d2a0e1901ad7aa79a79c13ec764cd9 100644 (file)
@@ -1046,6 +1046,7 @@ impl ChannelManager {
                                update_fulfill_htlcs: Vec::new(),
                                update_fail_htlcs: Vec::new(),
                                update_fail_malformed_htlcs: Vec::new(),
+                               update_fee: None,
                                commitment_signed,
                        },
                });
@@ -1212,6 +1213,7 @@ impl ChannelManager {
                                                                update_fulfill_htlcs: Vec::new(),
                                                                update_fail_htlcs: Vec::new(),
                                                                update_fail_malformed_htlcs: Vec::new(),
+                                                               update_fee: None,
                                                                commitment_signed: commitment_msg,
                                                        },
                                                }));
@@ -1333,6 +1335,7 @@ impl ChannelManager {
                                                                update_fulfill_htlcs: Vec::new(),
                                                                update_fail_htlcs: vec![msg],
                                                                update_fail_malformed_htlcs: Vec::new(),
+                                                               update_fee: None,
                                                                commitment_signed: commitment_msg,
                                                        },
                                                });
@@ -1414,6 +1417,7 @@ impl ChannelManager {
                                                        update_fulfill_htlcs: vec![msg],
                                                        update_fail_htlcs: Vec::new(),
                                                        update_fail_malformed_htlcs: Vec::new(),
+                                                       update_fee: None,
                                                        commitment_signed: commitment_msg,
                                                }
                                        });
@@ -1931,6 +1935,44 @@ impl ChannelManager {
                }
                res
        }
+
+       /// Begin Update fee process. Allowed only on an outbound channel.
+       /// If successful, will generate a UpdateHTLCs event, so you should probably poll
+       /// PeerManager::process_events afterwards.
+       /// Note: This API is likely to change!
+       #[doc(hidden)]
+       pub fn update_fee(&self, channel_id: [u8;32], feerate_per_kw: u64) -> Result<(), APIError> {
+               let mut channel_state = self.channel_state.lock().unwrap();
+               match channel_state.by_id.get_mut(&channel_id) {
+                       None => return Err(APIError::APIMisuseError{err: "Failed to find corresponding channel"}),
+                       Some(chan) => {
+                               if !chan.is_usable() {
+                                       return Err(APIError::APIMisuseError{err: "Channel is not in usuable state"});
+                               }
+                               if !chan.is_outbound() {
+                                       return Err(APIError::APIMisuseError{err: "update_fee cannot be sent for an inbound channel"});
+                               }
+                               if let Some((update_fee, commitment_signed, chan_monitor)) = chan.send_update_fee_and_commit(feerate_per_kw).map_err(|e| APIError::APIMisuseError{err: e.err})? {
+                                       if let Err(_e) = self.monitor.add_update_monitor(chan_monitor.get_funding_txo().unwrap(), chan_monitor) {
+                                               unimplemented!();
+                                       }
+                                       let mut pending_events = self.pending_events.lock().unwrap();
+                                       pending_events.push(events::Event::UpdateHTLCs {
+                                               node_id: chan.get_their_node_id(),
+                                               updates: msgs::CommitmentUpdate {
+                                                       update_add_htlcs: Vec::new(),
+                                                       update_fulfill_htlcs: Vec::new(),
+                                                       update_fail_htlcs: Vec::new(),
+                                                       update_fail_malformed_htlcs: Vec::new(),
+                                                       update_fee: Some(update_fee),
+                                                       commitment_signed,
+                                               },
+                                       });
+                               }
+                       },
+               }
+               Ok(())
+       }
 }
 
 impl events::EventsProvider for ChannelManager {
@@ -2691,10 +2733,11 @@ mod tests {
        impl SendEvent {
                fn from_event(event: Event) -> SendEvent {
                        match event {
-                               Event::UpdateHTLCs { node_id, updates: msgs::CommitmentUpdate { update_add_htlcs, update_fulfill_htlcs, update_fail_htlcs, update_fail_malformed_htlcs, commitment_signed } } => {
+                               Event::UpdateHTLCs { node_id, updates: msgs::CommitmentUpdate { update_add_htlcs, update_fulfill_htlcs, update_fail_htlcs, update_fail_malformed_htlcs, update_fee, commitment_signed } } => {
                                        assert!(update_fulfill_htlcs.is_empty());
                                        assert!(update_fail_htlcs.is_empty());
                                        assert!(update_fail_malformed_htlcs.is_empty());
+                                       assert!(update_fee.is_none());
                                        SendEvent { node_id: node_id, msgs: update_add_htlcs, commitment_msg: commitment_signed }
                                },
                                _ => panic!("Unexpected event type!"),
@@ -2702,36 +2745,28 @@ mod tests {
                }
        }
 
+       macro_rules! check_added_monitors {
+               ($node: expr, $count: expr) => {
+                       {
+                               let mut added_monitors = $node.chan_monitor.added_monitors.lock().unwrap();
+                               assert_eq!(added_monitors.len(), $count);
+                               added_monitors.clear();
+                       }
+               }
+       }
+
        macro_rules! commitment_signed_dance {
                ($node_a: expr, $node_b: expr, $commitment_signed: expr, $fail_backwards: expr) => {
                        {
-                               {
-                                       let added_monitors = $node_a.chan_monitor.added_monitors.lock().unwrap();
-                                       assert!(added_monitors.is_empty());
-                               }
+                               check_added_monitors!($node_a, 0);
                                let (as_revoke_and_ack, as_commitment_signed) = $node_a.node.handle_commitment_signed(&$node_b.node.get_our_node_id(), &$commitment_signed).unwrap();
-                               {
-                                       let mut added_monitors = $node_a.chan_monitor.added_monitors.lock().unwrap();
-                                       assert_eq!(added_monitors.len(), 1);
-                                       added_monitors.clear();
-                               }
-                               {
-                                       let added_monitors = $node_b.chan_monitor.added_monitors.lock().unwrap();
-                                       assert!(added_monitors.is_empty());
-                               }
+                               check_added_monitors!($node_a, 1);
+                               check_added_monitors!($node_b, 0);
                                assert!($node_b.node.handle_revoke_and_ack(&$node_a.node.get_our_node_id(), &as_revoke_and_ack).unwrap().is_none());
-                               {
-                                       let mut added_monitors = $node_b.chan_monitor.added_monitors.lock().unwrap();
-                                       assert_eq!(added_monitors.len(), 1);
-                                       added_monitors.clear();
-                               }
+                               check_added_monitors!($node_b, 1);
                                let (bs_revoke_and_ack, bs_none) = $node_b.node.handle_commitment_signed(&$node_a.node.get_our_node_id(), &as_commitment_signed.unwrap()).unwrap();
                                assert!(bs_none.is_none());
-                               {
-                                       let mut added_monitors = $node_b.chan_monitor.added_monitors.lock().unwrap();
-                                       assert_eq!(added_monitors.len(), 1);
-                                       added_monitors.clear();
-                               }
+                               check_added_monitors!($node_b, 1);
                                if $fail_backwards {
                                        assert!($node_a.node.get_and_clear_pending_events().is_empty());
                                }
@@ -2750,24 +2785,26 @@ mod tests {
                }
        }
 
+       macro_rules! get_payment_preimage_hash {
+               ($node: expr) => {
+                       {
+                               let payment_preimage = [*$node.network_payment_count.borrow(); 32];
+                               *$node.network_payment_count.borrow_mut() += 1;
+                               let mut payment_hash = [0; 32];
+                               let mut sha = Sha256::new();
+                               sha.input(&payment_preimage[..]);
+                               sha.result(&mut payment_hash);
+                               (payment_preimage, payment_hash)
+                       }
+               }
+       }
+
        fn send_along_route(origin_node: &Node, route: Route, expected_route: &[&Node], recv_value: u64) -> ([u8; 32], [u8; 32]) {
-               let our_payment_preimage = [*origin_node.network_payment_count.borrow(); 32];
-               *origin_node.network_payment_count.borrow_mut() += 1;
-               let our_payment_hash = {
-                       let mut sha = Sha256::new();
-                       sha.input(&our_payment_preimage[..]);
-                       let mut ret = [0; 32];
-                       sha.result(&mut ret);
-                       ret
-               };
+               let (our_payment_preimage, our_payment_hash) = get_payment_preimage_hash!(origin_node);
 
                let mut payment_event = {
                        origin_node.node.send_payment(route, our_payment_hash).unwrap();
-                       {
-                               let mut added_monitors = origin_node.chan_monitor.added_monitors.lock().unwrap();
-                               assert_eq!(added_monitors.len(), 1);
-                               added_monitors.clear();
-                       }
+                       check_added_monitors!(origin_node, 1);
 
                        let mut events = origin_node.node.get_and_clear_pending_events();
                        assert_eq!(events.len(), 1);
@@ -2779,11 +2816,7 @@ mod tests {
                        assert_eq!(node.node.get_our_node_id(), payment_event.node_id);
 
                        node.node.handle_update_add_htlc(&prev_node.node.get_our_node_id(), &payment_event.msgs[0]).unwrap();
-                       {
-                               let added_monitors = node.chan_monitor.added_monitors.lock().unwrap();
-                               assert_eq!(added_monitors.len(), 0);
-                       }
-
+                       check_added_monitors!(node, 0);
                        commitment_signed_dance!(node, prev_node, payment_event.commitment_msg, false);
 
                        let events_1 = node.node.get_and_clear_pending_events();
@@ -2807,11 +2840,7 @@ mod tests {
                                        _ => panic!("Unexpected event"),
                                }
                        } else {
-                               {
-                                       let mut added_monitors = node.chan_monitor.added_monitors.lock().unwrap();
-                                       assert_eq!(added_monitors.len(), 1);
-                                       added_monitors.clear();
-                               }
+                               check_added_monitors!(node, 1);
                                payment_event = SendEvent::from_event(events_2.remove(0));
                                assert_eq!(payment_event.msgs.len(), 1);
                        }
@@ -2824,25 +2853,17 @@ mod tests {
 
        fn claim_payment_along_route(origin_node: &Node, expected_route: &[&Node], skip_last: bool, our_payment_preimage: [u8; 32]) {
                assert!(expected_route.last().unwrap().node.claim_funds(our_payment_preimage));
-               {
-                       let mut added_monitors = expected_route.last().unwrap().chan_monitor.added_monitors.lock().unwrap();
-                       assert_eq!(added_monitors.len(), 1);
-                       added_monitors.clear();
-               }
+               check_added_monitors!(expected_route.last().unwrap(), 1);
 
                let mut next_msgs: Option<(msgs::UpdateFulfillHTLC, msgs::CommitmentSigned)> = None;
                macro_rules! update_fulfill_dance {
                        ($node: expr, $prev_node: expr, $last_node: expr) => {
                                {
                                        $node.node.handle_update_fulfill_htlc(&$prev_node.node.get_our_node_id(), &next_msgs.as_ref().unwrap().0).unwrap();
-                                       {
-                                               let mut added_monitors = $node.chan_monitor.added_monitors.lock().unwrap();
-                                               if $last_node {
-                                                       assert_eq!(added_monitors.len(), 0);
-                                               } else {
-                                                       assert_eq!(added_monitors.len(), 1);
-                                               }
-                                               added_monitors.clear();
+                                       if $last_node {
+                                               check_added_monitors!($node, 0);
+                                       } else {
+                                               check_added_monitors!($node, 1);
                                        }
                                        commitment_signed_dance!($node, $prev_node, next_msgs.as_ref().unwrap().1, false);
                                }
@@ -2861,11 +2882,12 @@ mod tests {
                        if !skip_last || idx != expected_route.len() - 1 {
                                assert_eq!(events.len(), 1);
                                match events[0] {
-                                       Event::UpdateHTLCs { ref node_id, updates: msgs::CommitmentUpdate { ref update_add_htlcs, ref update_fulfill_htlcs, ref update_fail_htlcs, ref update_fail_malformed_htlcs, ref commitment_signed } } => {
+                                       Event::UpdateHTLCs { ref node_id, updates: msgs::CommitmentUpdate { ref update_add_htlcs, ref update_fulfill_htlcs, ref update_fail_htlcs, ref update_fail_malformed_htlcs, ref update_fee, ref commitment_signed } } => {
                                                assert!(update_add_htlcs.is_empty());
                                                assert_eq!(update_fulfill_htlcs.len(), 1);
                                                assert!(update_fail_htlcs.is_empty());
                                                assert!(update_fail_malformed_htlcs.is_empty());
+                                               assert!(update_fee.is_none());
                                                expected_next_node = node_id.clone();
                                                next_msgs = Some((update_fulfill_htlcs[0].clone(), commitment_signed.clone()));
                                        },
@@ -2917,15 +2939,7 @@ mod tests {
                        assert_eq!(hop.pubkey, node.node.get_our_node_id());
                }
 
-               let our_payment_preimage = [*origin_node.network_payment_count.borrow(); 32];
-               *origin_node.network_payment_count.borrow_mut() += 1;
-               let our_payment_hash = {
-                       let mut sha = Sha256::new();
-                       sha.input(&our_payment_preimage[..]);
-                       let mut ret = [0; 32];
-                       sha.result(&mut ret);
-                       ret
-               };
+               let (_, our_payment_hash) = get_payment_preimage_hash!(origin_node);
 
                let err = origin_node.node.send_payment(route, our_payment_hash).err().unwrap();
                match err {
@@ -2941,11 +2955,7 @@ mod tests {
 
        fn fail_payment_along_route(origin_node: &Node, expected_route: &[&Node], skip_last: bool, our_payment_hash: [u8; 32]) {
                assert!(expected_route.last().unwrap().node.fail_htlc_backwards(&our_payment_hash));
-               {
-                       let mut added_monitors = expected_route.last().unwrap().chan_monitor.added_monitors.lock().unwrap();
-                       assert_eq!(added_monitors.len(), 1);
-                       added_monitors.clear();
-               }
+               check_added_monitors!(expected_route.last().unwrap(), 1);
 
                let mut next_msgs: Option<(msgs::UpdateFailHTLC, msgs::CommitmentSigned)> = None;
                macro_rules! update_fail_dance {
@@ -2972,11 +2982,12 @@ mod tests {
                        if !skip_last || idx != expected_route.len() - 1 {
                                assert_eq!(events.len(), 1);
                                match events[0] {
-                                       Event::UpdateHTLCs { ref node_id, updates: msgs::CommitmentUpdate { ref update_add_htlcs, ref update_fulfill_htlcs, ref update_fail_htlcs, ref update_fail_malformed_htlcs, ref commitment_signed } } => {
+                                       Event::UpdateHTLCs { ref node_id, updates: msgs::CommitmentUpdate { ref update_add_htlcs, ref update_fulfill_htlcs, ref update_fail_htlcs, ref update_fail_malformed_htlcs, ref update_fee, ref commitment_signed } } => {
                                                assert!(update_add_htlcs.is_empty());
                                                assert!(update_fulfill_htlcs.is_empty());
                                                assert_eq!(update_fail_htlcs.len(), 1);
                                                assert!(update_fail_malformed_htlcs.is_empty());
+                                               assert!(update_fee.is_none());
                                                expected_next_node = node_id.clone();
                                                next_msgs = Some((update_fail_htlcs[0].clone(), commitment_signed.clone()));
                                        },
@@ -3040,6 +3051,528 @@ mod tests {
                nodes
        }
 
+       #[test]
+       fn test_async_inbound_update_fee() {
+               let mut nodes = create_network(2);
+               let chan = create_announced_chan_between_nodes(&nodes, 0, 1);
+               let channel_id = chan.2;
+
+               macro_rules! get_feerate {
+                       ($node: expr) => {{
+                               let chan_lock = $node.node.channel_state.lock().unwrap();
+                               let chan = chan_lock.by_id.get(&channel_id).unwrap();
+                               chan.get_feerate()
+                       }}
+               }
+
+               // balancing
+               send_payment(&nodes[0], &vec!(&nodes[1])[..], 8000000);
+
+               // A                                        B
+               // update_fee                            ->
+               // send (1) commitment_signed            -.
+               //                                       <- update_add_htlc/commitment_signed
+               // send (2) RAA (awaiting remote revoke) -.
+               // (1) commitment_signed is delivered    ->
+               //                                       .- send (3) RAA (awaiting remote revoke)
+               // (2) RAA is delivered                  ->
+               //                                       .- send (4) commitment_signed
+               //                                       <- (3) RAA is delivered
+               // send (5) commitment_signed            -.
+               //                                       <- (4) commitment_signed is delivered
+               // send (6) RAA                          -.
+               // (5) commitment_signed is delivered    ->
+               //                                       <- RAA
+               // (6) RAA is delivered                  ->
+
+               // First nodes[0] generates an update_fee
+               nodes[0].node.update_fee(channel_id, get_feerate!(nodes[0]) + 20).unwrap();
+               check_added_monitors!(nodes[0], 1);
+
+               let events_0 = nodes[0].node.get_and_clear_pending_events();
+               assert_eq!(events_0.len(), 1);
+               let (update_msg, commitment_signed) = match events_0[0] { // (1)
+                       Event::UpdateHTLCs { updates: msgs::CommitmentUpdate { ref update_fee, ref commitment_signed, .. }, .. } => {
+                               (update_fee.as_ref(), commitment_signed)
+                       },
+                       _ => panic!("Unexpected event"),
+               };
+
+               nodes[1].node.handle_update_fee(&nodes[0].node.get_our_node_id(), update_msg.unwrap()).unwrap();
+
+               // ...but before it's delivered, nodes[1] starts to send a payment back to nodes[0]...
+               let (_, our_payment_hash) = get_payment_preimage_hash!(nodes[0]);
+               nodes[1].node.send_payment(nodes[1].router.get_route(&nodes[0].node.get_our_node_id(), None, &Vec::new(), 40000, TEST_FINAL_CLTV).unwrap(), our_payment_hash).unwrap();
+               check_added_monitors!(nodes[1], 1);
+
+               let payment_event = {
+                       let mut events_1 = nodes[1].node.get_and_clear_pending_events();
+                       assert_eq!(events_1.len(), 1);
+                       SendEvent::from_event(events_1.remove(0))
+               };
+               assert_eq!(payment_event.node_id, nodes[0].node.get_our_node_id());
+               assert_eq!(payment_event.msgs.len(), 1);
+
+               // ...now when the messages get delivered everyone should be happy
+               nodes[0].node.handle_update_add_htlc(&nodes[1].node.get_our_node_id(), &payment_event.msgs[0]).unwrap();
+               let (as_revoke_msg, as_commitment_signed) = nodes[0].node.handle_commitment_signed(&nodes[1].node.get_our_node_id(), &payment_event.commitment_msg).unwrap(); // (2)
+               assert!(as_commitment_signed.is_none()); // nodes[0] is awaiting nodes[1] revoke_and_ack
+               check_added_monitors!(nodes[0], 1);
+
+               // deliver(1), generate (3):
+               let (bs_revoke_msg, bs_commitment_signed) = nodes[1].node.handle_commitment_signed(&nodes[0].node.get_our_node_id(), commitment_signed).unwrap();
+               assert!(bs_commitment_signed.is_none()); // nodes[1] is awaiting nodes[0] revoke_and_ack
+               check_added_monitors!(nodes[1], 1);
+
+               let bs_update = nodes[1].node.handle_revoke_and_ack(&nodes[0].node.get_our_node_id(), &as_revoke_msg).unwrap(); // deliver (2)
+               assert!(bs_update.as_ref().unwrap().update_add_htlcs.is_empty()); // (4)
+               assert!(bs_update.as_ref().unwrap().update_fulfill_htlcs.is_empty()); // (4)
+               assert!(bs_update.as_ref().unwrap().update_fail_htlcs.is_empty()); // (4)
+               assert!(bs_update.as_ref().unwrap().update_fail_malformed_htlcs.is_empty()); // (4)
+               assert!(bs_update.as_ref().unwrap().update_fee.is_none()); // (4)
+               check_added_monitors!(nodes[1], 1);
+
+               let as_update = nodes[0].node.handle_revoke_and_ack(&nodes[1].node.get_our_node_id(), &bs_revoke_msg).unwrap(); // deliver (3)
+               assert!(as_update.as_ref().unwrap().update_add_htlcs.is_empty()); // (5)
+               assert!(as_update.as_ref().unwrap().update_fulfill_htlcs.is_empty()); // (5)
+               assert!(as_update.as_ref().unwrap().update_fail_htlcs.is_empty()); // (5)
+               assert!(as_update.as_ref().unwrap().update_fail_malformed_htlcs.is_empty()); // (5)
+               assert!(as_update.as_ref().unwrap().update_fee.is_none()); // (5)
+               check_added_monitors!(nodes[0], 1);
+
+               let (as_second_revoke, as_second_commitment_signed) = nodes[0].node.handle_commitment_signed(&nodes[1].node.get_our_node_id(), &bs_update.unwrap().commitment_signed).unwrap(); // deliver (4)
+               assert!(as_second_commitment_signed.is_none()); // only (6)
+               check_added_monitors!(nodes[0], 1);
+
+               let (bs_second_revoke, bs_second_commitment_signed) = nodes[1].node.handle_commitment_signed(&nodes[0].node.get_our_node_id(), &as_update.unwrap().commitment_signed).unwrap(); // deliver (5)
+               assert!(bs_second_commitment_signed.is_none());
+               check_added_monitors!(nodes[1], 1);
+
+               assert!(nodes[0].node.handle_revoke_and_ack(&nodes[1].node.get_our_node_id(), &bs_second_revoke).unwrap().is_none());
+               check_added_monitors!(nodes[0], 1);
+
+               let events_2 = nodes[0].node.get_and_clear_pending_events();
+               assert_eq!(events_2.len(), 1);
+               match events_2[0] {
+                       Event::PendingHTLCsForwardable {..} => {}, // If we actually processed we'd receive the payment
+                       _ => panic!("Unexpected event"),
+               }
+
+               assert!(nodes[1].node.handle_revoke_and_ack(&nodes[0].node.get_our_node_id(), &as_second_revoke).unwrap().is_none()); // deliver (6)
+               check_added_monitors!(nodes[1], 1);
+       }
+
+       #[test]
+       fn test_update_fee_unordered_raa() {
+               // Just the intro to the previous test followed by an out-of-order RAA (which caused a
+               // crash in an earlier version of the update_fee patch)
+               let mut nodes = create_network(2);
+               let chan = create_announced_chan_between_nodes(&nodes, 0, 1);
+               let channel_id = chan.2;
+
+               macro_rules! get_feerate {
+                       ($node: expr) => {{
+                               let chan_lock = $node.node.channel_state.lock().unwrap();
+                               let chan = chan_lock.by_id.get(&channel_id).unwrap();
+                               chan.get_feerate()
+                       }}
+               }
+
+               // balancing
+               send_payment(&nodes[0], &vec!(&nodes[1])[..], 8000000);
+
+               // First nodes[0] generates an update_fee
+               nodes[0].node.update_fee(channel_id, get_feerate!(nodes[0]) + 20).unwrap();
+               check_added_monitors!(nodes[0], 1);
+
+               let events_0 = nodes[0].node.get_and_clear_pending_events();
+               assert_eq!(events_0.len(), 1);
+               let update_msg = match events_0[0] { // (1)
+                       Event::UpdateHTLCs { updates: msgs::CommitmentUpdate { ref update_fee, .. }, .. } => {
+                               update_fee.as_ref()
+                       },
+                       _ => panic!("Unexpected event"),
+               };
+
+               nodes[1].node.handle_update_fee(&nodes[0].node.get_our_node_id(), update_msg.unwrap()).unwrap();
+
+               // ...but before it's delivered, nodes[1] starts to send a payment back to nodes[0]...
+               let (_, our_payment_hash) = get_payment_preimage_hash!(nodes[0]);
+               nodes[1].node.send_payment(nodes[1].router.get_route(&nodes[0].node.get_our_node_id(), None, &Vec::new(), 40000, TEST_FINAL_CLTV).unwrap(), our_payment_hash).unwrap();
+               check_added_monitors!(nodes[1], 1);
+
+               let payment_event = {
+                       let mut events_1 = nodes[1].node.get_and_clear_pending_events();
+                       assert_eq!(events_1.len(), 1);
+                       SendEvent::from_event(events_1.remove(0))
+               };
+               assert_eq!(payment_event.node_id, nodes[0].node.get_our_node_id());
+               assert_eq!(payment_event.msgs.len(), 1);
+
+               // ...now when the messages get delivered everyone should be happy
+               nodes[0].node.handle_update_add_htlc(&nodes[1].node.get_our_node_id(), &payment_event.msgs[0]).unwrap();
+               let (as_revoke_msg, as_commitment_signed) = nodes[0].node.handle_commitment_signed(&nodes[1].node.get_our_node_id(), &payment_event.commitment_msg).unwrap(); // (2)
+               assert!(as_commitment_signed.is_none()); // nodes[0] is awaiting nodes[1] revoke_and_ack
+               check_added_monitors!(nodes[0], 1);
+
+               assert!(nodes[1].node.handle_revoke_and_ack(&nodes[0].node.get_our_node_id(), &as_revoke_msg).unwrap().is_none()); // deliver (2)
+               check_added_monitors!(nodes[1], 1);
+
+               // We can't continue, sadly, because our (1) now has a bogus signature
+       }
+
+       #[test]
+       fn test_multi_flight_update_fee() {
+               let nodes = create_network(2);
+               let chan = create_announced_chan_between_nodes(&nodes, 0, 1);
+               let channel_id = chan.2;
+
+               macro_rules! get_feerate {
+                       ($node: expr) => {{
+                               let chan_lock = $node.node.channel_state.lock().unwrap();
+                               let chan = chan_lock.by_id.get(&channel_id).unwrap();
+                               chan.get_feerate()
+                       }}
+               }
+
+               // A                                        B
+               // update_fee/commitment_signed          ->
+               //                                       .- send (1) RAA and (2) commitment_signed
+               // update_fee (never committed)          ->
+               // (3) update_fee                        ->
+               // We have to manually generate the above update_fee, it is allowed by the protocol but we
+               // don't track which updates correspond to which revoke_and_ack responses so we're in
+               // AwaitingRAA mode and will not generate the update_fee yet.
+               //                                       <- (1) RAA delivered
+               // (3) is generated and send (4) CS      -.
+               // Note that A cannot generate (4) prior to (1) being delivered as it otherwise doesn't
+               // know the per_commitment_point to use for it.
+               //                                       <- (2) commitment_signed delivered
+               // revoke_and_ack                        ->
+               //                                          B should send no response here
+               // (4) commitment_signed delivered       ->
+               //                                       <- RAA/commitment_signed delivered
+               // revoke_and_ack                        ->
+
+               // First nodes[0] generates an update_fee
+               let initial_feerate = get_feerate!(nodes[0]);
+               nodes[0].node.update_fee(channel_id, initial_feerate + 20).unwrap();
+               check_added_monitors!(nodes[0], 1);
+
+               let events_0 = nodes[0].node.get_and_clear_pending_events();
+               assert_eq!(events_0.len(), 1);
+               let (update_msg_1, commitment_signed_1) = match events_0[0] { // (1)
+                       Event::UpdateHTLCs { updates: msgs::CommitmentUpdate { ref update_fee, ref commitment_signed, .. }, .. } => {
+                               (update_fee.as_ref().unwrap(), commitment_signed)
+                       },
+                       _ => panic!("Unexpected event"),
+               };
+
+               // Deliver first update_fee/commitment_signed pair, generating (1) and (2):
+               nodes[1].node.handle_update_fee(&nodes[0].node.get_our_node_id(), update_msg_1).unwrap();
+               let (bs_revoke_msg, bs_commitment_signed) = nodes[1].node.handle_commitment_signed(&nodes[0].node.get_our_node_id(), commitment_signed_1).unwrap();
+               check_added_monitors!(nodes[1], 1);
+
+               // nodes[0] is awaiting a revoke from nodes[1] before it will create a new commitment
+               // transaction:
+               nodes[0].node.update_fee(channel_id, initial_feerate + 40).unwrap();
+               assert!(nodes[0].node.get_and_clear_pending_events().is_empty());
+
+               // Create the (3) update_fee message that nodes[0] will generate before it does...
+               let mut update_msg_2 = msgs::UpdateFee {
+                       channel_id: update_msg_1.channel_id.clone(),
+                       feerate_per_kw: (initial_feerate + 30) as u32,
+               };
+
+               nodes[1].node.handle_update_fee(&nodes[0].node.get_our_node_id(), &update_msg_2).unwrap();
+
+               update_msg_2.feerate_per_kw = (initial_feerate + 40) as u32;
+               // Deliver (3)
+               nodes[1].node.handle_update_fee(&nodes[0].node.get_our_node_id(), &update_msg_2).unwrap();
+
+               // Deliver (1), generating (3) and (4)
+               let as_second_update = nodes[0].node.handle_revoke_and_ack(&nodes[1].node.get_our_node_id(), &bs_revoke_msg).unwrap();
+               check_added_monitors!(nodes[0], 1);
+               assert!(as_second_update.as_ref().unwrap().update_add_htlcs.is_empty());
+               assert!(as_second_update.as_ref().unwrap().update_fulfill_htlcs.is_empty());
+               assert!(as_second_update.as_ref().unwrap().update_fail_htlcs.is_empty());
+               assert!(as_second_update.as_ref().unwrap().update_fail_malformed_htlcs.is_empty());
+               // Check that the update_fee newly generated matches what we delivered:
+               assert_eq!(as_second_update.as_ref().unwrap().update_fee.as_ref().unwrap().channel_id, update_msg_2.channel_id);
+               assert_eq!(as_second_update.as_ref().unwrap().update_fee.as_ref().unwrap().feerate_per_kw, update_msg_2.feerate_per_kw);
+
+               // Deliver (2) commitment_signed
+               let (as_revoke_msg, as_commitment_signed) = nodes[0].node.handle_commitment_signed(&nodes[1].node.get_our_node_id(), bs_commitment_signed.as_ref().unwrap()).unwrap();
+               check_added_monitors!(nodes[0], 1);
+               assert!(as_commitment_signed.is_none());
+
+               assert!(nodes[1].node.handle_revoke_and_ack(&nodes[0].node.get_our_node_id(), &as_revoke_msg).unwrap().is_none());
+               check_added_monitors!(nodes[1], 1);
+
+               // Delever (4)
+               let (bs_second_revoke, bs_second_commitment) = nodes[1].node.handle_commitment_signed(&nodes[0].node.get_our_node_id(), &as_second_update.unwrap().commitment_signed).unwrap();
+               check_added_monitors!(nodes[1], 1);
+
+               assert!(nodes[0].node.handle_revoke_and_ack(&nodes[1].node.get_our_node_id(), &bs_second_revoke).unwrap().is_none());
+               check_added_monitors!(nodes[0], 1);
+
+               let (as_second_revoke, as_second_commitment) = nodes[0].node.handle_commitment_signed(&nodes[1].node.get_our_node_id(), &bs_second_commitment.unwrap()).unwrap();
+               assert!(as_second_commitment.is_none());
+               check_added_monitors!(nodes[0], 1);
+
+               assert!(nodes[1].node.handle_revoke_and_ack(&nodes[0].node.get_our_node_id(), &as_second_revoke).unwrap().is_none());
+               check_added_monitors!(nodes[1], 1);
+       }
+
+       #[test]
+       fn test_update_fee_vanilla() {
+               let nodes = create_network(2);
+               let chan = create_announced_chan_between_nodes(&nodes, 0, 1);
+               let channel_id = chan.2;
+
+               macro_rules! get_feerate {
+                       ($node: expr) => {{
+                               let chan_lock = $node.node.channel_state.lock().unwrap();
+                               let chan = chan_lock.by_id.get(&channel_id).unwrap();
+                               chan.get_feerate()
+                       }}
+               }
+
+               let feerate = get_feerate!(nodes[0]);
+               nodes[0].node.update_fee(channel_id, feerate+20).unwrap();
+
+               let events_0 = nodes[0].node.get_and_clear_pending_events();
+               assert_eq!(events_0.len(), 1);
+               let (update_msg, commitment_signed) = match events_0[0] {
+                               Event::UpdateHTLCs { node_id:_, updates: msgs::CommitmentUpdate { update_add_htlcs:_, update_fulfill_htlcs:_, update_fail_htlcs:_, update_fail_malformed_htlcs:_, ref update_fee, ref commitment_signed } } => {
+                               (update_fee.as_ref(), commitment_signed)
+                       },
+                       _ => panic!("Unexpected event"),
+               };
+               nodes[1].node.handle_update_fee(&nodes[0].node.get_our_node_id(), update_msg.unwrap()).unwrap();
+
+               let (revoke_msg, commitment_signed) = nodes[1].node.handle_commitment_signed(&nodes[0].node.get_our_node_id(), commitment_signed).unwrap();
+               let commitment_signed = commitment_signed.unwrap();
+               check_added_monitors!(nodes[0], 1);
+               check_added_monitors!(nodes[1], 1);
+
+               let resp_option = nodes[0].node.handle_revoke_and_ack(&nodes[1].node.get_our_node_id(), &revoke_msg).unwrap();
+               assert!(resp_option.is_none());
+               check_added_monitors!(nodes[0], 1);
+
+               let (revoke_msg, commitment_signed) = nodes[0].node.handle_commitment_signed(&nodes[1].node.get_our_node_id(), &commitment_signed).unwrap();
+               assert!(commitment_signed.is_none());
+               check_added_monitors!(nodes[0], 1);
+
+               let resp_option = nodes[1].node.handle_revoke_and_ack(&nodes[0].node.get_our_node_id(), &revoke_msg).unwrap();
+               assert!(resp_option.is_none());
+               check_added_monitors!(nodes[1], 1);
+       }
+
+       #[test]
+       fn test_update_fee_with_fundee_update_add_htlc() {
+               let mut nodes = create_network(2);
+               let chan = create_announced_chan_between_nodes(&nodes, 0, 1);
+               let channel_id = chan.2;
+
+               macro_rules! get_feerate {
+                       ($node: expr) => {{
+                               let chan_lock = $node.node.channel_state.lock().unwrap();
+                               let chan = chan_lock.by_id.get(&channel_id).unwrap();
+                               chan.get_feerate()
+                       }}
+               }
+
+               // balancing
+               send_payment(&nodes[0], &vec!(&nodes[1])[..], 8000000);
+
+               let feerate = get_feerate!(nodes[0]);
+               nodes[0].node.update_fee(channel_id, feerate+20).unwrap();
+
+               let events_0 = nodes[0].node.get_and_clear_pending_events();
+               assert_eq!(events_0.len(), 1);
+               let (update_msg, commitment_signed) = match events_0[0] {
+                               Event::UpdateHTLCs { node_id:_, updates: msgs::CommitmentUpdate { update_add_htlcs:_, update_fulfill_htlcs:_, update_fail_htlcs:_, update_fail_malformed_htlcs:_, ref update_fee, ref commitment_signed } } => {
+                               (update_fee.as_ref(), commitment_signed)
+                       },
+                       _ => panic!("Unexpected event"),
+               };
+               nodes[1].node.handle_update_fee(&nodes[0].node.get_our_node_id(), update_msg.unwrap()).unwrap();
+               check_added_monitors!(nodes[0], 1);
+               let (revoke_msg, commitment_signed) = nodes[1].node.handle_commitment_signed(&nodes[0].node.get_our_node_id(), commitment_signed).unwrap();
+               let commitment_signed = commitment_signed.unwrap();
+               check_added_monitors!(nodes[1], 1);
+
+               let route = nodes[1].router.get_route(&nodes[0].node.get_our_node_id(), None, &Vec::new(), 800000, TEST_FINAL_CLTV).unwrap();
+
+               let (our_payment_preimage, our_payment_hash) = get_payment_preimage_hash!(nodes[1]);
+
+               // nothing happens since node[1] is in AwaitingRemoteRevoke
+               nodes[1].node.send_payment(route, our_payment_hash).unwrap();
+               {
+                       let mut added_monitors = nodes[0].chan_monitor.added_monitors.lock().unwrap();
+                       assert_eq!(added_monitors.len(), 0);
+                       added_monitors.clear();
+               }
+               let events = nodes[0].node.get_and_clear_pending_events();
+               assert_eq!(events.len(), 0);
+               // node[1] has nothing to do
+
+               let resp_option = nodes[0].node.handle_revoke_and_ack(&nodes[1].node.get_our_node_id(), &revoke_msg).unwrap();
+               assert!(resp_option.is_none());
+               check_added_monitors!(nodes[0], 1);
+
+               let (revoke_msg, commitment_signed) = nodes[0].node.handle_commitment_signed(&nodes[1].node.get_our_node_id(), &commitment_signed).unwrap();
+               assert!(commitment_signed.is_none());
+               check_added_monitors!(nodes[0], 1);
+               let resp_option = nodes[1].node.handle_revoke_and_ack(&nodes[0].node.get_our_node_id(), &revoke_msg).unwrap();
+               // AwaitingRemoteRevoke ends here
+
+               let commitment_update = resp_option.unwrap();
+               assert_eq!(commitment_update.update_add_htlcs.len(), 1);
+               assert_eq!(commitment_update.update_fulfill_htlcs.len(), 0);
+               assert_eq!(commitment_update.update_fail_htlcs.len(), 0);
+               assert_eq!(commitment_update.update_fail_malformed_htlcs.len(), 0);
+               assert_eq!(commitment_update.update_fee.is_none(), true);
+
+               nodes[0].node.handle_update_add_htlc(&nodes[1].node.get_our_node_id(), &commitment_update.update_add_htlcs[0]).unwrap();
+               let (revoke, commitment_signed) = nodes[0].node.handle_commitment_signed(&nodes[1].node.get_our_node_id(), &commitment_update.commitment_signed).unwrap();
+               check_added_monitors!(nodes[0], 1);
+               check_added_monitors!(nodes[1], 1);
+               let commitment_signed = commitment_signed.unwrap();
+               let resp_option = nodes[1].node.handle_revoke_and_ack(&nodes[0].node.get_our_node_id(), &revoke).unwrap();
+               check_added_monitors!(nodes[1], 1);
+               assert!(resp_option.is_none());
+
+               let (revoke, commitment_signed) = nodes[1].node.handle_commitment_signed(&nodes[0].node.get_our_node_id(), &commitment_signed).unwrap();
+               check_added_monitors!(nodes[1], 1);
+               assert!(commitment_signed.is_none());
+               let resp_option = nodes[0].node.handle_revoke_and_ack(&nodes[1].node.get_our_node_id(), &revoke).unwrap();
+               check_added_monitors!(nodes[0], 1);
+               assert!(resp_option.is_none());
+
+               let events = nodes[0].node.get_and_clear_pending_events();
+               assert_eq!(events.len(), 1);
+               match events[0] {
+                       Event::PendingHTLCsForwardable { .. } => { },
+                       _ => panic!("Unexpected event"),
+               };
+               nodes[0].node.channel_state.lock().unwrap().next_forward = Instant::now();
+               nodes[0].node.process_pending_htlc_forwards();
+
+               let events = nodes[0].node.get_and_clear_pending_events();
+               assert_eq!(events.len(), 1);
+               match events[0] {
+                       Event::PaymentReceived { .. } => { },
+                       _ => panic!("Unexpected event"),
+               };
+
+               claim_payment(&nodes[1], &vec!(&nodes[0])[..], our_payment_preimage);
+
+               send_payment(&nodes[1], &vec!(&nodes[0])[..], 800000);
+               send_payment(&nodes[0], &vec!(&nodes[1])[..], 800000);
+               close_channel(&nodes[0], &nodes[1], &chan.2, chan.3, true);
+       }
+
+       #[test]
+       fn test_update_fee() {
+               let nodes = create_network(2);
+               let chan = create_announced_chan_between_nodes(&nodes, 0, 1);
+               let channel_id = chan.2;
+
+               macro_rules! get_feerate {
+                       ($node: expr) => {{
+                               let chan_lock = $node.node.channel_state.lock().unwrap();
+                               let chan = chan_lock.by_id.get(&channel_id).unwrap();
+                               chan.get_feerate()
+                       }}
+               }
+
+               // A                                        B
+               // (1) update_fee/commitment_signed      ->
+               //                                       <- (2) revoke_and_ack
+               //                                       .- send (3) commitment_signed
+               // (4) update_fee/commitment_signed      ->
+               //                                       .- send (5) revoke_and_ack (no CS as we're awaiting a revoke)
+               //                                       <- (3) commitment_signed delivered
+               // send (6) revoke_and_ack               -.
+               //                                       <- (5) deliver revoke_and_ack
+               // (6) deliver revoke_and_ack            ->
+               //                                       .- send (7) commitment_signed in response to (4)
+               //                                       <- (7) deliver commitment_signed
+               // revoke_and_ack                        ->
+
+               // Create and deliver (1)...
+               let feerate = get_feerate!(nodes[0]);
+               nodes[0].node.update_fee(channel_id, feerate+20).unwrap();
+
+               let events_0 = nodes[0].node.get_and_clear_pending_events();
+               assert_eq!(events_0.len(), 1);
+               let (update_msg, commitment_signed) = match events_0[0] {
+                               Event::UpdateHTLCs { node_id:_, updates: msgs::CommitmentUpdate { update_add_htlcs:_, update_fulfill_htlcs:_, update_fail_htlcs:_, update_fail_malformed_htlcs:_, ref update_fee, ref commitment_signed } } => {
+                               (update_fee.as_ref(), commitment_signed)
+                       },
+                       _ => panic!("Unexpected event"),
+               };
+               nodes[1].node.handle_update_fee(&nodes[0].node.get_our_node_id(), update_msg.unwrap()).unwrap();
+
+               // Generate (2) and (3):
+               let (revoke_msg, commitment_signed) = nodes[1].node.handle_commitment_signed(&nodes[0].node.get_our_node_id(), commitment_signed).unwrap();
+               let commitment_signed_0 = commitment_signed.unwrap();
+               check_added_monitors!(nodes[0], 1);
+               check_added_monitors!(nodes[1], 1);
+
+               // Deliver (2):
+               let resp_option = nodes[0].node.handle_revoke_and_ack(&nodes[1].node.get_our_node_id(), &revoke_msg).unwrap();
+               assert!(resp_option.is_none());
+               check_added_monitors!(nodes[0], 1);
+
+               // Create and deliver (4)...
+               nodes[0].node.update_fee(channel_id, feerate+30).unwrap();
+               let events_0 = nodes[0].node.get_and_clear_pending_events();
+               assert_eq!(events_0.len(), 1);
+               let (update_msg, commitment_signed) = match events_0[0] {
+                               Event::UpdateHTLCs { node_id:_, updates: msgs::CommitmentUpdate { update_add_htlcs:_, update_fulfill_htlcs:_, update_fail_htlcs:_, update_fail_malformed_htlcs:_, ref update_fee, ref commitment_signed } } => {
+                               (update_fee.as_ref(), commitment_signed)
+                       },
+                       _ => panic!("Unexpected event"),
+               };
+               nodes[1].node.handle_update_fee(&nodes[0].node.get_our_node_id(), update_msg.unwrap()).unwrap();
+
+               let (revoke_msg, commitment_signed) = nodes[1].node.handle_commitment_signed(&nodes[0].node.get_our_node_id(), commitment_signed).unwrap();
+               // ... creating (5)
+               assert!(commitment_signed.is_none());
+               check_added_monitors!(nodes[0], 1);
+               check_added_monitors!(nodes[1], 1);
+
+               // Handle (3), creating (6):
+               let (revoke_msg_0, commitment_signed) = nodes[0].node.handle_commitment_signed(&nodes[1].node.get_our_node_id(), &commitment_signed_0).unwrap();
+               assert!(commitment_signed.is_none());
+               check_added_monitors!(nodes[0], 1);
+
+               // Deliver (5):
+               let resp_option = nodes[0].node.handle_revoke_and_ack(&nodes[1].node.get_our_node_id(), &revoke_msg).unwrap();
+               assert!(resp_option.is_none());
+               check_added_monitors!(nodes[0], 1);
+
+               // Deliver (6), creating (7):
+               let resp_option = nodes[1].node.handle_revoke_and_ack(&nodes[0].node.get_our_node_id(), &revoke_msg_0).unwrap();
+               let commitment_signed = resp_option.unwrap().commitment_signed;
+               check_added_monitors!(nodes[1], 1);
+
+               // Deliver (7)
+               let (revoke_msg, commitment_signed) = nodes[0].node.handle_commitment_signed(&nodes[1].node.get_our_node_id(), &commitment_signed).unwrap();
+               assert!(commitment_signed.is_none());
+               check_added_monitors!(nodes[0], 1);
+               let resp_option = nodes[1].node.handle_revoke_and_ack(&nodes[0].node.get_our_node_id(), &revoke_msg).unwrap();
+               assert!(resp_option.is_none());
+               check_added_monitors!(nodes[1], 1);
+
+               assert_eq!(get_feerate!(nodes[0]), feerate + 30);
+               assert_eq!(get_feerate!(nodes[1]), feerate + 30);
+               close_channel(&nodes[0], &nodes[1], &chan.2, chan.3, true);
+       }
+
        #[test]
        fn fake_network_test() {
                // Simple test which builds a network of ChannelManagers, connects them to each other, and
@@ -3343,11 +3876,7 @@ mod tests {
                        ($node: expr, $prev_node: expr, $preimage: expr) => {
                                {
                                        assert!($node.node.claim_funds($preimage));
-                                       {
-                                               let mut added_monitors = $node.chan_monitor.added_monitors.lock().unwrap();
-                                               assert_eq!(added_monitors.len(), 1);
-                                               added_monitors.clear();
-                                       }
+                                       check_added_monitors!($node, 1);
 
                                        let events = $node.node.get_and_clear_pending_events();
                                        assert_eq!(events.len(), 1);
@@ -3675,23 +4204,11 @@ mod tests {
 
                let route = nodes[0].router.get_route(&nodes[2].node.get_our_node_id(), None, &Vec::new(), 1000000, 42).unwrap();
 
-               let our_payment_preimage = [*nodes[0].network_payment_count.borrow(); 32];
-               *nodes[0].network_payment_count.borrow_mut() += 1;
-               let our_payment_hash = {
-                       let mut sha = Sha256::new();
-                       sha.input(&our_payment_preimage[..]);
-                       let mut ret = [0; 32];
-                       sha.result(&mut ret);
-                       ret
-               };
+               let (our_payment_preimage, our_payment_hash) = get_payment_preimage_hash!(nodes[0]);
 
                let mut payment_event = {
                        nodes[0].node.send_payment(route, our_payment_hash).unwrap();
-                       {
-                               let mut added_monitors = nodes[0].chan_monitor.added_monitors.lock().unwrap();
-                               assert_eq!(added_monitors.len(), 1);
-                               added_monitors.clear();
-                       }
+                       check_added_monitors!(nodes[0], 1);
 
                        let mut events = nodes[0].node.get_and_clear_pending_events();
                        assert_eq!(events.len(), 1);
@@ -3716,20 +4233,10 @@ mod tests {
                payment_event = SendEvent::from_event(events_2.remove(0));
                assert_eq!(payment_event.msgs.len(), 1);
 
-               {
-                       let mut added_monitors = nodes[1].chan_monitor.added_monitors.lock().unwrap();
-                       assert_eq!(added_monitors.len(), 1);
-                       added_monitors.clear();
-               }
-
+               check_added_monitors!(nodes[1], 1);
                nodes[2].node.handle_update_add_htlc(&nodes[1].node.get_our_node_id(), &payment_event.msgs[0]).unwrap();
                nodes[2].node.handle_commitment_signed(&nodes[1].node.get_our_node_id(), &payment_event.commitment_msg).unwrap();
-
-               {
-                       let mut added_monitors = nodes[2].chan_monitor.added_monitors.lock().unwrap();
-                       assert_eq!(added_monitors.len(), 1);
-                       added_monitors.clear();
-               }
+               check_added_monitors!(nodes[2], 1);
 
                // nodes[2] now has the latest commitment transaction, but hasn't revoked its previous
                // state or updated nodes[1]' state. Now force-close and broadcast that commitment/HTLC
@@ -3828,28 +4335,20 @@ mod tests {
                for msg in reestablish_1 {
                        resp_1.push(node_b.node.handle_channel_reestablish(&node_a.node.get_our_node_id(), &msg).unwrap());
                }
-               {
-                       let mut added_monitors = node_b.chan_monitor.added_monitors.lock().unwrap();
-                       if pending_htlc_claims.0 != 0 || pending_htlc_fails.0 != 0 {
-                               assert_eq!(added_monitors.len(), 1);
-                       } else {
-                               assert!(added_monitors.is_empty());
-                       }
-                       added_monitors.clear();
+               if pending_htlc_claims.0 != 0 || pending_htlc_fails.0 != 0 {
+                       check_added_monitors!(node_b, 1);
+               } else {
+                       check_added_monitors!(node_b, 0);
                }
 
                let mut resp_2 = Vec::new();
                for msg in reestablish_2 {
                        resp_2.push(node_a.node.handle_channel_reestablish(&node_b.node.get_our_node_id(), &msg).unwrap());
                }
-               {
-                       let mut added_monitors = node_a.chan_monitor.added_monitors.lock().unwrap();
-                       if pending_htlc_claims.1 != 0 || pending_htlc_fails.1 != 0 {
-                               assert_eq!(added_monitors.len(), 1);
-                       } else {
-                               assert!(added_monitors.is_empty());
-                       }
-                       added_monitors.clear();
+               if pending_htlc_claims.1 != 0 || pending_htlc_fails.1 != 0 {
+                       check_added_monitors!(node_a, 1);
+               } else {
+                       check_added_monitors!(node_a, 0);
                }
 
                // We dont yet support both needing updates, as that would require a different commitment dance:
index 7513aa79711da888796c5090bc35fe435773b45e..9ff62de38c6e6ae950d5f4143b65542698918c17 100644 (file)
@@ -467,6 +467,7 @@ pub struct CommitmentUpdate {
        pub(crate) update_fulfill_htlcs: Vec<UpdateFulfillHTLC>,
        pub(crate) update_fail_htlcs: Vec<UpdateFailHTLC>,
        pub(crate) update_fail_malformed_htlcs: Vec<UpdateFailMalformedHTLC>,
+       pub(crate) update_fee: Option<UpdateFee>,
        pub(crate) commitment_signed: CommitmentSigned,
 }
 
index 13d3f1a681028aed9ab3dc05467f32a032fdac41..76cc35f64c550b9b401faab6272a9d163383e821 100644 (file)
@@ -647,6 +647,9 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
                                                                                                                for resp in resps.update_fail_htlcs {
                                                                                                                        encode_and_send_msg!(resp, 131);
                                                                                                                }
+                                                                                                               if let Some(resp) = resps.update_fee {
+                                                                                                                       encode_and_send_msg!(resp, 134);
+                                                                                                               }
                                                                                                                encode_and_send_msg!(resps.commitment_signed, 132);
                                                                                                        },
                                                                                                        None => {},
@@ -676,6 +679,9 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
                                                                                                                for resp in resps.update_fail_htlcs {
                                                                                                                        encode_and_send_msg!(resp, 131);
                                                                                                                }
+                                                                                                               if let Some(resp) = resps.update_fee {
+                                                                                                                       encode_and_send_msg!(resp, 134);
+                                                                                                               }
                                                                                                                encode_and_send_msg!(resps.commitment_signed, 132);
                                                                                                        },
                                                                                                        None => {},
@@ -820,7 +826,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
                                                Self::do_attempt_write_data(&mut descriptor, peer);
                                                continue;
                                        },
-                                       Event::UpdateHTLCs { ref node_id, updates: msgs::CommitmentUpdate { ref update_add_htlcs, ref update_fulfill_htlcs, ref update_fail_htlcs, ref update_fail_malformed_htlcs, ref commitment_signed } } => {
+                                       Event::UpdateHTLCs { ref node_id, updates: msgs::CommitmentUpdate { ref update_add_htlcs, ref update_fulfill_htlcs, ref update_fail_htlcs, ref update_fail_malformed_htlcs, ref update_fee, ref commitment_signed } } => {
                                                log_trace!(self, "Handling UpdateHTLCs event in peer_handler for node {} with {} adds, {} fulfills, {} fails for channel {}",
                                                                log_pubkey!(node_id),
                                                                update_add_htlcs.len(),
@@ -842,6 +848,9 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
                                                for msg in update_fail_malformed_htlcs {
                                                        peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encode_msg!(msg, 135)));
                                                }
+                                               if let &Some(ref msg) = update_fee {
+                                                       peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encode_msg!(msg, 134)));
+                                               }
                                                peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encode_msg!(commitment_signed, 132)));
                                                Self::do_attempt_write_data(&mut descriptor, peer);
                                                continue;