Merge pull request #1867 from wpaulino/remove-signer-persistence
authorMatt Corallo <649246+TheBlueMatt@users.noreply.github.com>
Tue, 6 Dec 2022 18:13:49 +0000 (18:13 +0000)
committerGitHub <noreply@github.com>
Tue, 6 Dec 2022 18:13:49 +0000 (18:13 +0000)
Re-derive signers instead of persisting them

1  2 
fuzz/src/chanmon_consistency.rs
fuzz/src/full_stack.rs
lightning/src/chain/channelmonitor.rs
lightning/src/chain/keysinterface.rs
lightning/src/chain/package.rs
lightning/src/ln/chan_utils.rs
lightning/src/ln/chanmon_update_fail_tests.rs
lightning/src/ln/channel.rs
lightning/src/ln/channelmanager.rs
lightning/src/ln/functional_tests.rs
lightning/src/ln/onion_route_tests.rs

index a64d59049b9793bfaaf85166878f57a7ae1258c5,37c0e8ee8408d558d5a93b01eea59e0b1949ec69..605a8c29c291690cacff642d78454d00950517ee
@@@ -193,9 -193,14 +193,14 @@@ impl KeysInterface for KeyProvider 
                ShutdownScript::new_p2wpkh(&pubkey_hash)
        }
  
-       fn get_channel_signer(&self, _inbound: bool, channel_value_satoshis: u64) -> EnforcingSigner {
+       fn generate_channel_keys_id(&self, _inbound: bool, _channel_value_satoshis: u64, _user_channel_id: u128) -> [u8; 32] {
+               let id = self.rand_bytes_id.fetch_add(1, atomic::Ordering::Relaxed) as u8;
+               [id; 32]
+       }
+       fn derive_channel_signer(&self, channel_value_satoshis: u64, channel_keys_id: [u8; 32]) -> Self::Signer {
                let secp_ctx = Secp256k1::signing_only();
-               let id = self.rand_bytes_id.fetch_add(1, atomic::Ordering::Relaxed);
+               let id = channel_keys_id[0];
                let keys = InMemorySigner::new(
                        &secp_ctx,
                        self.get_node_secret(Recipient::Node).unwrap(),
                        SecretKey::from_slice(&[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, self.node_id]).unwrap(),
                        SecretKey::from_slice(&[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, self.node_id]).unwrap(),
                        SecretKey::from_slice(&[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, self.node_id]).unwrap(),
-                       [id as u8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, self.node_id],
+                       [id, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, self.node_id],
                        channel_value_satoshis,
-                       [0; 32],
+                       channel_keys_id,
                );
                let revoked_commitment = self.make_enforcement_state_cell(keys.commitment_seed);
                EnforcingSigner::new_with_revoked(keys, revoked_commitment, false)
@@@ -843,16 -848,16 +848,16 @@@ pub fn do_test<Out: Output>(data: &[u8]
                                let mut events = nodes[$node].get_and_clear_pending_events();
                                // Sort events so that PendingHTLCsForwardable get processed last. This avoids a
                                // case where we first process a PendingHTLCsForwardable, then claim/fail on a
 -                              // PaymentReceived, claiming/failing two HTLCs, but leaving a just-generated
 -                              // PaymentReceived event for the second HTLC in our pending_events (and breaking
 +                              // PaymentClaimable, claiming/failing two HTLCs, but leaving a just-generated
 +                              // PaymentClaimable event for the second HTLC in our pending_events (and breaking
                                // our claim_set deduplication).
                                events.sort_by(|a, b| {
 -                                      if let events::Event::PaymentReceived { .. } = a {
 +                                      if let events::Event::PaymentClaimable { .. } = a {
                                                if let events::Event::PendingHTLCsForwardable { .. } = b {
                                                        Ordering::Less
                                                } else { Ordering::Equal }
                                        } else if let events::Event::PendingHTLCsForwardable { .. } = a {
 -                                              if let events::Event::PaymentReceived { .. } = b {
 +                                              if let events::Event::PaymentClaimable { .. } = b {
                                                        Ordering::Greater
                                                } else { Ordering::Equal }
                                        } else { Ordering::Equal }
                                let had_events = !events.is_empty();
                                for event in events.drain(..) {
                                        match event {
 -                                              events::Event::PaymentReceived { payment_hash, .. } => {
 +                                              events::Event::PaymentClaimable { payment_hash, .. } => {
                                                        if claim_set.insert(payment_hash.0) {
                                                                if $fail {
                                                                        nodes[$node].fail_htlc_backwards(&payment_hash);
diff --combined fuzz/src/full_stack.rs
index 05d82c29b1116d96e1b187d7b47b0f7d3f1973e3,fbe854e01c04e6a1d0ce36019773b130a02696ec..6374328238892ad3727933e64075d6561c88d07e
@@@ -263,6 -263,7 +263,7 @@@ struct KeyProvider 
        node_secret: SecretKey,
        inbound_payment_key: KeyMaterial,
        counter: AtomicU64,
+       signer_state: RefCell<HashMap<u8, (bool, Arc<Mutex<EnforcementState>>)>>
  }
  impl KeysInterface for KeyProvider {
        type Signer = EnforcingSigner;
                ShutdownScript::new_p2wpkh(&pubkey_hash)
        }
  
-       fn get_channel_signer(&self, inbound: bool, channel_value_satoshis: u64) -> EnforcingSigner {
+       fn generate_channel_keys_id(&self, inbound: bool, _channel_value_satoshis: u64, _user_channel_id: u128) -> [u8; 32] {
                let ctr = self.counter.fetch_add(1, Ordering::Relaxed) as u8;
+               self.signer_state.borrow_mut().insert(ctr, (inbound, Arc::new(Mutex::new(EnforcementState::new()))));
+               [ctr; 32]
+       }
+       fn derive_channel_signer(&self, channel_value_satoshis: u64, channel_keys_id: [u8; 32]) -> Self::Signer {
                let secp_ctx = Secp256k1::signing_only();
-               EnforcingSigner::new(if inbound {
+               let ctr = channel_keys_id[0];
+               let (inbound, state) = self.signer_state.borrow().get(&ctr).unwrap().clone();
+               EnforcingSigner::new_with_revoked(if inbound {
                        InMemorySigner::new(
                                &secp_ctx,
                                self.node_secret.clone(),
                                SecretKey::from_slice(&[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, ctr]).unwrap(),
                                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, ctr],
                                channel_value_satoshis,
-                               [0; 32],
+                               channel_keys_id,
                        )
                } else {
                        InMemorySigner::new(
                                SecretKey::from_slice(&[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, ctr]).unwrap(),
                                [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, ctr],
                                channel_value_satoshis,
-                               [0; 32],
+                               channel_keys_id,
                        )
-               })
+               }, state, false)
        }
  
        fn get_secure_random_bytes(&self) -> [u8; 32] {
@@@ -390,7 -398,12 +398,12 @@@ pub fn do_test(data: &[u8], logger: &Ar
        let monitor = Arc::new(chainmonitor::ChainMonitor::new(None, broadcast.clone(), Arc::clone(&logger), fee_est.clone(),
                Arc::new(TestPersister { update_ret: Mutex::new(ChannelMonitorUpdateStatus::Completed) })));
  
-       let keys_manager = Arc::new(KeyProvider { node_secret: our_network_key.clone(), inbound_payment_key: KeyMaterial(inbound_payment_key.try_into().unwrap()), counter: AtomicU64::new(0) });
+       let keys_manager = Arc::new(KeyProvider {
+               node_secret: our_network_key.clone(),
+               inbound_payment_key: KeyMaterial(inbound_payment_key.try_into().unwrap()),
+               counter: AtomicU64::new(0),
+               signer_state: RefCell::new(HashMap::new())
+       });
        let mut config = UserConfig::default();
        config.channel_config.forwarding_fee_proportional_millionths =  slice_to_be32(get_slice!(4));
        config.channel_handshake_config.announced_channel = get_slice!(1)[0] != 0;
                                Event::FundingGenerationReady { temporary_channel_id, counterparty_node_id, channel_value_satoshis, output_script, .. } => {
                                        pending_funding_generation.push((temporary_channel_id, counterparty_node_id, channel_value_satoshis, output_script));
                                },
 -                              Event::PaymentReceived { payment_hash, .. } => {
 +                              Event::PaymentClaimable { payment_hash, .. } => {
                                        //TODO: enhance by fetching random amounts from fuzz input?
                                        payments_received.push(payment_hash);
                                },
index b251e79f18cc38b8878b83346b86a422f2db8e08,585b64646d9d765f3bd7372141110af2db8cb37d..2be7f4cf1f52ebe0d49e8224514b05e07d2d69d0
@@@ -291,7 -291,7 +291,7 @@@ struct CounterpartyCommitmentParameter
  
  impl Writeable for CounterpartyCommitmentParameters {
        fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
-               w.write_all(&byte_utils::be64_to_array(0))?;
+               w.write_all(&(0 as u64).to_be_bytes())?;
                write_tlv_fields!(w, {
                        (0, self.counterparty_delayed_payment_base_key, required),
                        (2, self.counterparty_htlc_base_key, required),
@@@ -945,7 -945,7 +945,7 @@@ impl<Signer: Sign> Writeable for Channe
                self.channel_keys_id.write(writer)?;
                self.holder_revocation_basepoint.write(writer)?;
                writer.write_all(&self.funding_info.0.txid[..])?;
-               writer.write_all(&byte_utils::be16_to_array(self.funding_info.0.index))?;
+               writer.write_all(&self.funding_info.0.index.to_be_bytes())?;
                self.funding_info.1.write(writer)?;
                self.current_counterparty_commitment_txid.write(writer)?;
                self.prev_counterparty_commitment_txid.write(writer)?;
                        },
                }
  
-               writer.write_all(&byte_utils::be16_to_array(self.on_holder_tx_csv))?;
+               writer.write_all(&self.on_holder_tx_csv.to_be_bytes())?;
  
                self.commitment_secrets.write(writer)?;
  
                macro_rules! serialize_htlc_in_commitment {
                        ($htlc_output: expr) => {
                                writer.write_all(&[$htlc_output.offered as u8; 1])?;
-                               writer.write_all(&byte_utils::be64_to_array($htlc_output.amount_msat))?;
-                               writer.write_all(&byte_utils::be32_to_array($htlc_output.cltv_expiry))?;
+                               writer.write_all(&$htlc_output.amount_msat.to_be_bytes())?;
+                               writer.write_all(&$htlc_output.cltv_expiry.to_be_bytes())?;
                                writer.write_all(&$htlc_output.payment_hash.0[..])?;
                                $htlc_output.transaction_output_index.write(writer)?;
                        }
                }
  
-               writer.write_all(&byte_utils::be64_to_array(self.counterparty_claimable_outpoints.len() as u64))?;
+               writer.write_all(&(self.counterparty_claimable_outpoints.len() as u64).to_be_bytes())?;
                for (ref txid, ref htlc_infos) in self.counterparty_claimable_outpoints.iter() {
                        writer.write_all(&txid[..])?;
-                       writer.write_all(&byte_utils::be64_to_array(htlc_infos.len() as u64))?;
+                       writer.write_all(&(htlc_infos.len() as u64).to_be_bytes())?;
                        for &(ref htlc_output, ref htlc_source) in htlc_infos.iter() {
                                debug_assert!(htlc_source.is_none() || Some(**txid) == self.current_counterparty_commitment_txid
                                                || Some(**txid) == self.prev_counterparty_commitment_txid,
                        }
                }
  
-               writer.write_all(&byte_utils::be64_to_array(self.counterparty_commitment_txn_on_chain.len() as u64))?;
+               writer.write_all(&(self.counterparty_commitment_txn_on_chain.len() as u64).to_be_bytes())?;
                for (ref txid, commitment_number) in self.counterparty_commitment_txn_on_chain.iter() {
                        writer.write_all(&txid[..])?;
                        writer.write_all(&byte_utils::be48_to_array(*commitment_number))?;
                }
  
-               writer.write_all(&byte_utils::be64_to_array(self.counterparty_hash_commitment_number.len() as u64))?;
+               writer.write_all(&(self.counterparty_hash_commitment_number.len() as u64).to_be_bytes())?;
                for (ref payment_hash, commitment_number) in self.counterparty_hash_commitment_number.iter() {
                        writer.write_all(&payment_hash.0[..])?;
                        writer.write_all(&byte_utils::be48_to_array(*commitment_number))?;
                writer.write_all(&byte_utils::be48_to_array(self.current_counterparty_commitment_number))?;
                writer.write_all(&byte_utils::be48_to_array(self.current_holder_commitment_number))?;
  
-               writer.write_all(&byte_utils::be64_to_array(self.payment_preimages.len() as u64))?;
+               writer.write_all(&(self.payment_preimages.len() as u64).to_be_bytes())?;
                for payment_preimage in self.payment_preimages.values() {
                        writer.write_all(&payment_preimage.0[..])?;
                }
                        }
                }
  
-               writer.write_all(&byte_utils::be64_to_array(self.pending_events.len() as u64))?;
+               writer.write_all(&(self.pending_events.len() as u64).to_be_bytes())?;
                for event in self.pending_events.iter() {
                        event.write(writer)?;
                }
  
                self.best_block.block_hash().write(writer)?;
-               writer.write_all(&byte_utils::be32_to_array(self.best_block.height()))?;
+               writer.write_all(&self.best_block.height().to_be_bytes())?;
  
-               writer.write_all(&byte_utils::be64_to_array(self.onchain_events_awaiting_threshold_conf.len() as u64))?;
+               writer.write_all(&(self.onchain_events_awaiting_threshold_conf.len() as u64).to_be_bytes())?;
                for ref entry in self.onchain_events_awaiting_threshold_conf.iter() {
                        entry.write(writer)?;
                }
@@@ -1837,60 -1837,12 +1837,60 @@@ impl<Signer: Sign> ChannelMonitor<Signe
                res
        }
  
 +      /// Gets the set of outbound HTLCs which can be (or have been) resolved by this
 +      /// `ChannelMonitor`. This is used to determine if an HTLC was removed from the channel prior
 +      /// to the `ChannelManager` having been persisted.
 +      ///
 +      /// This is similar to [`Self::get_pending_outbound_htlcs`] except it includes HTLCs which were
 +      /// resolved by this `ChannelMonitor`.
 +      pub(crate) fn get_all_current_outbound_htlcs(&self) -> HashMap<HTLCSource, HTLCOutputInCommitment> {
 +              let mut res = HashMap::new();
 +              // Just examine the available counterparty commitment transactions. See docs on
 +              // `fail_unbroadcast_htlcs`, below, for justification.
 +              let us = self.inner.lock().unwrap();
 +              macro_rules! walk_counterparty_commitment {
 +                      ($txid: expr) => {
 +                              if let Some(ref latest_outpoints) = us.counterparty_claimable_outpoints.get($txid) {
 +                                      for &(ref htlc, ref source_option) in latest_outpoints.iter() {
 +                                              if let &Some(ref source) = source_option {
 +                                                      res.insert((**source).clone(), htlc.clone());
 +                                              }
 +                                      }
 +                              }
 +                      }
 +              }
 +              if let Some(ref txid) = us.current_counterparty_commitment_txid {
 +                      walk_counterparty_commitment!(txid);
 +              }
 +              if let Some(ref txid) = us.prev_counterparty_commitment_txid {
 +                      walk_counterparty_commitment!(txid);
 +              }
 +              res
 +      }
 +
        /// Gets the set of outbound HTLCs which are pending resolution in this channel.
        /// This is used to reconstruct pending outbound payments on restart in the ChannelManager.
        pub(crate) fn get_pending_outbound_htlcs(&self) -> HashMap<HTLCSource, HTLCOutputInCommitment> {
 -              let mut res = HashMap::new();
                let us = self.inner.lock().unwrap();
 +              // We're only concerned with the confirmation count of HTLC transactions, and don't
 +              // actually care how many confirmations a commitment transaction may or may not have. Thus,
 +              // we look for either a FundingSpendConfirmation event or a funding_spend_confirmed.
 +              let confirmed_txid = us.funding_spend_confirmed.or_else(|| {
 +                      us.onchain_events_awaiting_threshold_conf.iter().find_map(|event| {
 +                              if let OnchainEvent::FundingSpendConfirmation { .. } = event.event {
 +                                      Some(event.txid)
 +                              } else { None }
 +                      })
 +              });
  
 +              if confirmed_txid.is_none() {
 +                      // If we have not seen a commitment transaction on-chain (ie the channel is not yet
 +                      // closed), just get the full set.
 +                      mem::drop(us);
 +                      return self.get_all_current_outbound_htlcs();
 +              }
 +
 +              let mut res = HashMap::new();
                macro_rules! walk_htlcs {
                        ($holder_commitment: expr, $htlc_iter: expr) => {
                                for (htlc, source) in $htlc_iter {
                        }
                }
  
 -              // We're only concerned with the confirmation count of HTLC transactions, and don't
 -              // actually care how many confirmations a commitment transaction may or may not have. Thus,
 -              // we look for either a FundingSpendConfirmation event or a funding_spend_confirmed.
 -              let confirmed_txid = us.funding_spend_confirmed.or_else(|| {
 -                      us.onchain_events_awaiting_threshold_conf.iter().find_map(|event| {
 -                              if let OnchainEvent::FundingSpendConfirmation { .. } = event.event {
 -                                      Some(event.txid)
 +              let txid = confirmed_txid.unwrap();
 +              if Some(txid) == us.current_counterparty_commitment_txid || Some(txid) == us.prev_counterparty_commitment_txid {
 +                      walk_htlcs!(false, us.counterparty_claimable_outpoints.get(&txid).unwrap().iter().filter_map(|(a, b)| {
 +                              if let &Some(ref source) = b {
 +                                      Some((a, &**source))
                                } else { None }
 -                      })
 -              });
 -              if let Some(txid) = confirmed_txid {
 -                      if Some(txid) == us.current_counterparty_commitment_txid || Some(txid) == us.prev_counterparty_commitment_txid {
 -                              walk_htlcs!(false, us.counterparty_claimable_outpoints.get(&txid).unwrap().iter().filter_map(|(a, b)| {
 -                                      if let &Some(ref source) = b {
 -                                              Some((a, &**source))
 -                                      } else { None }
 -                              }));
 -                      } else if txid == us.current_holder_commitment_tx.txid {
 -                              walk_htlcs!(true, us.current_holder_commitment_tx.htlc_outputs.iter().filter_map(|(a, _, c)| {
 +                      }));
 +              } else if txid == us.current_holder_commitment_tx.txid {
 +                      walk_htlcs!(true, us.current_holder_commitment_tx.htlc_outputs.iter().filter_map(|(a, _, c)| {
 +                              if let Some(source) = c { Some((a, source)) } else { None }
 +                      }));
 +              } else if let Some(prev_commitment) = &us.prev_holder_signed_commitment_tx {
 +                      if txid == prev_commitment.txid {
 +                              walk_htlcs!(true, prev_commitment.htlc_outputs.iter().filter_map(|(a, _, c)| {
                                        if let Some(source) = c { Some((a, source)) } else { None }
                                }));
 -                      } else if let Some(prev_commitment) = &us.prev_holder_signed_commitment_tx {
 -                              if txid == prev_commitment.txid {
 -                                      walk_htlcs!(true, prev_commitment.htlc_outputs.iter().filter_map(|(a, _, c)| {
 -                                              if let Some(source) = c { Some((a, source)) } else { None }
 -                                      }));
 -                              }
 -                      }
 -              } else {
 -                      // If we have not seen a commitment transaction on-chain (ie the channel is not yet
 -                      // closed), just examine the available counterparty commitment transactions. See docs
 -                      // on `fail_unbroadcast_htlcs`, below, for justification.
 -                      macro_rules! walk_counterparty_commitment {
 -                              ($txid: expr) => {
 -                                      if let Some(ref latest_outpoints) = us.counterparty_claimable_outpoints.get($txid) {
 -                                              for &(ref htlc, ref source_option) in latest_outpoints.iter() {
 -                                                      if let &Some(ref source) = source_option {
 -                                                              res.insert((**source).clone(), htlc.clone());
 -                                                      }
 -                                              }
 -                                      }
 -                              }
 -                      }
 -                      if let Some(ref txid) = us.current_counterparty_commitment_txid {
 -                              walk_counterparty_commitment!(txid);
 -                      }
 -                      if let Some(ref txid) = us.prev_counterparty_commitment_txid {
 -                              walk_counterparty_commitment!(txid);
                        }
                }
  
@@@ -2459,8 -2443,8 +2459,8 @@@ impl<Signer: Sign> ChannelMonitorImpl<S
                        let secret = self.get_secret(commitment_number).unwrap();
                        let per_commitment_key = ignore_error!(SecretKey::from_slice(&secret));
                        let per_commitment_point = PublicKey::from_secret_key(&self.secp_ctx, &per_commitment_key);
 -                      let revocation_pubkey = ignore_error!(chan_utils::derive_public_revocation_key(&self.secp_ctx, &per_commitment_point, &self.holder_revocation_basepoint));
 -                      let delayed_key = ignore_error!(chan_utils::derive_public_key(&self.secp_ctx, &PublicKey::from_secret_key(&self.secp_ctx, &per_commitment_key), &self.counterparty_commitment_params.counterparty_delayed_payment_base_key));
 +                      let revocation_pubkey = chan_utils::derive_public_revocation_key(&self.secp_ctx, &per_commitment_point, &self.holder_revocation_basepoint);
 +                      let delayed_key = chan_utils::derive_public_key(&self.secp_ctx, &PublicKey::from_secret_key(&self.secp_ctx, &per_commitment_key), &self.counterparty_commitment_params.counterparty_delayed_payment_base_key);
  
                        let revokeable_redeemscript = chan_utils::get_revokeable_redeemscript(&revocation_pubkey, self.counterparty_commitment_params.on_counterparty_tx_csv, &delayed_key);
                        let revokeable_p2wsh = revokeable_redeemscript.to_v0_p2wsh();
                        } else { return (claimable_outpoints, to_counterparty_output_info); };
  
                if let Some(transaction) = tx {
 -                      let revokeable_p2wsh_opt =
 -                              if let Ok(revocation_pubkey) = chan_utils::derive_public_revocation_key(
 -                                      &self.secp_ctx, &per_commitment_point, &self.holder_revocation_basepoint)
 -                              {
 -                                      if let Ok(delayed_key) = chan_utils::derive_public_key(&self.secp_ctx,
 -                                              &per_commitment_point,
 -                                              &self.counterparty_commitment_params.counterparty_delayed_payment_base_key)
 -                                      {
 -                                              Some(chan_utils::get_revokeable_redeemscript(&revocation_pubkey,
 -                                                      self.counterparty_commitment_params.on_counterparty_tx_csv,
 -                                                      &delayed_key).to_v0_p2wsh())
 -                                      } else {
 -                                              debug_assert!(false, "Failed to derive a delayed payment key for a commitment state we accepted");
 -                                              None
 -                                      }
 -                              } else {
 -                                      debug_assert!(false, "Failed to derive a revocation pubkey key for a commitment state we accepted");
 -                                      None
 -                              };
 -                      if let Some(revokeable_p2wsh) = revokeable_p2wsh_opt {
 -                              for (idx, outp) in transaction.output.iter().enumerate() {
 -                                      if outp.script_pubkey == revokeable_p2wsh {
 -                                              to_counterparty_output_info =
 -                                                      Some((idx.try_into().expect("Can't have > 2^32 outputs"), outp.value));
 -                                      }
 +                      let revocation_pubkey = chan_utils::derive_public_revocation_key(
 +                              &self.secp_ctx, &per_commitment_point, &self.holder_revocation_basepoint);
 +                      let delayed_key = chan_utils::derive_public_key(&self.secp_ctx,
 +                              &per_commitment_point,
 +                              &self.counterparty_commitment_params.counterparty_delayed_payment_base_key);
 +                      let revokeable_p2wsh = chan_utils::get_revokeable_redeemscript(&revocation_pubkey,
 +                              self.counterparty_commitment_params.on_counterparty_tx_csv,
 +                              &delayed_key).to_v0_p2wsh();
 +                      for (idx, outp) in transaction.output.iter().enumerate() {
 +                              if outp.script_pubkey == revokeable_p2wsh {
 +                                      to_counterparty_output_info =
 +                                              Some((idx.try_into().expect("Can't have > 2^32 outputs"), outp.value));
                                }
                        }
                }
@@@ -3792,7 -3789,9 +3792,9 @@@ impl<'a, K: KeysInterface> ReadableArgs
                                return Err(DecodeError::InvalidValue);
                        }
                }
-               let onchain_tx_handler: OnchainTxHandler<K::Signer> = ReadableArgs::read(reader, keys_manager)?;
+               let onchain_tx_handler: OnchainTxHandler<K::Signer> = ReadableArgs::read(
+                       reader, (keys_manager, channel_value_satoshis, channel_keys_id)
+               )?;
  
                let lockdown_from_offchain = Readable::read(reader)?;
                let holder_tx_signed = Readable::read(reader)?;
index db1c6e943716c4a6c0cc2060e48f6646a5ef175c,677b36ad682ed3f7513cc0c5b81c16d9b13e5af5..3ca66fcbc3a2ea5b584bd2bf20a26e6f697148e9
@@@ -31,7 -31,7 +31,7 @@@ use bitcoin::secp256k1::ecdh::SharedSec
  use bitcoin::secp256k1::ecdsa::RecoverableSignature;
  use bitcoin::{PackedLockTime, secp256k1, Sequence, Witness};
  
- use crate::util::{byte_utils, transaction_utils};
+ use crate::util::transaction_utils;
  use crate::util::crypto::{hkdf_extract_expand_twice, sign};
  use crate::util::ser::{Writeable, Writer, Readable, ReadableArgs};
  
@@@ -43,6 -43,7 +43,7 @@@ use crate::ln::msgs::UnsignedChannelAnn
  use crate::ln::script::ShutdownScript;
  
  use crate::prelude::*;
+ use core::convert::TryInto;
  use core::sync::atomic::{AtomicUsize, Ordering};
  use crate::io::{self, Error};
  use crate::ln::msgs::{DecodeError, MAX_VALUE_MSAT};
@@@ -161,7 -162,7 +162,7 @@@ pub enum SpendableOutputDescriptor 
        ///
        /// To derive the revocation_pubkey provided here (which is used in the witness
        /// script generation), you must pass the counterparty revocation_basepoint (which appears in the
-       /// call to Sign::ready_channel) and the provided per_commitment point
+       /// call to Sign::provide_channel_parameters) and the provided per_commitment point
        /// to chan_utils::derive_public_revocation_key.
        ///
        /// The witness script which is hashed and included in the output script_pubkey may be
@@@ -368,24 -369,22 +369,22 @@@ pub trait BaseSign 
                -> Result<(Signature, Signature), ()>;
  
        /// Set the counterparty static channel data, including basepoints,
-       /// counterparty_selected/holder_selected_contest_delay and funding outpoint.
-       /// This is done as soon as the funding outpoint is known.  Since these are static channel data,
-       /// they MUST NOT be allowed to change to different values once set.
+       /// counterparty_selected/holder_selected_contest_delay and funding outpoint. Since these are
+       /// static channel data, they MUST NOT be allowed to change to different values once set, as LDK
+       /// may call this method more than once.
        ///
        /// channel_parameters.is_populated() MUST be true.
-       ///
-       /// We bind holder_selected_contest_delay late here for API convenience.
-       ///
-       /// Will be called before any signatures are applied.
-       fn ready_channel(&mut self, channel_parameters: &ChannelTransactionParameters);
+       fn provide_channel_parameters(&mut self, channel_parameters: &ChannelTransactionParameters);
  }
  
- /// A cloneable signer.
+ /// A writeable signer.
+ ///
+ /// There will always be two instances of a signer per channel, one occupied by the
+ /// [`ChannelManager`] and another by the channel's [`ChannelMonitor`].
  ///
- /// Although we require signers to be cloneable, it may be useful for developers to be able to use
- /// signers in an un-sized way, for example as `dyn BaseSign`. Therefore we separate the Clone trait,
- /// which implies Sized, into this derived trait.
- pub trait Sign: BaseSign + Writeable + Clone {
+ /// [`ChannelManager`]: crate::ln::channelmanager::ChannelManager
+ /// [`ChannelMonitor`]: crate::chain::channelmonitor::ChannelMonitor
+ pub trait Sign: BaseSign + Writeable {
  }
  
  /// Specifies the recipient of an invoice, to indicate to [`KeysInterface::sign_invoice`] what node
@@@ -402,7 -401,7 +401,7 @@@ pub enum Recipient 
  
  /// A trait to describe an object which can get user secrets and key material.
  pub trait KeysInterface {
-       /// A type which implements Sign which will be returned by get_channel_signer.
+       /// A type which implements Sign which will be returned by derive_channel_signer.
        type Signer : Sign;
  
        /// Get node secret key based on the provided [`Recipient`].
        /// This method should return a different value each time it is called, to avoid linking
        /// on-chain funds across channels as controlled to the same user.
        fn get_shutdown_scriptpubkey(&self) -> ShutdownScript;
-       /// Get a new set of Sign for per-channel secrets. These MUST be unique even if you
-       /// restarted with some stale data!
+       /// Generates a unique `channel_keys_id` that can be used to obtain a `Signer` through
+       /// [`KeysInterface::derive_channel_signer`]. The `user_channel_id` is provided to allow
+       /// implementations of `KeysInterface` to maintain a mapping between it and the generated
+       /// `channel_keys_id`.
        ///
        /// This method must return a different value each time it is called.
-       fn get_channel_signer(&self, inbound: bool, channel_value_satoshis: u64) -> Self::Signer;
+       fn generate_channel_keys_id(&self, inbound: bool, channel_value_satoshis: u64, user_channel_id: u128) -> [u8; 32];
+       /// Derives the private key material backing a `Signer`.
+       ///
+       /// To derive a new `Signer`, a fresh `channel_keys_id` should be obtained through
+       /// [`KeysInterface::generate_channel_keys_id`]. Otherwise, an existing `Signer` can be
+       /// re-derived from its `channel_keys_id`, which can be obtained through its trait method
+       /// [`BaseSign::channel_keys_id`].
+       fn derive_channel_signer(&self, channel_value_satoshis: u64, channel_keys_id: [u8; 32]) -> Self::Signer;
        /// Gets a unique, cryptographically-secure, random 32 byte value. This is used for encrypting
        /// onion packets and for temporary channel IDs. There is no requirement that these be
        /// persisted anywhere, though they must be unique across restarts.
        /// The bytes are exactly those which `<Self::Signer as Writeable>::write()` writes, and
        /// contain no versioning scheme. You may wish to include your own version prefix and ensure
        /// you've read all of the provided bytes to ensure no corruption occurred.
+       ///
+       /// This method is slowly being phased out -- it will only be called when reading objects
+       /// written by LDK versions prior to 0.0.113.
        fn read_chan_signer(&self, reader: &[u8]) -> Result<Self::Signer, DecodeError>;
  
        /// Sign an invoice.
@@@ -571,39 -582,39 +582,39 @@@ impl InMemorySigner 
        }
  
        /// Counterparty pubkeys.
-       /// Will panic if ready_channel wasn't called.
+       /// Will panic if provide_channel_parameters wasn't called.
        pub fn counterparty_pubkeys(&self) -> &ChannelPublicKeys { &self.get_channel_parameters().counterparty_parameters.as_ref().unwrap().pubkeys }
  
        /// The contest_delay value specified by our counterparty and applied on holder-broadcastable
        /// transactions, ie the amount of time that we have to wait to recover our funds if we
        /// broadcast a transaction.
-       /// Will panic if ready_channel wasn't called.
+       /// Will panic if provide_channel_parameters wasn't called.
        pub fn counterparty_selected_contest_delay(&self) -> u16 { self.get_channel_parameters().counterparty_parameters.as_ref().unwrap().selected_contest_delay }
  
        /// The contest_delay value specified by us and applied on transactions broadcastable
        /// by our counterparty, ie the amount of time that they have to wait to recover their funds
        /// if they broadcast a transaction.
-       /// Will panic if ready_channel wasn't called.
+       /// Will panic if provide_channel_parameters wasn't called.
        pub fn holder_selected_contest_delay(&self) -> u16 { self.get_channel_parameters().holder_selected_contest_delay }
  
        /// Whether the holder is the initiator
-       /// Will panic if ready_channel wasn't called.
+       /// Will panic if provide_channel_parameters wasn't called.
        pub fn is_outbound(&self) -> bool { self.get_channel_parameters().is_outbound_from_holder }
  
        /// Funding outpoint
-       /// Will panic if ready_channel wasn't called.
+       /// Will panic if provide_channel_parameters wasn't called.
        pub fn funding_outpoint(&self) -> &OutPoint { self.get_channel_parameters().funding_outpoint.as_ref().unwrap() }
  
        /// Obtain a ChannelTransactionParameters for this channel, to be used when verifying or
        /// building transactions.
        ///
-       /// Will panic if ready_channel wasn't called.
+       /// Will panic if provide_channel_parameters wasn't called.
        pub fn get_channel_parameters(&self) -> &ChannelTransactionParameters {
                self.channel_parameters.as_ref().unwrap()
        }
  
        /// Whether anchors should be used.
-       /// Will panic if ready_channel wasn't called.
+       /// Will panic if provide_channel_parameters wasn't called.
        pub fn opt_anchors(&self) -> bool {
                self.get_channel_parameters().opt_anchors.is_some()
        }
                if spend_tx.input[input_idx].previous_output != descriptor.outpoint.into_bitcoin_outpoint() { return Err(()); }
                if spend_tx.input[input_idx].sequence.0 != descriptor.to_self_delay as u32 { return Err(()); }
  
 -              let delayed_payment_key = chan_utils::derive_private_key(&secp_ctx, &descriptor.per_commitment_point, &self.delayed_payment_base_key)
 -                      .expect("We constructed the payment_base_key, so we can only fail here if the RNG is busted.");
 +              let delayed_payment_key = chan_utils::derive_private_key(&secp_ctx, &descriptor.per_commitment_point, &self.delayed_payment_base_key);
                let delayed_payment_pubkey = PublicKey::from_secret_key(&secp_ctx, &delayed_payment_key);
                let witness_script = chan_utils::get_revokeable_redeemscript(&descriptor.revocation_pubkey, descriptor.to_self_delay, &delayed_payment_pubkey);
                let sighash = hash_to_message!(&sighash::SighashCache::new(spend_tx).segwit_signature_hash(input_idx, &witness_script, descriptor.output.value, EcdsaSighashType::All).unwrap()[..]);
@@@ -709,7 -721,7 +720,7 @@@ impl BaseSign for InMemorySigner 
                        let htlc_redeemscript = chan_utils::get_htlc_redeemscript(&htlc, self.opt_anchors(), &keys);
                        let htlc_sighashtype = if self.opt_anchors() { EcdsaSighashType::SinglePlusAnyoneCanPay } else { EcdsaSighashType::All };
                        let htlc_sighash = hash_to_message!(&sighash::SighashCache::new(&htlc_tx).segwit_signature_hash(0, &htlc_redeemscript, htlc.amount_msat / 1000, htlc_sighashtype).unwrap()[..]);
 -                      let holder_htlc_key = chan_utils::derive_private_key(&secp_ctx, &keys.per_commitment_point, &self.htlc_base_key).map_err(|_| ())?;
 +                      let holder_htlc_key = chan_utils::derive_private_key(&secp_ctx, &keys.per_commitment_point, &self.htlc_base_key);
                        htlc_sigs.push(sign(secp_ctx, &htlc_sighash, &holder_htlc_key));
                }
  
        }
  
        fn sign_justice_revoked_output(&self, justice_tx: &Transaction, input: usize, amount: u64, per_commitment_key: &SecretKey, secp_ctx: &Secp256k1<secp256k1::All>) -> Result<Signature, ()> {
 -              let revocation_key = chan_utils::derive_private_revocation_key(&secp_ctx, &per_commitment_key, &self.revocation_base_key).map_err(|_| ())?;
 +              let revocation_key = chan_utils::derive_private_revocation_key(&secp_ctx, &per_commitment_key, &self.revocation_base_key);
                let per_commitment_point = PublicKey::from_secret_key(secp_ctx, &per_commitment_key);
 -              let revocation_pubkey = chan_utils::derive_public_revocation_key(&secp_ctx, &per_commitment_point, &self.pubkeys().revocation_basepoint).map_err(|_| ())?;
 +              let revocation_pubkey = chan_utils::derive_public_revocation_key(&secp_ctx, &per_commitment_point, &self.pubkeys().revocation_basepoint);
                let witness_script = {
 -                      let counterparty_delayedpubkey = chan_utils::derive_public_key(&secp_ctx, &per_commitment_point, &self.counterparty_pubkeys().delayed_payment_basepoint).map_err(|_| ())?;
 +                      let counterparty_delayedpubkey = chan_utils::derive_public_key(&secp_ctx, &per_commitment_point, &self.counterparty_pubkeys().delayed_payment_basepoint);
                        chan_utils::get_revokeable_redeemscript(&revocation_pubkey, self.holder_selected_contest_delay(), &counterparty_delayedpubkey)
                };
                let mut sighash_parts = sighash::SighashCache::new(justice_tx);
        }
  
        fn sign_justice_revoked_htlc(&self, justice_tx: &Transaction, input: usize, amount: u64, per_commitment_key: &SecretKey, htlc: &HTLCOutputInCommitment, secp_ctx: &Secp256k1<secp256k1::All>) -> Result<Signature, ()> {
 -              let revocation_key = chan_utils::derive_private_revocation_key(&secp_ctx, &per_commitment_key, &self.revocation_base_key).map_err(|_| ())?;
 +              let revocation_key = chan_utils::derive_private_revocation_key(&secp_ctx, &per_commitment_key, &self.revocation_base_key);
                let per_commitment_point = PublicKey::from_secret_key(secp_ctx, &per_commitment_key);
 -              let revocation_pubkey = chan_utils::derive_public_revocation_key(&secp_ctx, &per_commitment_point, &self.pubkeys().revocation_basepoint).map_err(|_| ())?;
 +              let revocation_pubkey = chan_utils::derive_public_revocation_key(&secp_ctx, &per_commitment_point, &self.pubkeys().revocation_basepoint);
                let witness_script = {
 -                      let counterparty_htlcpubkey = chan_utils::derive_public_key(&secp_ctx, &per_commitment_point, &self.counterparty_pubkeys().htlc_basepoint).map_err(|_| ())?;
 -                      let holder_htlcpubkey = chan_utils::derive_public_key(&secp_ctx, &per_commitment_point, &self.pubkeys().htlc_basepoint).map_err(|_| ())?;
 +                      let counterparty_htlcpubkey = chan_utils::derive_public_key(&secp_ctx, &per_commitment_point, &self.counterparty_pubkeys().htlc_basepoint);
 +                      let holder_htlcpubkey = chan_utils::derive_public_key(&secp_ctx, &per_commitment_point, &self.pubkeys().htlc_basepoint);
                        chan_utils::get_htlc_redeemscript_with_explicit_keys(&htlc, self.opt_anchors(), &counterparty_htlcpubkey, &holder_htlcpubkey, &revocation_pubkey)
                };
                let mut sighash_parts = sighash::SighashCache::new(justice_tx);
        }
  
        fn sign_counterparty_htlc_transaction(&self, htlc_tx: &Transaction, input: usize, amount: u64, per_commitment_point: &PublicKey, htlc: &HTLCOutputInCommitment, secp_ctx: &Secp256k1<secp256k1::All>) -> Result<Signature, ()> {
 -              if let Ok(htlc_key) = chan_utils::derive_private_key(&secp_ctx, &per_commitment_point, &self.htlc_base_key) {
 -                      let witness_script = if let Ok(revocation_pubkey) = chan_utils::derive_public_revocation_key(&secp_ctx, &per_commitment_point, &self.pubkeys().revocation_basepoint) {
 -                              if let Ok(counterparty_htlcpubkey) = chan_utils::derive_public_key(&secp_ctx, &per_commitment_point, &self.counterparty_pubkeys().htlc_basepoint) {
 -                                      if let Ok(htlcpubkey) = chan_utils::derive_public_key(&secp_ctx, &per_commitment_point, &self.pubkeys().htlc_basepoint) {
 -                                              chan_utils::get_htlc_redeemscript_with_explicit_keys(&htlc, self.opt_anchors(), &counterparty_htlcpubkey, &htlcpubkey, &revocation_pubkey)
 -                                      } else { return Err(()) }
 -                              } else { return Err(()) }
 -                      } else { return Err(()) };
 -                      let mut sighash_parts = sighash::SighashCache::new(htlc_tx);
 -                      let sighash = hash_to_message!(&sighash_parts.segwit_signature_hash(input, &witness_script, amount, EcdsaSighashType::All).unwrap()[..]);
 -                      return Ok(sign(secp_ctx, &sighash, &htlc_key))
 -              }
 -              Err(())
 +              let htlc_key = chan_utils::derive_private_key(&secp_ctx, &per_commitment_point, &self.htlc_base_key);
 +              let revocation_pubkey = chan_utils::derive_public_revocation_key(&secp_ctx, &per_commitment_point, &self.pubkeys().revocation_basepoint);
 +              let counterparty_htlcpubkey = chan_utils::derive_public_key(&secp_ctx, &per_commitment_point, &self.counterparty_pubkeys().htlc_basepoint);
 +              let htlcpubkey = chan_utils::derive_public_key(&secp_ctx, &per_commitment_point, &self.pubkeys().htlc_basepoint);
 +              let witness_script = chan_utils::get_htlc_redeemscript_with_explicit_keys(&htlc, self.opt_anchors(), &counterparty_htlcpubkey, &htlcpubkey, &revocation_pubkey);
 +              let mut sighash_parts = sighash::SighashCache::new(htlc_tx);
 +              let sighash = hash_to_message!(&sighash_parts.segwit_signature_hash(input, &witness_script, amount, EcdsaSighashType::All).unwrap()[..]);
 +              Ok(sign(secp_ctx, &sighash, &htlc_key))
        }
  
        fn sign_closing_transaction(&self, closing_tx: &ClosingTransaction, secp_ctx: &Secp256k1<secp256k1::All>) -> Result<Signature, ()> {
                Ok((sign(secp_ctx, &msghash, &self.node_secret), sign(secp_ctx, &msghash, &self.funding_key)))
        }
  
-       fn ready_channel(&mut self, channel_parameters: &ChannelTransactionParameters) {
-               assert!(self.channel_parameters.is_none(), "Acceptance already noted");
+       fn provide_channel_parameters(&mut self, channel_parameters: &ChannelTransactionParameters) {
+               assert!(self.channel_parameters.is_none() || self.channel_parameters.as_ref().unwrap() == channel_parameters);
+               if self.channel_parameters.is_some() {
+                       // The channel parameters were already set and they match, return early.
+                       return;
+               }
                assert!(channel_parameters.is_populated(), "Channel parameters must be fully populated");
                self.channel_parameters = Some(channel_parameters.clone());
        }
@@@ -949,8 -970,8 +964,8 @@@ impl KeysManager 
                                inbound_pmt_key_bytes.copy_from_slice(&inbound_payment_key[..]);
  
                                let mut rand_bytes_unique_start = Sha256::engine();
-                               rand_bytes_unique_start.input(&byte_utils::be64_to_array(starting_time_secs));
-                               rand_bytes_unique_start.input(&byte_utils::be32_to_array(starting_time_nanos));
+                               rand_bytes_unique_start.input(&starting_time_secs.to_be_bytes());
+                               rand_bytes_unique_start.input(&starting_time_nanos.to_be_bytes());
                                rand_bytes_unique_start.input(seed);
  
                                let mut res = KeysManager {
                }
        }
        /// Derive an old Sign containing per-channel secrets based on a key derivation parameters.
-       ///
-       /// Key derivation parameters are accessible through a per-channel secrets
-       /// Sign::channel_keys_id and is provided inside DynamicOuputP2WSH in case of
-       /// onchain output detection for which a corresponding delayed_payment_key must be derived.
        pub fn derive_channel_keys(&self, channel_value_satoshis: u64, params: &[u8; 32]) -> InMemorySigner {
-               let chan_id = byte_utils::slice_to_be64(&params[0..8]);
-               assert!(chan_id <= core::u32::MAX as u64); // Otherwise the params field wasn't created by us
+               let chan_id = u64::from_be_bytes(params[0..8].try_into().unwrap());
                let mut unique_start = Sha256::engine();
                unique_start.input(params);
                unique_start.input(&self.seed);
@@@ -1203,14 -1219,19 +1213,19 @@@ impl KeysInterface for KeysManager 
                ShutdownScript::new_p2wpkh_from_pubkey(self.shutdown_pubkey.clone())
        }
  
-       fn get_channel_signer(&self, _inbound: bool, channel_value_satoshis: u64) -> Self::Signer {
-               let child_ix = self.channel_child_index.fetch_add(1, Ordering::AcqRel);
-               assert!(child_ix <= core::u32::MAX as usize);
+       fn generate_channel_keys_id(&self, _inbound: bool, _channel_value_satoshis: u64, user_channel_id: u128) -> [u8; 32] {
+               let child_idx = self.channel_child_index.fetch_add(1, Ordering::AcqRel);
+               assert!(child_idx <= core::u32::MAX as usize);
                let mut id = [0; 32];
-               id[0..8].copy_from_slice(&byte_utils::be64_to_array(child_ix as u64));
-               id[8..16].copy_from_slice(&byte_utils::be64_to_array(self.starting_time_nanos as u64));
-               id[16..24].copy_from_slice(&byte_utils::be64_to_array(self.starting_time_secs));
-               self.derive_channel_keys(channel_value_satoshis, &id)
+               id[0..4].copy_from_slice(&(child_idx as u32).to_be_bytes());
+               id[4..8].copy_from_slice(&self.starting_time_nanos.to_be_bytes());
+               id[8..16].copy_from_slice(&self.starting_time_secs.to_be_bytes());
+               id[16..32].copy_from_slice(&user_channel_id.to_be_bytes());
+               id
+       }
+       fn derive_channel_signer(&self, channel_value_satoshis: u64, channel_keys_id: [u8; 32]) -> Self::Signer {
+               self.derive_channel_keys(channel_value_satoshis, &channel_keys_id)
        }
  
        fn get_secure_random_bytes(&self) -> [u8; 32] {
@@@ -1303,8 -1324,12 +1318,12 @@@ impl KeysInterface for PhantomKeysManag
                self.inner.get_shutdown_scriptpubkey()
        }
  
-       fn get_channel_signer(&self, inbound: bool, channel_value_satoshis: u64) -> Self::Signer {
-               self.inner.get_channel_signer(inbound, channel_value_satoshis)
+       fn generate_channel_keys_id(&self, inbound: bool, channel_value_satoshis: u64, user_channel_id: u128) -> [u8; 32] {
+               self.inner.generate_channel_keys_id(inbound, channel_value_satoshis, user_channel_id)
+       }
+       fn derive_channel_signer(&self, channel_value_satoshis: u64, channel_keys_id: [u8; 32]) -> Self::Signer {
+               self.inner.derive_channel_signer(channel_value_satoshis, channel_keys_id)
        }
  
        fn get_secure_random_bytes(&self) -> [u8; 32] {
index cf92df2952148dd11f25838422010ead1281ae9d,7ccabb50b6c24c4e28753ff82a297357e3f2c32a..32f38323d81a7f6a4c1648d31b2025262a04501f
@@@ -27,7 -27,6 +27,6 @@@ use crate::ln::msgs::DecodeError
  use crate::chain::chaininterface::{FeeEstimator, ConfirmationTarget, MIN_RELAY_FEE_SAT_PER_1000_WEIGHT};
  use crate::chain::keysinterface::Sign;
  use crate::chain::onchaintx::OnchainTxHandler;
- use crate::util::byte_utils;
  use crate::util::logger::Logger;
  use crate::util::ser::{Readable, Writer, Writeable};
  
@@@ -381,53 -380,57 +380,53 @@@ impl PackageSolvingData 
        fn finalize_input<Signer: Sign>(&self, bumped_tx: &mut Transaction, i: usize, onchain_handler: &mut OnchainTxHandler<Signer>) -> bool {
                match self {
                        PackageSolvingData::RevokedOutput(ref outp) => {
 -                              if let Ok(chan_keys) = TxCreationKeys::derive_new(&onchain_handler.secp_ctx, &outp.per_commitment_point, &outp.counterparty_delayed_payment_base_key, &outp.counterparty_htlc_base_key, &onchain_handler.signer.pubkeys().revocation_basepoint, &onchain_handler.signer.pubkeys().htlc_basepoint) {
 -                                      let witness_script = chan_utils::get_revokeable_redeemscript(&chan_keys.revocation_key, outp.on_counterparty_tx_csv, &chan_keys.broadcaster_delayed_payment_key);
 -                                      //TODO: should we panic on signer failure ?
 -                                      if let Ok(sig) = onchain_handler.signer.sign_justice_revoked_output(&bumped_tx, i, outp.amount, &outp.per_commitment_key, &onchain_handler.secp_ctx) {
 -                                              let mut ser_sig = sig.serialize_der().to_vec();
 -                                              ser_sig.push(EcdsaSighashType::All as u8);
 -                                              bumped_tx.input[i].witness.push(ser_sig);
 -                                              bumped_tx.input[i].witness.push(vec!(1));
 -                                              bumped_tx.input[i].witness.push(witness_script.clone().into_bytes());
 -                                      } else { return false; }
 -                              }
 +                              let chan_keys = TxCreationKeys::derive_new(&onchain_handler.secp_ctx, &outp.per_commitment_point, &outp.counterparty_delayed_payment_base_key, &outp.counterparty_htlc_base_key, &onchain_handler.signer.pubkeys().revocation_basepoint, &onchain_handler.signer.pubkeys().htlc_basepoint);
 +                              let witness_script = chan_utils::get_revokeable_redeemscript(&chan_keys.revocation_key, outp.on_counterparty_tx_csv, &chan_keys.broadcaster_delayed_payment_key);
 +                              //TODO: should we panic on signer failure ?
 +                              if let Ok(sig) = onchain_handler.signer.sign_justice_revoked_output(&bumped_tx, i, outp.amount, &outp.per_commitment_key, &onchain_handler.secp_ctx) {
 +                                      let mut ser_sig = sig.serialize_der().to_vec();
 +                                      ser_sig.push(EcdsaSighashType::All as u8);
 +                                      bumped_tx.input[i].witness.push(ser_sig);
 +                                      bumped_tx.input[i].witness.push(vec!(1));
 +                                      bumped_tx.input[i].witness.push(witness_script.clone().into_bytes());
 +                              } else { return false; }
                        },
                        PackageSolvingData::RevokedHTLCOutput(ref outp) => {
 -                              if let Ok(chan_keys) = TxCreationKeys::derive_new(&onchain_handler.secp_ctx, &outp.per_commitment_point, &outp.counterparty_delayed_payment_base_key, &outp.counterparty_htlc_base_key, &onchain_handler.signer.pubkeys().revocation_basepoint, &onchain_handler.signer.pubkeys().htlc_basepoint) {
 -                                      let witness_script = chan_utils::get_htlc_redeemscript_with_explicit_keys(&outp.htlc, onchain_handler.opt_anchors(), &chan_keys.broadcaster_htlc_key, &chan_keys.countersignatory_htlc_key, &chan_keys.revocation_key);
 -                                      //TODO: should we panic on signer failure ?
 -                                      if let Ok(sig) = onchain_handler.signer.sign_justice_revoked_htlc(&bumped_tx, i, outp.amount, &outp.per_commitment_key, &outp.htlc, &onchain_handler.secp_ctx) {
 -                                              let mut ser_sig = sig.serialize_der().to_vec();
 -                                              ser_sig.push(EcdsaSighashType::All as u8);
 -                                              bumped_tx.input[i].witness.push(ser_sig);
 -                                              bumped_tx.input[i].witness.push(chan_keys.revocation_key.clone().serialize().to_vec());
 -                                              bumped_tx.input[i].witness.push(witness_script.clone().into_bytes());
 -                                      } else { return false; }
 -                              }
 +                              let chan_keys = TxCreationKeys::derive_new(&onchain_handler.secp_ctx, &outp.per_commitment_point, &outp.counterparty_delayed_payment_base_key, &outp.counterparty_htlc_base_key, &onchain_handler.signer.pubkeys().revocation_basepoint, &onchain_handler.signer.pubkeys().htlc_basepoint);
 +                              let witness_script = chan_utils::get_htlc_redeemscript_with_explicit_keys(&outp.htlc, onchain_handler.opt_anchors(), &chan_keys.broadcaster_htlc_key, &chan_keys.countersignatory_htlc_key, &chan_keys.revocation_key);
 +                              //TODO: should we panic on signer failure ?
 +                              if let Ok(sig) = onchain_handler.signer.sign_justice_revoked_htlc(&bumped_tx, i, outp.amount, &outp.per_commitment_key, &outp.htlc, &onchain_handler.secp_ctx) {
 +                                      let mut ser_sig = sig.serialize_der().to_vec();
 +                                      ser_sig.push(EcdsaSighashType::All as u8);
 +                                      bumped_tx.input[i].witness.push(ser_sig);
 +                                      bumped_tx.input[i].witness.push(chan_keys.revocation_key.clone().serialize().to_vec());
 +                                      bumped_tx.input[i].witness.push(witness_script.clone().into_bytes());
 +                              } else { return false; }
                        },
                        PackageSolvingData::CounterpartyOfferedHTLCOutput(ref outp) => {
 -                              if let Ok(chan_keys) = TxCreationKeys::derive_new(&onchain_handler.secp_ctx, &outp.per_commitment_point, &outp.counterparty_delayed_payment_base_key, &outp.counterparty_htlc_base_key, &onchain_handler.signer.pubkeys().revocation_basepoint, &onchain_handler.signer.pubkeys().htlc_basepoint) {
 -                                      let witness_script = chan_utils::get_htlc_redeemscript_with_explicit_keys(&outp.htlc, onchain_handler.opt_anchors(), &chan_keys.broadcaster_htlc_key, &chan_keys.countersignatory_htlc_key, &chan_keys.revocation_key);
 -
 -                                      if let Ok(sig) = onchain_handler.signer.sign_counterparty_htlc_transaction(&bumped_tx, i, &outp.htlc.amount_msat / 1000, &outp.per_commitment_point, &outp.htlc, &onchain_handler.secp_ctx) {
 -                                              let mut ser_sig = sig.serialize_der().to_vec();
 -                                              ser_sig.push(EcdsaSighashType::All as u8);
 -                                              bumped_tx.input[i].witness.push(ser_sig);
 -                                              bumped_tx.input[i].witness.push(outp.preimage.0.to_vec());
 -                                              bumped_tx.input[i].witness.push(witness_script.clone().into_bytes());
 -                                      }
 +                              let chan_keys = TxCreationKeys::derive_new(&onchain_handler.secp_ctx, &outp.per_commitment_point, &outp.counterparty_delayed_payment_base_key, &outp.counterparty_htlc_base_key, &onchain_handler.signer.pubkeys().revocation_basepoint, &onchain_handler.signer.pubkeys().htlc_basepoint);
 +                              let witness_script = chan_utils::get_htlc_redeemscript_with_explicit_keys(&outp.htlc, onchain_handler.opt_anchors(), &chan_keys.broadcaster_htlc_key, &chan_keys.countersignatory_htlc_key, &chan_keys.revocation_key);
 +
 +                              if let Ok(sig) = onchain_handler.signer.sign_counterparty_htlc_transaction(&bumped_tx, i, &outp.htlc.amount_msat / 1000, &outp.per_commitment_point, &outp.htlc, &onchain_handler.secp_ctx) {
 +                                      let mut ser_sig = sig.serialize_der().to_vec();
 +                                      ser_sig.push(EcdsaSighashType::All as u8);
 +                                      bumped_tx.input[i].witness.push(ser_sig);
 +                                      bumped_tx.input[i].witness.push(outp.preimage.0.to_vec());
 +                                      bumped_tx.input[i].witness.push(witness_script.clone().into_bytes());
                                }
                        },
                        PackageSolvingData::CounterpartyReceivedHTLCOutput(ref outp) => {
 -                              if let Ok(chan_keys) = TxCreationKeys::derive_new(&onchain_handler.secp_ctx, &outp.per_commitment_point, &outp.counterparty_delayed_payment_base_key, &outp.counterparty_htlc_base_key, &onchain_handler.signer.pubkeys().revocation_basepoint, &onchain_handler.signer.pubkeys().htlc_basepoint) {
 -                                      let witness_script = chan_utils::get_htlc_redeemscript_with_explicit_keys(&outp.htlc, onchain_handler.opt_anchors(), &chan_keys.broadcaster_htlc_key, &chan_keys.countersignatory_htlc_key, &chan_keys.revocation_key);
 -
 -                                      bumped_tx.lock_time = PackedLockTime(outp.htlc.cltv_expiry); // Right now we don't aggregate time-locked transaction, if we do we should set lock_time before to avoid breaking hash computation
 -                                      if let Ok(sig) = onchain_handler.signer.sign_counterparty_htlc_transaction(&bumped_tx, i, &outp.htlc.amount_msat / 1000, &outp.per_commitment_point, &outp.htlc, &onchain_handler.secp_ctx) {
 -                                              let mut ser_sig = sig.serialize_der().to_vec();
 -                                              ser_sig.push(EcdsaSighashType::All as u8);
 -                                              bumped_tx.input[i].witness.push(ser_sig);
 -                                              // Due to BIP146 (MINIMALIF) this must be a zero-length element to relay.
 -                                              bumped_tx.input[i].witness.push(vec![]);
 -                                              bumped_tx.input[i].witness.push(witness_script.clone().into_bytes());
 -                                      }
 +                              let chan_keys = TxCreationKeys::derive_new(&onchain_handler.secp_ctx, &outp.per_commitment_point, &outp.counterparty_delayed_payment_base_key, &outp.counterparty_htlc_base_key, &onchain_handler.signer.pubkeys().revocation_basepoint, &onchain_handler.signer.pubkeys().htlc_basepoint);
 +                              let witness_script = chan_utils::get_htlc_redeemscript_with_explicit_keys(&outp.htlc, onchain_handler.opt_anchors(), &chan_keys.broadcaster_htlc_key, &chan_keys.countersignatory_htlc_key, &chan_keys.revocation_key);
 +
 +                              bumped_tx.lock_time = PackedLockTime(outp.htlc.cltv_expiry); // Right now we don't aggregate time-locked transaction, if we do we should set lock_time before to avoid breaking hash computation
 +                              if let Ok(sig) = onchain_handler.signer.sign_counterparty_htlc_transaction(&bumped_tx, i, &outp.htlc.amount_msat / 1000, &outp.per_commitment_point, &outp.htlc, &onchain_handler.secp_ctx) {
 +                                      let mut ser_sig = sig.serialize_der().to_vec();
 +                                      ser_sig.push(EcdsaSighashType::All as u8);
 +                                      bumped_tx.input[i].witness.push(ser_sig);
 +                                      // Due to BIP146 (MINIMALIF) this must be a zero-length element to relay.
 +                                      bumped_tx.input[i].witness.push(vec![]);
 +                                      bumped_tx.input[i].witness.push(witness_script.clone().into_bytes());
                                }
                        },
                        _ => { panic!("API Error!"); }
@@@ -770,7 -773,7 +769,7 @@@ impl PackageTemplate 
  
  impl Writeable for PackageTemplate {
        fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
-               writer.write_all(&byte_utils::be64_to_array(self.inputs.len() as u64))?;
+               writer.write_all(&(self.inputs.len() as u64).to_be_bytes())?;
                for (ref outpoint, ref rev_outp) in self.inputs.iter() {
                        outpoint.write(writer)?;
                        rev_outp.write(writer)?;
index 39106f0c775fee350116d8830fcab915b55d2ee6,77aec9f23dab330ea77eca55dcab3b43ae12a687..5871d1706bd4f9b8b01df7aedc8af966149b1716
@@@ -24,10 -24,11 +24,10 @@@ use bitcoin::hash_types::{Txid, PubkeyH
  use crate::ln::{PaymentHash, PaymentPreimage};
  use crate::ln::msgs::DecodeError;
  use crate::util::ser::{Readable, Writeable, Writer};
- use crate::util::{byte_utils, transaction_utils};
+ use crate::util::transaction_utils;
  
  use bitcoin::secp256k1::{SecretKey, PublicKey, Scalar};
  use bitcoin::secp256k1::{Secp256k1, ecdsa::Signature, Message};
 -use bitcoin::secp256k1::Error as SecpError;
  use bitcoin::{PackedLockTime, secp256k1, Sequence, Witness};
  use bitcoin::PublicKey as BitcoinPublicKey;
  
@@@ -309,7 -310,7 +309,7 @@@ impl Writeable for CounterpartyCommitme
        fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
                for &(ref secret, ref idx) in self.old_secrets.iter() {
                        writer.write_all(secret)?;
-                       writer.write_all(&byte_utils::be64_to_array(*idx))?;
+                       writer.write_all(&idx.to_be_bytes())?;
                }
                write_tlv_fields!(writer, {});
                Ok(())
@@@ -329,29 -330,32 +329,29 @@@ impl Readable for CounterpartyCommitmen
  
  /// Derives a per-commitment-transaction private key (eg an htlc key or delayed_payment key)
  /// from the base secret and the per_commitment_point.
 -///
 -/// Note that this is infallible iff we trust that at least one of the two input keys are randomly
 -/// generated (ie our own).
 -pub fn derive_private_key<T: secp256k1::Signing>(secp_ctx: &Secp256k1<T>, per_commitment_point: &PublicKey, base_secret: &SecretKey) -> Result<SecretKey, SecpError> {
 +pub fn derive_private_key<T: secp256k1::Signing>(secp_ctx: &Secp256k1<T>, per_commitment_point: &PublicKey, base_secret: &SecretKey) -> SecretKey {
        let mut sha = Sha256::engine();
        sha.input(&per_commitment_point.serialize());
        sha.input(&PublicKey::from_secret_key(&secp_ctx, &base_secret).serialize());
        let res = Sha256::from_engine(sha).into_inner();
  
        base_secret.clone().add_tweak(&Scalar::from_be_bytes(res).unwrap())
 +              .expect("Addition only fails if the tweak is the inverse of the key. This is not possible when the tweak contains the hash of the key.")
  }
  
  /// Derives a per-commitment-transaction public key (eg an htlc key or a delayed_payment key)
  /// from the base point and the per_commitment_key. This is the public equivalent of
  /// derive_private_key - using only public keys to derive a public key instead of private keys.
 -///
 -/// Note that this is infallible iff we trust that at least one of the two input keys are randomly
 -/// generated (ie our own).
 -pub fn derive_public_key<T: secp256k1::Signing>(secp_ctx: &Secp256k1<T>, per_commitment_point: &PublicKey, base_point: &PublicKey) -> Result<PublicKey, SecpError> {
 +pub fn derive_public_key<T: secp256k1::Signing>(secp_ctx: &Secp256k1<T>, per_commitment_point: &PublicKey, base_point: &PublicKey) -> PublicKey {
        let mut sha = Sha256::engine();
        sha.input(&per_commitment_point.serialize());
        sha.input(&base_point.serialize());
        let res = Sha256::from_engine(sha).into_inner();
  
 -      let hashkey = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&res)?);
 +      let hashkey = PublicKey::from_secret_key(&secp_ctx,
 +              &SecretKey::from_slice(&res).expect("Hashes should always be valid keys unless SHA-256 is broken"));
        base_point.combine(&hashkey)
 +              .expect("Addition only fails if the tweak is the inverse of the key. This is not possible when the tweak contains the hash of the key.")
  }
  
  /// Derives a per-commitment-transaction revocation key from its constituent parts.
  /// commitment transaction, thus per_commitment_secret always come from cheater
  /// and revocation_base_secret always come from punisher, which is the broadcaster
  /// of the transaction spending with this key knowledge.
 -///
 -/// Note that this is infallible iff we trust that at least one of the two input keys are randomly
 -/// generated (ie our own).
 -pub fn derive_private_revocation_key<T: secp256k1::Signing>(secp_ctx: &Secp256k1<T>, per_commitment_secret: &SecretKey, countersignatory_revocation_base_secret: &SecretKey) -> Result<SecretKey, SecpError> {
 +pub fn derive_private_revocation_key<T: secp256k1::Signing>(secp_ctx: &Secp256k1<T>,
 +      per_commitment_secret: &SecretKey, countersignatory_revocation_base_secret: &SecretKey)
 +-> SecretKey {
        let countersignatory_revocation_base_point = PublicKey::from_secret_key(&secp_ctx, &countersignatory_revocation_base_secret);
        let per_commitment_point = PublicKey::from_secret_key(&secp_ctx, &per_commitment_secret);
  
                Sha256::from_engine(sha).into_inner()
        };
  
 -      let countersignatory_contrib = countersignatory_revocation_base_secret.clone().mul_tweak(&Scalar::from_be_bytes(rev_append_commit_hash_key).unwrap())?;
 -      let broadcaster_contrib = per_commitment_secret.clone().mul_tweak(&Scalar::from_be_bytes(commit_append_rev_hash_key).unwrap())?;
 +      let countersignatory_contrib = countersignatory_revocation_base_secret.clone().mul_tweak(&Scalar::from_be_bytes(rev_append_commit_hash_key).unwrap())
 +              .expect("Multiplying a secret key by a hash is expected to never fail per secp256k1 docs");
 +      let broadcaster_contrib = per_commitment_secret.clone().mul_tweak(&Scalar::from_be_bytes(commit_append_rev_hash_key).unwrap())
 +              .expect("Multiplying a secret key by a hash is expected to never fail per secp256k1 docs");
        countersignatory_contrib.add_tweak(&Scalar::from_be_bytes(broadcaster_contrib.secret_bytes()).unwrap())
 +              .expect("Addition only fails if the tweak is the inverse of the key. This is not possible when the tweak commits to the key.")
  }
  
  /// Derives a per-commitment-transaction revocation public key from its constituent parts. This is
  ///
  /// Note that this is infallible iff we trust that at least one of the two input keys are randomly
  /// generated (ie our own).
 -pub fn derive_public_revocation_key<T: secp256k1::Verification>(secp_ctx: &Secp256k1<T>, per_commitment_point: &PublicKey, countersignatory_revocation_base_point: &PublicKey) -> Result<PublicKey, SecpError> {
 +pub fn derive_public_revocation_key<T: secp256k1::Verification>(secp_ctx: &Secp256k1<T>,
 +      per_commitment_point: &PublicKey, countersignatory_revocation_base_point: &PublicKey)
 +-> PublicKey {
        let rev_append_commit_hash_key = {
                let mut sha = Sha256::engine();
                sha.input(&countersignatory_revocation_base_point.serialize());
                Sha256::from_engine(sha).into_inner()
        };
  
 -      let countersignatory_contrib = countersignatory_revocation_base_point.clone().mul_tweak(&secp_ctx, &Scalar::from_be_bytes(rev_append_commit_hash_key).unwrap())?;
 -      let broadcaster_contrib = per_commitment_point.clone().mul_tweak(&secp_ctx, &Scalar::from_be_bytes(commit_append_rev_hash_key).unwrap())?;
 +      let countersignatory_contrib = countersignatory_revocation_base_point.clone().mul_tweak(&secp_ctx, &Scalar::from_be_bytes(rev_append_commit_hash_key).unwrap())
 +              .expect("Multiplying a valid public key by a hash is expected to never fail per secp256k1 docs");
 +      let broadcaster_contrib = per_commitment_point.clone().mul_tweak(&secp_ctx, &Scalar::from_be_bytes(commit_append_rev_hash_key).unwrap())
 +              .expect("Multiplying a valid public key by a hash is expected to never fail per secp256k1 docs");
        countersignatory_contrib.combine(&broadcaster_contrib)
 +              .expect("Addition only fails if the tweak is the inverse of the key. This is not possible when the tweak commits to the key.")
  }
  
  /// The set of public keys which are used in the creation of one commitment transaction.
@@@ -496,19 -493,19 +496,19 @@@ impl_writeable_tlv_based!(ChannelPublic
  impl TxCreationKeys {
        /// Create per-state keys from channel base points and the per-commitment point.
        /// Key set is asymmetric and can't be used as part of counter-signatory set of transactions.
 -      pub fn derive_new<T: secp256k1::Signing + secp256k1::Verification>(secp_ctx: &Secp256k1<T>, per_commitment_point: &PublicKey, broadcaster_delayed_payment_base: &PublicKey, broadcaster_htlc_base: &PublicKey, countersignatory_revocation_base: &PublicKey, countersignatory_htlc_base: &PublicKey) -> Result<TxCreationKeys, SecpError> {
 -              Ok(TxCreationKeys {
 +      pub fn derive_new<T: secp256k1::Signing + secp256k1::Verification>(secp_ctx: &Secp256k1<T>, per_commitment_point: &PublicKey, broadcaster_delayed_payment_base: &PublicKey, broadcaster_htlc_base: &PublicKey, countersignatory_revocation_base: &PublicKey, countersignatory_htlc_base: &PublicKey) -> TxCreationKeys {
 +              TxCreationKeys {
                        per_commitment_point: per_commitment_point.clone(),
 -                      revocation_key: derive_public_revocation_key(&secp_ctx, &per_commitment_point, &countersignatory_revocation_base)?,
 -                      broadcaster_htlc_key: derive_public_key(&secp_ctx, &per_commitment_point, &broadcaster_htlc_base)?,
 -                      countersignatory_htlc_key: derive_public_key(&secp_ctx, &per_commitment_point, &countersignatory_htlc_base)?,
 -                      broadcaster_delayed_payment_key: derive_public_key(&secp_ctx, &per_commitment_point, &broadcaster_delayed_payment_base)?,
 -              })
 +                      revocation_key: derive_public_revocation_key(&secp_ctx, &per_commitment_point, &countersignatory_revocation_base),
 +                      broadcaster_htlc_key: derive_public_key(&secp_ctx, &per_commitment_point, &broadcaster_htlc_base),
 +                      countersignatory_htlc_key: derive_public_key(&secp_ctx, &per_commitment_point, &countersignatory_htlc_base),
 +                      broadcaster_delayed_payment_key: derive_public_key(&secp_ctx, &per_commitment_point, &broadcaster_delayed_payment_base),
 +              }
        }
  
        /// Generate per-state keys from channel static keys.
        /// Key set is asymmetric and can't be used as part of counter-signatory set of transactions.
 -      pub fn from_channel_static_keys<T: secp256k1::Signing + secp256k1::Verification>(per_commitment_point: &PublicKey, broadcaster_keys: &ChannelPublicKeys, countersignatory_keys: &ChannelPublicKeys, secp_ctx: &Secp256k1<T>) -> Result<TxCreationKeys, SecpError> {
 +      pub fn from_channel_static_keys<T: secp256k1::Signing + secp256k1::Verification>(per_commitment_point: &PublicKey, broadcaster_keys: &ChannelPublicKeys, countersignatory_keys: &ChannelPublicKeys, secp_ctx: &Secp256k1<T>) -> TxCreationKeys {
                TxCreationKeys::derive_new(
                        &secp_ctx,
                        &per_commitment_point,
@@@ -766,7 -763,7 +766,7 @@@ pub fn build_anchor_input_witness(fundi
  ///
  /// Normally, this is converted to the broadcaster/countersignatory-organized DirectedChannelTransactionParameters
  /// before use, via the as_holder_broadcastable and as_counterparty_broadcastable functions.
- #[derive(Clone)]
+ #[derive(Clone, PartialEq)]
  pub struct ChannelTransactionParameters {
        /// Holder public keys
        pub holder_pubkeys: ChannelPublicKeys,
  }
  
  /// Late-bound per-channel counterparty data used to build transactions.
- #[derive(Clone)]
+ #[derive(Clone, PartialEq)]
  pub struct CounterpartyChannelTransactionParameters {
        /// Counter-party public keys
        pub pubkeys: ChannelPublicKeys,
@@@ -1463,7 -1460,7 +1463,7 @@@ impl CommitmentTransaction 
        pub fn verify<T: secp256k1::Signing + secp256k1::Verification>(&self, channel_parameters: &DirectedChannelTransactionParameters, broadcaster_keys: &ChannelPublicKeys, countersignatory_keys: &ChannelPublicKeys, secp_ctx: &Secp256k1<T>) -> Result<TrustedCommitmentTransaction, ()> {
                // This is the only field of the key cache that we trust
                let per_commitment_point = self.keys.per_commitment_point;
 -              let keys = TxCreationKeys::from_channel_static_keys(&per_commitment_point, broadcaster_keys, countersignatory_keys, secp_ctx).unwrap();
 +              let keys = TxCreationKeys::from_channel_static_keys(&per_commitment_point, broadcaster_keys, countersignatory_keys, secp_ctx);
                if keys != self.keys {
                        return Err(());
                }
@@@ -1523,7 -1520,7 +1523,7 @@@ impl<'a> TrustedCommitmentTransaction<'
                let keys = &inner.keys;
                let txid = inner.built.txid;
                let mut ret = Vec::with_capacity(inner.htlcs.len());
 -              let holder_htlc_key = derive_private_key(secp_ctx, &inner.keys.per_commitment_point, htlc_base_key).map_err(|_| ())?;
 +              let holder_htlc_key = derive_private_key(secp_ctx, &inner.keys.per_commitment_point, htlc_base_key);
  
                for this_htlc in inner.htlcs.iter() {
                        assert!(this_htlc.transaction_output_index.is_some());
@@@ -1630,15 -1627,15 +1630,15 @@@ mod tests 
                let seed = [42; 32];
                let network = Network::Testnet;
                let keys_provider = test_utils::TestKeysInterface::new(&seed, network);
-               let signer = keys_provider.get_channel_signer(false, 3000);
-               let counterparty_signer = keys_provider.get_channel_signer(false, 3000);
+               let signer = keys_provider.derive_channel_signer(3000, keys_provider.generate_channel_keys_id(false, 1_000_000, 0));
+               let counterparty_signer = keys_provider.derive_channel_signer(3000, keys_provider.generate_channel_keys_id(true, 1_000_000, 1));
                let delayed_payment_base = &signer.pubkeys().delayed_payment_basepoint;
                let per_commitment_secret = SecretKey::from_slice(&hex::decode("1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100").unwrap()[..]).unwrap();
                let per_commitment_point = PublicKey::from_secret_key(&secp_ctx, &per_commitment_secret);
                let htlc_basepoint = &signer.pubkeys().htlc_basepoint;
                let holder_pubkeys = signer.pubkeys();
                let counterparty_pubkeys = counterparty_signer.pubkeys();
 -              let keys = TxCreationKeys::derive_new(&secp_ctx, &per_commitment_point, delayed_payment_base, htlc_basepoint, &counterparty_pubkeys.revocation_basepoint, &counterparty_pubkeys.htlc_basepoint).unwrap();
 +              let keys = TxCreationKeys::derive_new(&secp_ctx, &per_commitment_point, delayed_payment_base, htlc_basepoint, &counterparty_pubkeys.revocation_basepoint, &counterparty_pubkeys.htlc_basepoint);
                let mut channel_parameters = ChannelTransactionParameters {
                        holder_pubkeys: holder_pubkeys.clone(),
                        holder_selected_contest_delay: 0,
                assert_eq!(tx.built.transaction.output[0].script_pubkey, get_htlc_redeemscript(&received_htlc, false, &keys).to_v0_p2wsh());
                assert_eq!(tx.built.transaction.output[1].script_pubkey, get_htlc_redeemscript(&offered_htlc, false, &keys).to_v0_p2wsh());
                assert_eq!(get_htlc_redeemscript(&received_htlc, false, &keys).to_v0_p2wsh().to_hex(),
-                                  "002085cf52e41ba7c099a39df504e7b61f6de122971ceb53b06731876eaeb85e8dc5");
+                                  "0020e43a7c068553003fe68fcae424fb7b28ec5ce48cd8b6744b3945631389bad2fb");
                assert_eq!(get_htlc_redeemscript(&offered_htlc, false, &keys).to_v0_p2wsh().to_hex(),
-                                  "002049f0736bb335c61a04d2623a24df878a7592a3c51fa7258d41b2c85318265e73");
+                                  "0020215d61bba56b19e9eadb6107f5a85d7f99c40f65992443f69229c290165bc00d");
  
                // Generate broadcaster output and received and offered HTLC outputs,  with anchors
                channel_parameters.opt_anchors = Some(());
                assert_eq!(tx.built.transaction.output[2].script_pubkey, get_htlc_redeemscript(&received_htlc, true, &keys).to_v0_p2wsh());
                assert_eq!(tx.built.transaction.output[3].script_pubkey, get_htlc_redeemscript(&offered_htlc, true, &keys).to_v0_p2wsh());
                assert_eq!(get_htlc_redeemscript(&received_htlc, true, &keys).to_v0_p2wsh().to_hex(),
-                                  "002067114123af3f95405bae4fd930fc95de03e3c86baaee8b2dd29b43dd26cf613c");
+                                  "0020b70d0649c72b38756885c7a30908d912a7898dd5d79457a7280b8e9a20f3f2bc");
                assert_eq!(get_htlc_redeemscript(&offered_htlc, true, &keys).to_v0_p2wsh().to_hex(),
-                                  "0020a06e3b0d4fcf704f2b9c41e16a70099e39989466c3142b8573a1154542f28f57");
+                                  "002087a3faeb1950a469c0e2db4a79b093a41b9526e5a6fc6ef5cb949bde3be379c7");
        }
  
        #[test]
index d0b967b9e90fa5c4c67394f2150b096be0921237,8cf08fd65c5c24e9f541531e5d9d79dd14812c37..2721cc81e509b5c93f5d99095b8fb90b51b6c6cf
@@@ -112,7 -112,7 +112,7 @@@ fn test_monitor_and_persister_update_fa
                let mut w = test_utils::TestVecWriter(Vec::new());
                monitor.write(&mut w).unwrap();
                let new_monitor = <(BlockHash, ChannelMonitor<EnforcingSigner>)>::read(
-                       &mut io::Cursor::new(&w.0), &test_utils::OnlyReadsKeysInterface {}).unwrap().1;
+                       &mut io::Cursor::new(&w.0), nodes[0].keys_manager).unwrap().1;
                assert!(new_monitor == *monitor);
                let chain_mon = test_utils::TestChainMonitor::new(Some(&chain_source), &tx_broadcaster, &logger, &chanmon_cfgs[0].fee_estimator, &persister, &node_cfgs[0].keys_manager);
                assert_eq!(chain_mon.watch_channel(outpoint, new_monitor), ChannelMonitorUpdateStatus::Completed);
@@@ -200,7 -200,7 +200,7 @@@ fn do_test_simple_monitor_temporary_upd
        let events_3 = nodes[1].node.get_and_clear_pending_events();
        assert_eq!(events_3.len(), 1);
        match events_3[0] {
 -              Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id: _ } => {
 +              Event::PaymentClaimable { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id: _ } => {
                        assert_eq!(payment_hash_1, *payment_hash);
                        assert_eq!(amount_msat, 1_000_000);
                        assert_eq!(receiver_node_id.unwrap(), nodes[1].node.get_our_node_id());
@@@ -569,7 -569,7 +569,7 @@@ fn do_test_monitor_temporary_update_fai
        let events_5 = nodes[1].node.get_and_clear_pending_events();
        assert_eq!(events_5.len(), 1);
        match events_5[0] {
 -              Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id: _ } => {
 +              Event::PaymentClaimable { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id: _ } => {
                        assert_eq!(payment_hash_2, *payment_hash);
                        assert_eq!(amount_msat, 1_000_000);
                        assert_eq!(receiver_node_id.unwrap(), nodes[1].node.get_our_node_id());
@@@ -686,7 -686,7 +686,7 @@@ fn test_monitor_update_fail_cs() 
        let events = nodes[1].node.get_and_clear_pending_events();
        assert_eq!(events.len(), 1);
        match events[0] {
 -              Event::PaymentReceived { payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id: _ } => {
 +              Event::PaymentClaimable { payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id: _ } => {
                        assert_eq!(payment_hash, our_payment_hash);
                        assert_eq!(amount_msat, 1_000_000);
                        assert_eq!(receiver_node_id.unwrap(), nodes[1].node.get_our_node_id());
@@@ -743,7 -743,7 +743,7 @@@ fn test_monitor_update_fail_no_rebroadc
        let events = nodes[1].node.get_and_clear_pending_events();
        assert_eq!(events.len(), 1);
        match events[0] {
 -              Event::PaymentReceived { payment_hash, .. } => {
 +              Event::PaymentClaimable { payment_hash, .. } => {
                        assert_eq!(payment_hash, our_payment_hash);
                },
                _ => panic!("Unexpected event"),
@@@ -814,12 -814,12 +814,12 @@@ fn test_monitor_update_raa_while_paused
        nodes[0].node.handle_revoke_and_ack(&nodes[1].node.get_our_node_id(), &bs_second_raa);
        check_added_monitors!(nodes[0], 1);
        expect_pending_htlcs_forwardable!(nodes[0]);
 -      expect_payment_received!(nodes[0], our_payment_hash_2, our_payment_secret_2, 1000000);
 +      expect_payment_claimable!(nodes[0], our_payment_hash_2, our_payment_secret_2, 1000000);
  
        nodes[1].node.handle_revoke_and_ack(&nodes[0].node.get_our_node_id(), &as_second_raa);
        check_added_monitors!(nodes[1], 1);
        expect_pending_htlcs_forwardable!(nodes[1]);
 -      expect_payment_received!(nodes[1], our_payment_hash_1, our_payment_secret_1, 1000000);
 +      expect_payment_claimable!(nodes[1], our_payment_hash_1, our_payment_secret_1, 1000000);
  
        claim_payment(&nodes[0], &[&nodes[1]], payment_preimage_1);
        claim_payment(&nodes[1], &[&nodes[0]], payment_preimage_2);
@@@ -1049,11 -1049,11 +1049,11 @@@ fn do_test_monitor_update_fail_raa(test
        let events_6 = nodes[2].node.get_and_clear_pending_events();
        assert_eq!(events_6.len(), 2);
        match events_6[0] {
 -              Event::PaymentReceived { payment_hash, .. } => { assert_eq!(payment_hash, payment_hash_2); },
 +              Event::PaymentClaimable { payment_hash, .. } => { assert_eq!(payment_hash, payment_hash_2); },
                _ => panic!("Unexpected event"),
        };
        match events_6[1] {
 -              Event::PaymentReceived { payment_hash, .. } => { assert_eq!(payment_hash, payment_hash_3); },
 +              Event::PaymentClaimable { payment_hash, .. } => { assert_eq!(payment_hash, payment_hash_3); },
                _ => panic!("Unexpected event"),
        };
  
                let events_9 = nodes[0].node.get_and_clear_pending_events();
                assert_eq!(events_9.len(), 1);
                match events_9[0] {
 -                      Event::PaymentReceived { payment_hash, .. } => assert_eq!(payment_hash, payment_hash_4.unwrap()),
 +                      Event::PaymentClaimable { payment_hash, .. } => assert_eq!(payment_hash, payment_hash_4.unwrap()),
                        _ => panic!("Unexpected event"),
                };
                claim_payment(&nodes[2], &[&nodes[1], &nodes[0]], payment_preimage_4.unwrap());
@@@ -1240,7 -1240,7 +1240,7 @@@ fn raa_no_response_awaiting_raa_state(
        check_added_monitors!(nodes[1], 0);
        let bs_responses = get_revoke_commit_msgs!(nodes[1], nodes[0].node.get_our_node_id());
        expect_pending_htlcs_forwardable!(nodes[1]);
 -      expect_payment_received!(nodes[1], payment_hash_1, payment_secret_1, 1000000);
 +      expect_payment_claimable!(nodes[1], payment_hash_1, payment_secret_1, 1000000);
  
        // We send a third payment here, which is somewhat of a redundant test, but the
        // chanmon_fail_consistency test required it to actually find the bug (by seeing out-of-sync
        nodes[1].node.handle_revoke_and_ack(&nodes[0].node.get_our_node_id(), &as_raa);
        check_added_monitors!(nodes[1], 1);
        expect_pending_htlcs_forwardable!(nodes[1]);
 -      expect_payment_received!(nodes[1], payment_hash_2, payment_secret_2, 1000000);
 +      expect_payment_claimable!(nodes[1], payment_hash_2, payment_secret_2, 1000000);
        let bs_update = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
  
        nodes[0].node.handle_revoke_and_ack(&nodes[1].node.get_our_node_id(), &bs_raa);
        nodes[1].node.handle_revoke_and_ack(&nodes[0].node.get_our_node_id(), &as_raa);
        check_added_monitors!(nodes[1], 1);
        expect_pending_htlcs_forwardable!(nodes[1]);
 -      expect_payment_received!(nodes[1], payment_hash_3, payment_secret_3, 1000000);
 +      expect_payment_claimable!(nodes[1], payment_hash_3, payment_secret_3, 1000000);
  
        claim_payment(&nodes[0], &[&nodes[1]], payment_preimage_1);
        claim_payment(&nodes[0], &[&nodes[1]], payment_preimage_2);
@@@ -1394,7 -1394,7 +1394,7 @@@ fn claim_while_disconnected_monitor_upd
        check_added_monitors!(nodes[1], 1);
  
        expect_pending_htlcs_forwardable!(nodes[1]);
 -      expect_payment_received!(nodes[1], payment_hash_2, payment_secret_2, 1000000);
 +      expect_payment_claimable!(nodes[1], payment_hash_2, payment_secret_2, 1000000);
  
        nodes[0].node.handle_revoke_and_ack(&nodes[1].node.get_our_node_id(), &bs_raa);
        check_added_monitors!(nodes[0], 1);
@@@ -1469,7 -1469,7 +1469,7 @@@ fn monitor_failed_no_reestablish_respon
        check_added_monitors!(nodes[1], 1);
  
        expect_pending_htlcs_forwardable!(nodes[1]);
 -      expect_payment_received!(nodes[1], payment_hash_1, payment_secret_1, 1000000);
 +      expect_payment_claimable!(nodes[1], payment_hash_1, payment_secret_1, 1000000);
  
        claim_payment(&nodes[0], &[&nodes[1]], payment_preimage_1);
  }
@@@ -1550,7 -1550,7 +1550,7 @@@ fn first_message_on_recv_ordering() 
        check_added_monitors!(nodes[1], 0);
  
        expect_pending_htlcs_forwardable!(nodes[1]);
 -      expect_payment_received!(nodes[1], payment_hash_1, payment_secret_1, 1000000);
 +      expect_payment_claimable!(nodes[1], payment_hash_1, payment_secret_1, 1000000);
  
        let bs_responses = get_revoke_commit_msgs!(nodes[1], nodes[0].node.get_our_node_id());
        nodes[0].node.handle_revoke_and_ack(&nodes[1].node.get_our_node_id(), &bs_responses.0);
        check_added_monitors!(nodes[1], 1);
  
        expect_pending_htlcs_forwardable!(nodes[1]);
 -      expect_payment_received!(nodes[1], payment_hash_2, payment_secret_2, 1000000);
 +      expect_payment_claimable!(nodes[1], payment_hash_2, payment_secret_2, 1000000);
  
        claim_payment(&nodes[0], &[&nodes[1]], payment_preimage_1);
        claim_payment(&nodes[0], &[&nodes[1]], payment_preimage_2);
@@@ -1652,7 -1652,7 +1652,7 @@@ fn test_monitor_update_fail_claim() 
        let events = nodes[0].node.get_and_clear_pending_events();
        assert_eq!(events.len(), 2);
        match events[0] {
 -              Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id } => {
 +              Event::PaymentClaimable { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id } => {
                        assert_eq!(payment_hash_2, *payment_hash);
                        assert_eq!(1_000_000, amount_msat);
                        assert_eq!(receiver_node_id.unwrap(), nodes[0].node.get_our_node_id());
                _ => panic!("Unexpected event"),
        }
        match events[1] {
 -              Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id: _ } => {
 +              Event::PaymentClaimable { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id: _ } => {
                        assert_eq!(payment_hash_3, *payment_hash);
                        assert_eq!(1_000_000, amount_msat);
                        assert_eq!(receiver_node_id.unwrap(), nodes[0].node.get_our_node_id());
@@@ -1750,7 -1750,7 +1750,7 @@@ fn test_monitor_update_on_pending_forwa
                _ => panic!("Unexpected event"),
        };
        nodes[0].node.process_pending_htlc_forwards();
 -      expect_payment_received!(nodes[0], payment_hash_2, payment_secret_2, 1000000);
 +      expect_payment_claimable!(nodes[0], payment_hash_2, payment_secret_2, 1000000);
  
        claim_payment(&nodes[2], &[&nodes[1], &nodes[0]], payment_preimage_2);
  }
@@@ -1799,7 -1799,7 +1799,7 @@@ fn monitor_update_claim_fail_no_respons
        nodes[1].node.handle_revoke_and_ack(&nodes[0].node.get_our_node_id(), &as_raa);
        check_added_monitors!(nodes[1], 1);
        expect_pending_htlcs_forwardable!(nodes[1]);
 -      expect_payment_received!(nodes[1], payment_hash_2, payment_secret_2, 1000000);
 +      expect_payment_claimable!(nodes[1], payment_hash_2, payment_secret_2, 1000000);
  
        let bs_updates = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
        nodes[0].node.handle_update_fulfill_htlc(&nodes[1].node.get_our_node_id(), &bs_updates.update_fulfill_htlcs[0]);
@@@ -2073,7 -2073,7 +2073,7 @@@ fn test_pending_update_fee_ack_on_recon
        check_added_monitors!(nodes[1], 1);
  
        expect_pending_htlcs_forwardable!(nodes[0]);
 -      expect_payment_received!(nodes[0], payment_hash, payment_secret, 1_000_000);
 +      expect_payment_claimable!(nodes[0], payment_hash, payment_secret, 1_000_000);
  
        claim_payment(&nodes[1], &[&nodes[0]], payment_preimage);
  }
@@@ -2368,7 -2368,7 +2368,7 @@@ fn do_channel_holding_cell_serialize(di
        let as_revoke_and_ack = get_event_msg!(nodes[0], MessageSendEvent::SendRevokeAndACK, nodes[1].node.get_our_node_id());
        nodes[1].node.handle_revoke_and_ack(&nodes[0].node.get_our_node_id(), &as_revoke_and_ack);
        expect_pending_htlcs_forwardable!(nodes[1]);
 -      expect_payment_received!(nodes[1], payment_hash_1, payment_secret_1, 100000);
 +      expect_payment_claimable!(nodes[1], payment_hash_1, payment_secret_1, 100000);
        check_added_monitors!(nodes[1], 1);
  
        commitment_signed_dance!(nodes[1], nodes[0], (), false, true, false);
        };
  
        nodes[1].node.process_pending_htlc_forwards();
 -      expect_payment_received!(nodes[1], payment_hash_2, payment_secret_2, 100000);
 +      expect_payment_claimable!(nodes[1], payment_hash_2, payment_secret_2, 100000);
  
        claim_payment(&nodes[0], &[&nodes[1]], payment_preimage_1);
        claim_payment(&nodes[0], &[&nodes[1]], payment_preimage_2);
index 6825d6f8d9479b1f7067b0bebfb4242aa4162ace,81372ee3da862cb35908da437e2a2fe578ef75f2..70a746819e0a2a6659bdf1ebf43fff2117f8663b
@@@ -34,7 -34,7 +34,7 @@@ use crate::chain::BestBlock
  use crate::chain::chaininterface::{FeeEstimator, ConfirmationTarget, LowerBoundedFeeEstimator};
  use crate::chain::channelmonitor::{ChannelMonitor, ChannelMonitorUpdate, ChannelMonitorUpdateStep, LATENCY_GRACE_PERIOD_BLOCKS};
  use crate::chain::transaction::{OutPoint, TransactionData};
- use crate::chain::keysinterface::{Sign, KeysInterface};
+ use crate::chain::keysinterface::{Sign, KeysInterface, BaseSign};
  use crate::util::events::ClosureReason;
  use crate::util::ser::{Readable, ReadableArgs, Writeable, Writer, VecWriter};
  use crate::util::logger::Logger;
@@@ -737,6 -737,10 +737,10 @@@ pub(super) struct Channel<Signer: Sign
  
        // We track whether we already emitted a `ChannelReady` event.
        channel_ready_event_emitted: bool,
+       /// The unique identifier used to re-derive the private key material for the channel through
+       /// [`KeysInterface::derive_channel_signer`].
+       channel_keys_id: [u8; 32],
  }
  
  #[cfg(any(test, fuzzing))]
@@@ -909,7 -913,8 +913,8 @@@ impl<Signer: Sign> Channel<Signer> 
                let opt_anchors = false; // TODO - should be based on features
  
                let holder_selected_contest_delay = config.channel_handshake_config.our_to_self_delay;
-               let holder_signer = keys_provider.get_channel_signer(false, channel_value_satoshis);
+               let channel_keys_id = keys_provider.generate_channel_keys_id(false, channel_value_satoshis, user_id);
+               let holder_signer = keys_provider.derive_channel_signer(channel_value_satoshis, channel_keys_id);
                let pubkeys = holder_signer.pubkeys().clone();
  
                if !their_features.supports_wumbo() && channel_value_satoshis > MAX_FUNDING_SATOSHIS_NO_WUMBO {
                        historical_inbound_htlc_fulfills: HashSet::new(),
  
                        channel_type: Self::get_initial_channel_type(&config),
+                       channel_keys_id,
                })
        }
  
                        return Err(ChannelError::Close("Channel Type was not understood - we require static remote key".to_owned()));
                }
  
-               let holder_signer = keys_provider.get_channel_signer(true, msg.funding_satoshis);
+               let channel_keys_id = keys_provider.generate_channel_keys_id(true, msg.funding_satoshis, user_id);
+               let holder_signer = keys_provider.derive_channel_signer(msg.funding_satoshis, channel_keys_id);
                let pubkeys = holder_signer.pubkeys().clone();
                let counterparty_pubkeys = ChannelPublicKeys {
                        funding_pubkey: msg.funding_pubkey,
                        historical_inbound_htlc_fulfills: HashSet::new(),
  
                        channel_type,
+                       channel_keys_id,
                };
  
                Ok(chan)
        /// our counterparty!)
        /// The result is a transaction which we can revoke broadcastership of (ie a "local" transaction)
        /// TODO Some magic rust shit to compile-time check this?
 -      fn build_holder_transaction_keys(&self, commitment_number: u64) -> Result<TxCreationKeys, ChannelError> {
 +      fn build_holder_transaction_keys(&self, commitment_number: u64) -> TxCreationKeys {
                let per_commitment_point = self.holder_signer.get_per_commitment_point(commitment_number, &self.secp_ctx);
                let delayed_payment_base = &self.get_holder_pubkeys().delayed_payment_basepoint;
                let htlc_basepoint = &self.get_holder_pubkeys().htlc_basepoint;
                let counterparty_pubkeys = self.get_counterparty_pubkeys();
  
 -              Ok(secp_check!(TxCreationKeys::derive_new(&self.secp_ctx, &per_commitment_point, delayed_payment_base, htlc_basepoint, &counterparty_pubkeys.revocation_basepoint, &counterparty_pubkeys.htlc_basepoint), "Local tx keys generation got bogus keys".to_owned()))
 +              TxCreationKeys::derive_new(&self.secp_ctx, &per_commitment_point, delayed_payment_base, htlc_basepoint, &counterparty_pubkeys.revocation_basepoint, &counterparty_pubkeys.htlc_basepoint)
        }
  
        #[inline]
        /// Creates a set of keys for build_commitment_transaction to generate a transaction which we
        /// will sign and send to our counterparty.
        /// If an Err is returned, it is a ChannelError::Close (for get_outbound_funding_created)
 -      fn build_remote_transaction_keys(&self) -> Result<TxCreationKeys, ChannelError> {
 +      fn build_remote_transaction_keys(&self) -> TxCreationKeys {
                //TODO: Ensure that the payment_key derived here ends up in the library users' wallet as we
                //may see payments to it!
                let revocation_basepoint = &self.get_holder_pubkeys().revocation_basepoint;
                let htlc_basepoint = &self.get_holder_pubkeys().htlc_basepoint;
                let counterparty_pubkeys = self.get_counterparty_pubkeys();
  
 -              Ok(secp_check!(TxCreationKeys::derive_new(&self.secp_ctx, &self.counterparty_cur_commitment_point.unwrap(), &counterparty_pubkeys.delayed_payment_basepoint, &counterparty_pubkeys.htlc_basepoint, revocation_basepoint, htlc_basepoint), "Remote tx keys generation got bogus keys".to_owned()))
 +              TxCreationKeys::derive_new(&self.secp_ctx, &self.counterparty_cur_commitment_point.unwrap(), &counterparty_pubkeys.delayed_payment_basepoint, &counterparty_pubkeys.htlc_basepoint, revocation_basepoint, htlc_basepoint)
        }
  
        /// Gets the redeemscript for the funding transaction output (ie the funding transaction output
        fn funding_created_signature<L: Deref>(&mut self, sig: &Signature, logger: &L) -> Result<(Txid, CommitmentTransaction, Signature), ChannelError> where L::Target: Logger {
                let funding_script = self.get_funding_redeemscript();
  
 -              let keys = self.build_holder_transaction_keys(self.cur_holder_commitment_transaction_number)?;
 +              let keys = self.build_holder_transaction_keys(self.cur_holder_commitment_transaction_number);
                let initial_commitment_tx = self.build_commitment_transaction(self.cur_holder_commitment_transaction_number, &keys, true, false, logger).tx;
                {
                        let trusted_tx = initial_commitment_tx.trust();
                        secp_check!(self.secp_ctx.verify_ecdsa(&sighash, &sig, self.counterparty_funding_pubkey()), "Invalid funding_created signature from peer".to_owned());
                }
  
 -              let counterparty_keys = self.build_remote_transaction_keys()?;
 +              let counterparty_keys = self.build_remote_transaction_keys();
                let counterparty_initial_commitment_tx = self.build_commitment_transaction(self.cur_counterparty_commitment_transaction_number, &counterparty_keys, false, false, logger).tx;
  
                let counterparty_trusted_tx = counterparty_initial_commitment_tx.trust();
                &self.get_counterparty_pubkeys().funding_pubkey
        }
  
-       pub fn funding_created<L: Deref>(&mut self, msg: &msgs::FundingCreated, best_block: BestBlock, logger: &L) -> Result<(msgs::FundingSigned, ChannelMonitor<Signer>, Option<msgs::ChannelReady>), ChannelError> where L::Target: Logger {
+       pub fn funding_created<K: Deref, L: Deref>(
+               &mut self, msg: &msgs::FundingCreated, best_block: BestBlock, keys_source: &K, logger: &L
+       ) -> Result<(msgs::FundingSigned, ChannelMonitor<<K::Target as KeysInterface>::Signer>, Option<msgs::ChannelReady>), ChannelError>
+       where
+               K::Target: KeysInterface,
+               L::Target: Logger
+       {
                if self.is_outbound() {
                        return Err(ChannelError::Close("Received funding_created for an outbound channel?".to_owned()));
                }
                self.channel_transaction_parameters.funding_outpoint = Some(funding_txo);
                // This is an externally observable change before we finish all our checks.  In particular
                // funding_created_signature may fail.
-               self.holder_signer.ready_channel(&self.channel_transaction_parameters);
+               self.holder_signer.provide_channel_parameters(&self.channel_transaction_parameters);
  
                let (counterparty_initial_commitment_txid, initial_commitment_tx, signature) = match self.funding_created_signature(&msg.signature, logger) {
                        Ok(res) => res,
                let funding_txo_script = funding_redeemscript.to_v0_p2wsh();
                let obscure_factor = get_commitment_transaction_number_obscure_factor(&self.get_holder_pubkeys().payment_point, &self.get_counterparty_pubkeys().payment_point, self.is_outbound());
                let shutdown_script = self.shutdown_scriptpubkey.clone().map(|script| script.into_inner());
-               let channel_monitor = ChannelMonitor::new(self.secp_ctx.clone(), self.holder_signer.clone(),
+               let mut monitor_signer = keys_source.derive_channel_signer(self.channel_value_satoshis, self.channel_keys_id);
+               monitor_signer.provide_channel_parameters(&self.channel_transaction_parameters);
+               let channel_monitor = ChannelMonitor::new(self.secp_ctx.clone(), monitor_signer,
                                                          shutdown_script, self.get_holder_selected_contest_delay(),
                                                          &self.destination_script, (funding_txo, funding_txo_script.clone()),
                                                          &self.channel_transaction_parameters,
  
        /// Handles a funding_signed message from the remote end.
        /// If this call is successful, broadcast the funding transaction (and not before!)
-       pub fn funding_signed<L: Deref>(&mut self, msg: &msgs::FundingSigned, best_block: BestBlock, logger: &L) -> Result<(ChannelMonitor<Signer>, Transaction, Option<msgs::ChannelReady>), ChannelError> where L::Target: Logger {
+       pub fn funding_signed<K: Deref, L: Deref>(
+               &mut self, msg: &msgs::FundingSigned, best_block: BestBlock, keys_source: &K, logger: &L
+       ) -> Result<(ChannelMonitor<<K::Target as KeysInterface>::Signer>, Transaction, Option<msgs::ChannelReady>), ChannelError>
+       where
+               K::Target: KeysInterface,
+               L::Target: Logger
+       {
                if !self.is_outbound() {
                        return Err(ChannelError::Close("Received funding_signed for an inbound channel?".to_owned()));
                }
  
                let funding_script = self.get_funding_redeemscript();
  
 -              let counterparty_keys = self.build_remote_transaction_keys()?;
 +              let counterparty_keys = self.build_remote_transaction_keys();
                let counterparty_initial_commitment_tx = self.build_commitment_transaction(self.cur_counterparty_commitment_transaction_number, &counterparty_keys, false, false, logger).tx;
                let counterparty_trusted_tx = counterparty_initial_commitment_tx.trust();
                let counterparty_initial_bitcoin_tx = counterparty_trusted_tx.built_transaction();
                log_trace!(logger, "Initial counterparty tx for channel {} is: txid {} tx {}",
                        log_bytes!(self.channel_id()), counterparty_initial_bitcoin_tx.txid, encode::serialize_hex(&counterparty_initial_bitcoin_tx.transaction));
  
 -              let holder_signer = self.build_holder_transaction_keys(self.cur_holder_commitment_transaction_number)?;
 +              let holder_signer = self.build_holder_transaction_keys(self.cur_holder_commitment_transaction_number);
                let initial_commitment_tx = self.build_commitment_transaction(self.cur_holder_commitment_transaction_number, &holder_signer, true, false, logger).tx;
                {
                        let trusted_tx = initial_commitment_tx.trust();
                let funding_txo_script = funding_redeemscript.to_v0_p2wsh();
                let obscure_factor = get_commitment_transaction_number_obscure_factor(&self.get_holder_pubkeys().payment_point, &self.get_counterparty_pubkeys().payment_point, self.is_outbound());
                let shutdown_script = self.shutdown_scriptpubkey.clone().map(|script| script.into_inner());
-               let channel_monitor = ChannelMonitor::new(self.secp_ctx.clone(), self.holder_signer.clone(),
+               let mut monitor_signer = keys_source.derive_channel_signer(self.channel_value_satoshis, self.channel_keys_id);
+               monitor_signer.provide_channel_parameters(&self.channel_transaction_parameters);
+               let channel_monitor = ChannelMonitor::new(self.secp_ctx.clone(), monitor_signer,
                                                          shutdown_script, self.get_holder_selected_contest_delay(),
                                                          &self.destination_script, (funding_txo, funding_txo_script),
                                                          &self.channel_transaction_parameters,
  
                let funding_script = self.get_funding_redeemscript();
  
 -              let keys = self.build_holder_transaction_keys(self.cur_holder_commitment_transaction_number).map_err(|e| (None, e))?;
 +              let keys = self.build_holder_transaction_keys(self.cur_holder_commitment_transaction_number);
  
                let commitment_stats = self.build_commitment_transaction(self.cur_holder_commitment_transaction_number, &keys, true, false, logger);
                let commitment_txid = {
                // Before proposing a feerate update, check that we can actually afford the new fee.
                let inbound_stats = self.get_inbound_pending_htlc_stats(Some(feerate_per_kw));
                let outbound_stats = self.get_outbound_pending_htlc_stats(Some(feerate_per_kw));
 -              let keys = if let Ok(keys) = self.build_holder_transaction_keys(self.cur_holder_commitment_transaction_number) { keys } else { return None; };
 +              let keys = self.build_holder_transaction_keys(self.cur_holder_commitment_transaction_number);
                let commitment_stats = self.build_commitment_transaction(self.cur_holder_commitment_transaction_number, &keys, true, true, logger);
                let buffer_fee_msat = Channel::<Signer>::commit_tx_fee_sat(feerate_per_kw, commitment_stats.num_nondust_htlcs + outbound_stats.on_holder_tx_holding_cell_htlcs_count as usize + CONCURRENT_INBOUND_HTLC_FEE_BUFFER as usize, self.opt_anchors()) * 1000;
                let holder_balance_msat = commitment_stats.local_balance_msat - outbound_stats.holding_cell_msat;
  
        /// If an Err is returned, it is a ChannelError::Close (for get_outbound_funding_created)
        fn get_outbound_funding_created_signature<L: Deref>(&mut self, logger: &L) -> Result<Signature, ChannelError> where L::Target: Logger {
 -              let counterparty_keys = self.build_remote_transaction_keys()?;
 +              let counterparty_keys = self.build_remote_transaction_keys();
                let counterparty_initial_commitment_tx = self.build_commitment_transaction(self.cur_counterparty_commitment_transaction_number, &counterparty_keys, false, false, logger).tx;
                Ok(self.holder_signer.sign_counterparty_commitment(&counterparty_initial_commitment_tx, Vec::new(), &self.secp_ctx)
                                .map_err(|_| ChannelError::Close("Failed to get signatures for new commitment_signed".to_owned()))?.0)
                }
  
                self.channel_transaction_parameters.funding_outpoint = Some(funding_txo);
-               self.holder_signer.ready_channel(&self.channel_transaction_parameters);
+               self.holder_signer.provide_channel_parameters(&self.channel_transaction_parameters);
  
                let signature = match self.get_outbound_funding_created_signature(logger) {
                        Ok(res) => res,
                        return Err(ChannelError::Ignore(format!("Cannot send value that would put us over the max HTLC value in flight our peer will accept ({})", self.counterparty_max_htlc_value_in_flight_msat)));
                }
  
 -              let keys = self.build_holder_transaction_keys(self.cur_holder_commitment_transaction_number)?;
 +              let keys = self.build_holder_transaction_keys(self.cur_holder_commitment_transaction_number);
                let commitment_stats = self.build_commitment_transaction(self.cur_holder_commitment_transaction_number, &keys, true, true, logger);
                if !self.is_outbound() {
                        // Check that we won't violate the remote channel reserve by adding this HTLC.
        /// 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<L: Deref>(&self, logger: &L) -> Result<(msgs::CommitmentSigned, (Txid, Vec<(HTLCOutputInCommitment, Option<&HTLCSource>)>)), ChannelError> where L::Target: Logger {
 -              let counterparty_keys = self.build_remote_transaction_keys()?;
 +              let counterparty_keys = self.build_remote_transaction_keys();
                let commitment_stats = self.build_commitment_transaction(self.cur_counterparty_commitment_transaction_number, &counterparty_keys, false, true, logger);
                let counterparty_commitment_txid = commitment_stats.tx.trust().txid();
                let (signature, htlc_signatures);
                (monitor_update, dropped_outbound_htlcs)
        }
  
 -      pub fn inflight_htlc_sources(&self) -> impl Iterator<Item=&HTLCSource> {
 +      pub fn inflight_htlc_sources(&self) -> impl Iterator<Item=(&HTLCSource, &PaymentHash)> {
                self.holding_cell_htlc_updates.iter()
                        .flat_map(|htlc_update| {
                                match htlc_update {
 -                                      HTLCUpdateAwaitingACK::AddHTLC { source, .. } => { Some(source) }
 -                                      _ => None
 +                                      HTLCUpdateAwaitingACK::AddHTLC { source, payment_hash, .. }
 +                                              => Some((source, payment_hash)),
 +                                      _ => None,
                                }
                        })
 -                      .chain(self.pending_outbound_htlcs.iter().map(|htlc| &htlc.source))
 +                      .chain(self.pending_outbound_htlcs.iter().map(|htlc| (&htlc.source, &htlc.payment_hash)))
        }
  }
  
- const SERIALIZATION_VERSION: u8 = 2;
+ const SERIALIZATION_VERSION: u8 = 3;
  const MIN_SERIALIZATION_VERSION: u8 = 2;
  
  impl_writeable_tlv_based_enum!(InboundHTLCRemovalReason,;
@@@ -5997,7 -6020,7 +6021,7 @@@ impl<Signer: Sign> Writeable for Channe
                // Note that we write out as if remove_uncommitted_htlcs_and_mark_paused had just been
                // called.
  
-               write_ver_prefix!(writer, SERIALIZATION_VERSION, MIN_SERIALIZATION_VERSION);
+               write_ver_prefix!(writer, MIN_SERIALIZATION_VERSION, MIN_SERIALIZATION_VERSION);
  
                // `user_id` used to be a single u64 value. In order to remain backwards compatible with
                // versions prior to 0.0.113, the u128 is serialized as two separate u64 values. We write
                        (21, self.outbound_scid_alias, required),
                        (23, channel_ready_event_emitted, option),
                        (25, user_id_high_opt, option),
+                       (27, self.channel_keys_id, required),
                });
  
                Ok(())
@@@ -6315,16 -6339,20 +6340,20 @@@ impl<'a, K: Deref> ReadableArgs<(&'a K
  
                let latest_monitor_update_id = Readable::read(reader)?;
  
-               let keys_len: u32 = Readable::read(reader)?;
-               let mut keys_data = Vec::with_capacity(cmp::min(keys_len as usize, MAX_ALLOC_SIZE));
-               while keys_data.len() != keys_len as usize {
-                       // Read 1KB at a time to avoid accidentally allocating 4GB on corrupted channel keys
-                       let mut data = [0; 1024];
-                       let read_slice = &mut data[0..cmp::min(1024, keys_len as usize - keys_data.len())];
-                       reader.read_exact(read_slice)?;
-                       keys_data.extend_from_slice(read_slice);
+               let mut keys_data = None;
+               if ver <= 2 {
+                       // Read the serialize signer bytes. We'll choose to deserialize them or not based on whether
+                       // the `channel_keys_id` TLV is present below.
+                       let keys_len: u32 = Readable::read(reader)?;
+                       keys_data = Some(Vec::with_capacity(cmp::min(keys_len as usize, MAX_ALLOC_SIZE)));
+                       while keys_data.as_ref().unwrap().len() != keys_len as usize {
+                               // Read 1KB at a time to avoid accidentally allocating 4GB on corrupted channel keys
+                               let mut data = [0; 1024];
+                               let read_slice = &mut data[0..cmp::min(1024, keys_len as usize - keys_data.as_ref().unwrap().len())];
+                               reader.read_exact(read_slice)?;
+                               keys_data.as_mut().unwrap().extend_from_slice(read_slice);
+                       }
                }
-               let holder_signer = keys_source.read_chan_signer(&keys_data)?;
  
                // Read the old serialization for shutdown_pubkey, preferring the TLV field later if set.
                let mut shutdown_scriptpubkey = match <PublicKey as Readable>::read(reader) {
                let mut channel_ready_event_emitted = None;
  
                let mut user_id_high_opt: Option<u64> = None;
+               let mut channel_keys_id: Option<[u8; 32]> = None;
  
                read_tlv_fields!(reader, {
                        (0, announcement_sigs, option),
                        (21, outbound_scid_alias, option),
                        (23, channel_ready_event_emitted, option),
                        (25, user_id_high_opt, option),
+                       (27, channel_keys_id, option),
                });
  
+               let (channel_keys_id, holder_signer) = if let Some(channel_keys_id) = channel_keys_id {
+                       let mut holder_signer = keys_source.derive_channel_signer(channel_value_satoshis, channel_keys_id);
+                       // If we've gotten to the funding stage of the channel, populate the signer with its
+                       // required channel parameters.
+                       let non_shutdown_state = channel_state & (!MULTI_STATE_FLAGS);
+                       if non_shutdown_state >= (ChannelState::FundingCreated as u32) {
+                               holder_signer.provide_channel_parameters(&channel_parameters);
+                       }
+                       (channel_keys_id, holder_signer)
+               } else {
+                       // `keys_data` can be `None` if we had corrupted data.
+                       let keys_data = keys_data.ok_or(DecodeError::InvalidValue)?;
+                       let holder_signer = keys_source.read_chan_signer(&keys_data)?;
+                       (holder_signer.channel_keys_id(), holder_signer)
+               };
                if let Some(preimages) = preimages_opt {
                        let mut iter = preimages.into_iter();
                        for htlc in pending_outbound_htlcs.iter_mut() {
                        historical_inbound_htlc_fulfills,
  
                        channel_type: channel_type.unwrap(),
+                       channel_keys_id,
                })
        }
  }
@@@ -6736,7 -6783,7 +6784,7 @@@ mod tests 
        use crate::ln::chan_utils::{htlc_success_tx_weight, htlc_timeout_tx_weight};
        use crate::chain::BestBlock;
        use crate::chain::chaininterface::{FeeEstimator, LowerBoundedFeeEstimator, ConfirmationTarget};
-       use crate::chain::keysinterface::{InMemorySigner, Recipient, KeyMaterial, KeysInterface};
+       use crate::chain::keysinterface::{BaseSign, InMemorySigner, Recipient, KeyMaterial, KeysInterface};
        use crate::chain::transaction::OutPoint;
        use crate::util::config::UserConfig;
        use crate::util::enforcing_trait_impls::EnforcingSigner;
                        ShutdownScript::new_p2wpkh_from_pubkey(PublicKey::from_secret_key(&secp_ctx, &channel_close_key))
                }
  
-               fn get_channel_signer(&self, _inbound: bool, _channel_value_satoshis: u64) -> InMemorySigner {
+               fn generate_channel_keys_id(&self, _inbound: bool, _channel_value_satoshis: u64, _user_channel_id: u128) -> [u8; 32] {
+                       self.signer.channel_keys_id()
+               }
+               fn derive_channel_signer(&self, _channel_value_satoshis: u64, _channel_keys_id: [u8; 32]) -> Self::Signer {
                        self.signer.clone()
                }
                fn get_secure_random_bytes(&self) -> [u8; 32] { [0; 32] }
                }]};
                let funding_outpoint = OutPoint{ txid: tx.txid(), index: 0 };
                let funding_created_msg = node_a_chan.get_outbound_funding_created(tx.clone(), funding_outpoint, &&logger).unwrap();
-               let (funding_signed_msg, _, _) = node_b_chan.funding_created(&funding_created_msg, best_block, &&logger).unwrap();
+               let (funding_signed_msg, _, _) = node_b_chan.funding_created(&funding_created_msg, best_block, &&keys_provider, &&logger).unwrap();
  
                // Node B --> Node A: funding signed
-               let _ = node_a_chan.funding_signed(&funding_signed_msg, best_block, &&logger);
+               let _ = node_a_chan.funding_signed(&funding_signed_msg, best_block, &&keys_provider, &&logger);
  
                // Now disconnect the two nodes and check that the commitment point in
                // Node B's channel_reestablish message is sane.
                                selected_contest_delay: 144
                        });
                chan.channel_transaction_parameters.funding_outpoint = Some(funding_info);
-               signer.ready_channel(&chan.channel_transaction_parameters);
+               signer.provide_channel_parameters(&chan.channel_transaction_parameters);
  
                assert_eq!(counterparty_pubkeys.payment_point.serialize()[..],
                           hex::decode("032c0b7cf95324a07d05398b240174dc0c2be444d96b159aa6c7f7b1e668680991").unwrap()[..]);
                let per_commitment_secret = SecretKey::from_slice(&hex::decode("1f1e1d1c1b1a191817161514131211100f0e0d0c0b0a09080706050403020100").unwrap()[..]).unwrap();
                let per_commitment_point = PublicKey::from_secret_key(&secp_ctx, &per_commitment_secret);
                let htlc_basepoint = &chan.holder_signer.pubkeys().htlc_basepoint;
 -              let keys = TxCreationKeys::derive_new(&secp_ctx, &per_commitment_point, delayed_payment_base, htlc_basepoint, &counterparty_pubkeys.revocation_basepoint, &counterparty_pubkeys.htlc_basepoint).unwrap();
 +              let keys = TxCreationKeys::derive_new(&secp_ctx, &per_commitment_point, delayed_payment_base, htlc_basepoint, &counterparty_pubkeys.revocation_basepoint, &counterparty_pubkeys.htlc_basepoint);
  
                macro_rules! test_commitment {
                        ( $counterparty_sig_hex: expr, $sig_hex: expr, $tx_hex: expr, $($remain:tt)* ) => {
                let per_commitment_point = PublicKey::from_secret_key(&secp_ctx, &per_commitment_secret);
                assert_eq!(per_commitment_point.serialize()[..], hex::decode("025f7117a78150fe2ef97db7cfc83bd57b2e2c0d0dd25eaf467a4a1c2a45ce1486").unwrap()[..]);
  
 -              assert_eq!(chan_utils::derive_public_key(&secp_ctx, &per_commitment_point, &base_point).unwrap().serialize()[..],
 +              assert_eq!(chan_utils::derive_public_key(&secp_ctx, &per_commitment_point, &base_point).serialize()[..],
                                hex::decode("0235f2dbfaa89b57ec7b055afe29849ef7ddfeb1cefdb9ebdc43f5494984db29e5").unwrap()[..]);
  
 -              assert_eq!(chan_utils::derive_private_key(&secp_ctx, &per_commitment_point, &base_secret).unwrap(),
 +              assert_eq!(chan_utils::derive_private_key(&secp_ctx, &per_commitment_point, &base_secret),
                                SecretKey::from_slice(&hex::decode("cbced912d3b21bf196a766651e436aff192362621ce317704ea2f75d87e7be0f").unwrap()[..]).unwrap());
  
 -              assert_eq!(chan_utils::derive_public_revocation_key(&secp_ctx, &per_commitment_point, &base_point).unwrap().serialize()[..],
 +              assert_eq!(chan_utils::derive_public_revocation_key(&secp_ctx, &per_commitment_point, &base_point).serialize()[..],
                                hex::decode("02916e326636d19c33f13e8c0c3a03dd157f332f3e99c317c141dd865eb01f8ff0").unwrap()[..]);
  
 -              assert_eq!(chan_utils::derive_private_revocation_key(&secp_ctx, &per_commitment_secret, &base_secret).unwrap(),
 +              assert_eq!(chan_utils::derive_private_revocation_key(&secp_ctx, &per_commitment_secret, &base_secret),
                                SecretKey::from_slice(&hex::decode("d09ffff62ddb2297ab000cc85bcb4283fdeb6aa052affbc9dddcf33b61078110").unwrap()[..]).unwrap());
        }
  
index 29553d17ffb3ac2dee788f59c2de7f5bb9a814c1,1e833b7046d716fb987101dee0f5b1ef220a5a7d..410386aa076808e3c1398f27a9c699a043ab3284
@@@ -54,7 -54,7 +54,7 @@@ use crate::ln::wire::Encode
  use crate::chain::keysinterface::{Sign, KeysInterface, KeysManager, Recipient};
  use crate::util::config::{UserConfig, ChannelConfig};
  use crate::util::events::{Event, EventHandler, EventsProvider, MessageSendEvent, MessageSendEventsProvider, ClosureReason, HTLCDestination};
- use crate::util::{byte_utils, events};
+ use crate::util::events;
  use crate::util::wakers::{Future, Notifier};
  use crate::util::scid_utils::fake_scid;
  use crate::util::ser::{BigSize, FixedLengthReader, Readable, ReadableArgs, MaybeReadable, Writeable, Writer, VecWriter};
@@@ -746,9 -746,9 +746,9 @@@ pub struct ChannelManager<M: Deref, T: 
        channel_state: Mutex<ChannelHolder<<K::Target as KeysInterface>::Signer>>,
  
        /// Storage for PaymentSecrets and any requirements on future inbound payments before we will
 -      /// expose them to users via a PaymentReceived event. HTLCs which do not meet the requirements
 +      /// expose them to users via a PaymentClaimable event. HTLCs which do not meet the requirements
        /// here are failed when we process them as pending-forwardable-HTLCs, and entries are removed
 -      /// after we generate a PaymentReceived upon receipt of all MPP parts or when they time out.
 +      /// after we generate a PaymentClaimable upon receipt of all MPP parts or when they time out.
        ///
        /// See `ChannelManager` struct-level documentation for lock order requirements.
        pending_inbound_payments: Mutex<HashMap<PaymentHash, PendingInboundPayment>>,
@@@ -2053,7 -2053,7 +2053,7 @@@ impl<M: Deref, T: Deref, K: Deref, F: D
                        return Err(ReceiveError {
                                msg: "Upstream node set CLTV to the wrong value",
                                err_code: 18,
-                               err_data: byte_utils::be32_to_array(cltv_expiry).to_vec()
+                               err_data: cltv_expiry.to_be_bytes().to_vec()
                        })
                }
                // final_expiry_too_soon
                if hop_data.amt_to_forward > amt_msat {
                        return Err(ReceiveError {
                                err_code: 19,
-                               err_data: byte_utils::be64_to_array(amt_msat).to_vec(),
+                               err_data: amt_msat.to_be_bytes().to_vec(),
                                msg: "Upstream node sent less than we were supposed to receive in payment",
                        });
                }
  
                                                                macro_rules! fail_htlc {
                                                                        ($htlc: expr, $payment_hash: expr) => {
-                                                                               let mut htlc_msat_height_data = byte_utils::be64_to_array($htlc.value).to_vec();
+                                                                               let mut htlc_msat_height_data = $htlc.value.to_be_bytes().to_vec();
                                                                                htlc_msat_height_data.extend_from_slice(
-                                                                                       &byte_utils::be32_to_array(self.best_block.read().unwrap().height()),
+                                                                                       &self.best_block.read().unwrap().height().to_be_bytes(),
                                                                                );
                                                                                failed_forwards.push((HTLCSource::PreviousHopData(HTLCPreviousHopData {
                                                                                                short_channel_id: $htlc.prev_hop.short_channel_id,
                                                                                } else if total_value == $payment_data.total_msat {
                                                                                        let prev_channel_id = prev_funding_outpoint.to_channel_id();
                                                                                        htlcs.push(claimable_htlc);
 -                                                                                      new_events.push(events::Event::PaymentReceived {
 +                                                                                      new_events.push(events::Event::PaymentClaimable {
                                                                                                receiver_node_id: Some(receiver_node_id),
                                                                                                payment_hash,
                                                                                                purpose: purpose(),
                                                                                                                let purpose = events::PaymentPurpose::SpontaneousPayment(preimage);
                                                                                                                e.insert((purpose.clone(), vec![claimable_htlc]));
                                                                                                                let prev_channel_id = prev_funding_outpoint.to_channel_id();
 -                                                                                                              new_events.push(events::Event::PaymentReceived {
 +                                                                                                              new_events.push(events::Event::PaymentClaimable {
                                                                                                                        receiver_node_id: Some(receiver_node_id),
                                                                                                                        payment_hash,
                                                                                                                        amount_msat: outgoing_amt_msat,
        }
  
        /// Indicates that the preimage for payment_hash is unknown or the received amount is incorrect
 -      /// after a PaymentReceived event, failing the HTLC back to its origin and freeing resources
 +      /// after a PaymentClaimable event, failing the HTLC back to its origin and freeing resources
        /// along the path (including in our own channel on which we received it).
        ///
        /// Note that in some cases around unclean shutdown, it is possible the payment may have
        /// already been claimed by you via [`ChannelManager::claim_funds`] prior to you seeing (a
 -      /// second copy of) the [`events::Event::PaymentReceived`] event. Alternatively, the payment
 +      /// second copy of) the [`events::Event::PaymentClaimable`] event. Alternatively, the payment
        /// may have already been failed automatically by LDK if it was nearing its expiration time.
        ///
        /// While LDK will never claim a payment automatically on your behalf (i.e. without you calling
                let removed_source = self.claimable_htlcs.lock().unwrap().remove(payment_hash);
                if let Some((_, mut sources)) = removed_source {
                        for htlc in sources.drain(..) {
-                               let mut htlc_msat_height_data = byte_utils::be64_to_array(htlc.value).to_vec();
-                               htlc_msat_height_data.extend_from_slice(&byte_utils::be32_to_array(
-                                               self.best_block.read().unwrap().height()));
+                               let mut htlc_msat_height_data = htlc.value.to_be_bytes().to_vec();
+                               htlc_msat_height_data.extend_from_slice(&self.best_block.read().unwrap().height().to_be_bytes());
                                let source = HTLCSource::PreviousHopData(htlc.prev_hop);
                                let reason = HTLCFailReason::reason(0x4000 | 15, htlc_msat_height_data);
                                let receiver = HTLCDestination::FailedPayment { payment_hash: *payment_hash };
                }
        }
  
 -      /// Provides a payment preimage in response to [`Event::PaymentReceived`], generating any
 +      /// Provides a payment preimage in response to [`Event::PaymentClaimable`], generating any
        /// [`MessageSendEvent`]s needed to claim the payment.
        ///
        /// Note that calling this method does *not* guarantee that the payment has been claimed. You
        /// provided to your [`EventHandler`] when [`process_pending_events`] is next called.
        ///
        /// Note that if you did not set an `amount_msat` when calling [`create_inbound_payment`] or
 -      /// [`create_inbound_payment_for_hash`] you must check that the amount in the `PaymentReceived`
 +      /// [`create_inbound_payment_for_hash`] you must check that the amount in the `PaymentClaimable`
        /// event matches your expectation. If you fail to do so and call this method, you may provide
        /// the sender "proof-of-payment" when they did not fulfill the full expected payment.
        ///
 -      /// [`Event::PaymentReceived`]: crate::util::events::Event::PaymentReceived
 +      /// [`Event::PaymentClaimable`]: crate::util::events::Event::PaymentClaimable
        /// [`Event::PaymentClaimed`]: crate::util::events::Event::PaymentClaimed
        /// [`process_pending_events`]: EventsProvider::process_pending_events
        /// [`create_inbound_payment`]: Self::create_inbound_payment
                        mem::drop(channel_state_lock);
                        if !valid_mpp {
                                for htlc in sources.drain(..) {
-                                       let mut htlc_msat_height_data = byte_utils::be64_to_array(htlc.value).to_vec();
-                                       htlc_msat_height_data.extend_from_slice(&byte_utils::be32_to_array(
-                                               self.best_block.read().unwrap().height()));
+                                       let mut htlc_msat_height_data = htlc.value.to_be_bytes().to_vec();
+                                       htlc_msat_height_data.extend_from_slice(&self.best_block.read().unwrap().height().to_be_bytes());
                                        let source = HTLCSource::PreviousHopData(htlc.prev_hop);
                                        let reason = HTLCFailReason::reason(0x4000 | 15, htlc_msat_height_data);
                                        let receiver = HTLCDestination::FailedPayment { payment_hash };
                                        if chan.get().get_counterparty_node_id() != *counterparty_node_id {
                                                return Err(MsgHandleErrInternal::send_err_msg_no_close("Got a message for a channel from the wrong node!".to_owned(), msg.temporary_channel_id));
                                        }
-                                       (try_chan_entry!(self, chan.get_mut().funding_created(msg, best_block, &self.logger), chan), chan.remove())
+                                       (try_chan_entry!(self, chan.get_mut().funding_created(msg, best_block, &self.keys_manager, &self.logger), chan), chan.remove())
                                },
                                hash_map::Entry::Vacant(_) => return Err(MsgHandleErrInternal::send_err_msg_no_close("Failed to find corresponding channel".to_owned(), msg.temporary_channel_id))
                        }
                                        if chan.get().get_counterparty_node_id() != *counterparty_node_id {
                                                return Err(MsgHandleErrInternal::send_err_msg_no_close("Got a message for a channel from the wrong node!".to_owned(), msg.channel_id));
                                        }
-                                       let (monitor, funding_tx, channel_ready) = match chan.get_mut().funding_signed(&msg, best_block, &self.logger) {
+                                       let (monitor, funding_tx, channel_ready) = match chan.get_mut().funding_signed(&msg, best_block, &self.keys_manager, &self.logger) {
                                                Ok(update) => update,
                                                Err(e) => try_chan_entry!(self, Err(e), chan),
                                        };
        /// This differs from [`create_inbound_payment_for_hash`] only in that it generates the
        /// [`PaymentHash`] and [`PaymentPreimage`] for you.
        ///
 -      /// The [`PaymentPreimage`] will ultimately be returned to you in the [`PaymentReceived`], which
 -      /// will have the [`PaymentReceived::payment_preimage`] field filled in. That should then be
 +      /// The [`PaymentPreimage`] will ultimately be returned to you in the [`PaymentClaimable`], which
 +      /// will have the [`PaymentClaimable::payment_preimage`] field filled in. That should then be
        /// passed directly to [`claim_funds`].
        ///
        /// See [`create_inbound_payment_for_hash`] for detailed documentation on behavior and requirements.
        /// Errors if `min_value_msat` is greater than total bitcoin supply.
        ///
        /// [`claim_funds`]: Self::claim_funds
 -      /// [`PaymentReceived`]: events::Event::PaymentReceived
 -      /// [`PaymentReceived::payment_preimage`]: events::Event::PaymentReceived::payment_preimage
 +      /// [`PaymentClaimable`]: events::Event::PaymentClaimable
 +      /// [`PaymentClaimable::payment_preimage`]: events::Event::PaymentClaimable::payment_preimage
        /// [`create_inbound_payment_for_hash`]: Self::create_inbound_payment_for_hash
        pub fn create_inbound_payment(&self, min_value_msat: Option<u64>, invoice_expiry_delta_secs: u32) -> Result<(PaymentHash, PaymentSecret), ()> {
                inbound_payment::create(&self.inbound_payment_key, min_value_msat, invoice_expiry_delta_secs, &self.keys_manager, self.highest_seen_timestamp.load(Ordering::Acquire) as u64)
        /// Gets a [`PaymentSecret`] for a given [`PaymentHash`], for which the payment preimage is
        /// stored external to LDK.
        ///
 -      /// A [`PaymentReceived`] event will only be generated if the [`PaymentSecret`] matches a
 +      /// A [`PaymentClaimable`] event will only be generated if the [`PaymentSecret`] matches a
        /// payment secret fetched via this method or [`create_inbound_payment`], and which is at least
        /// the `min_value_msat` provided here, if one is provided.
        ///
        ///
        /// `min_value_msat` should be set if the invoice being generated contains a value. Any payment
        /// received for the returned [`PaymentHash`] will be required to be at least `min_value_msat`
 -      /// before a [`PaymentReceived`] event will be generated, ensuring that we do not provide the
 +      /// before a [`PaymentClaimable`] event will be generated, ensuring that we do not provide the
        /// sender "proof-of-payment" unless they have paid the required amount.
        ///
        /// `invoice_expiry_delta_secs` describes the number of seconds that the invoice is valid for
        ///
        /// Note that we use block header time to time-out pending inbound payments (with some margin
        /// to compensate for the inaccuracy of block header timestamps). Thus, in practice we will
 -      /// accept a payment and generate a [`PaymentReceived`] event for some time after the expiry.
 +      /// accept a payment and generate a [`PaymentClaimable`] event for some time after the expiry.
        /// If you need exact expiry semantics, you should enforce them upon receipt of
 -      /// [`PaymentReceived`].
 +      /// [`PaymentClaimable`].
        ///
        /// Note that invoices generated for inbound payments should have their `min_final_cltv_expiry`
        /// set to at least [`MIN_FINAL_CLTV_EXPIRY`].
        /// Errors if `min_value_msat` is greater than total bitcoin supply.
        ///
        /// [`create_inbound_payment`]: Self::create_inbound_payment
 -      /// [`PaymentReceived`]: events::Event::PaymentReceived
 +      /// [`PaymentClaimable`]: events::Event::PaymentClaimable
        pub fn create_inbound_payment_for_hash(&self, payment_hash: PaymentHash, min_value_msat: Option<u64>, invoice_expiry_delta_secs: u32) -> Result<PaymentSecret, ()> {
                inbound_payment::create_from_hash(&self.inbound_payment_key, min_value_msat, payment_hash, invoice_expiry_delta_secs, self.highest_seen_timestamp.load(Ordering::Acquire) as u64)
        }
                let mut inflight_htlcs = InFlightHtlcs::new();
  
                for chan in self.channel_state.lock().unwrap().by_id.values() {
 -                      for htlc_source in chan.inflight_htlc_sources() {
 +                      for (htlc_source, _) in chan.inflight_htlc_sources() {
                                if let HTLCSource::OutboundRoute { path, .. } = htlc_source {
                                        inflight_htlcs.process_path(path, self.get_our_node_id());
                                }
                events.into_inner()
        }
  
 +      #[cfg(test)]
 +      pub fn pop_pending_event(&self) -> Option<events::Event> {
 +              let mut events = self.pending_events.lock().unwrap();
 +              if events.is_empty() { None } else { Some(events.remove(0)) }
 +      }
 +
        #[cfg(test)]
        pub fn has_pending_payments(&self) -> bool {
                !self.pending_outbound_payments.lock().unwrap().is_empty()
@@@ -6289,8 -6281,8 +6287,8 @@@ wher
                                        // number of blocks we generally consider it to take to do a commitment update,
                                        // just give up on it and fail the HTLC.
                                        if height >= htlc.cltv_expiry - HTLC_FAIL_BACK_BUFFER {
-                                               let mut htlc_msat_height_data = byte_utils::be64_to_array(htlc.value).to_vec();
-                                               htlc_msat_height_data.extend_from_slice(&byte_utils::be32_to_array(height));
+                                               let mut htlc_msat_height_data = htlc.value.to_be_bytes().to_vec();
+                                               htlc_msat_height_data.extend_from_slice(&height.to_be_bytes());
  
                                                timed_out_htlcs.push((HTLCSource::PreviousHopData(htlc.prev_hop.clone()), payment_hash.clone(),
                                                        HTLCFailReason::reason(0x4000 | 15, htlc_msat_height_data),
@@@ -7426,25 -7418,6 +7424,25 @@@ impl<'a, M: Deref, T: Deref, K: Deref, 
                                                user_channel_id: channel.get_user_id(),
                                                reason: ClosureReason::OutdatedChannelManager
                                        });
 +                                      for (channel_htlc_source, payment_hash) in channel.inflight_htlc_sources() {
 +                                              let mut found_htlc = false;
 +                                              for (monitor_htlc_source, _) in monitor.get_all_current_outbound_htlcs() {
 +                                                      if *channel_htlc_source == monitor_htlc_source { found_htlc = true; break; }
 +                                              }
 +                                              if !found_htlc {
 +                                                      // If we have some HTLCs in the channel which are not present in the newer
 +                                                      // ChannelMonitor, they have been removed and should be failed back to
 +                                                      // ensure we don't forget them entirely. Note that if the missing HTLC(s)
 +                                                      // were actually claimed we'd have generated and ensured the previous-hop
 +                                                      // claim update ChannelMonitor updates were persisted prior to persising
 +                                                      // the ChannelMonitor update for the forward leg, so attempting to fail the
 +                                                      // backwards leg of the HTLC will simply be rejected.
 +                                                      log_info!(args.logger,
 +                                                              "Failing HTLC with hash {} as it is missing in the ChannelMonitor for channel {} but was present in the (stale) ChannelManager",
 +                                                              log_bytes!(channel.channel_id()), log_bytes!(payment_hash.0));
 +                                                      failed_htlcs.push((channel_htlc_source.clone(), *payment_hash, channel.get_counterparty_node_id(), channel.channel_id()));
 +                                              }
 +                                      }
                                } else {
                                        log_info!(args.logger, "Successfully loaded channel {}", log_bytes!(channel.channel_id()));
                                        if let Some(short_channel_id) = channel.get_short_channel_id() {
                                None => continue,
                        }
                }
 -              if forward_htlcs_count > 0 {
 -                      // If we have pending HTLCs to forward, assume we either dropped a
 -                      // `PendingHTLCsForwardable` or the user received it but never processed it as they
 -                      // shut down before the timer hit. Either way, set the time_forwardable to a small
 -                      // constant as enough time has likely passed that we should simply handle the forwards
 -                      // now, or at least after the user gets a chance to reconnect to our peers.
 -                      pending_events_read.push(events::Event::PendingHTLCsForwardable {
 -                              time_forwardable: Duration::from_secs(2),
 -                      });
 -              }
  
                let background_event_count: u64 = Readable::read(reader)?;
                let mut pending_background_events_read: Vec<BackgroundEvent> = Vec::with_capacity(cmp::min(background_event_count as usize, MAX_ALLOC_SIZE/mem::size_of::<BackgroundEvent>()));
                                                        }
                                                }
                                        }
 +                                      for (htlc_source, htlc) in monitor.get_all_current_outbound_htlcs() {
 +                                              if let HTLCSource::PreviousHopData(prev_hop_data) = htlc_source {
 +                                                      // The ChannelMonitor is now responsible for this HTLC's
 +                                                      // failure/success and will let us know what its outcome is. If we
 +                                                      // still have an entry for this HTLC in `forward_htlcs`, we were
 +                                                      // apparently not persisted after the monitor was when forwarding
 +                                                      // the payment.
 +                                                      forward_htlcs.retain(|_, forwards| {
 +                                                              forwards.retain(|forward| {
 +                                                                      if let HTLCForwardInfo::AddHTLC(htlc_info) = forward {
 +                                                                              if htlc_info.prev_short_channel_id == prev_hop_data.short_channel_id &&
 +                                                                                      htlc_info.prev_htlc_id == prev_hop_data.htlc_id
 +                                                                              {
 +                                                                                      log_info!(args.logger, "Removing pending to-forward HTLC with hash {} as it was forwarded to the closed channel {}",
 +                                                                                              log_bytes!(htlc.payment_hash.0), log_bytes!(monitor.get_funding_txo().0.to_channel_id()));
 +                                                                                      false
 +                                                                              } else { true }
 +                                                                      } else { true }
 +                                                              });
 +                                                              !forwards.is_empty()
 +                                                      })
 +                                              }
 +                                      }
                                }
                        }
                }
  
 +              if !forward_htlcs.is_empty() {
 +                      // If we have pending HTLCs to forward, assume we either dropped a
 +                      // `PendingHTLCsForwardable` or the user received it but never processed it as they
 +                      // shut down before the timer hit. Either way, set the time_forwardable to a small
 +                      // constant as enough time has likely passed that we should simply handle the forwards
 +                      // now, or at least after the user gets a chance to reconnect to our peers.
 +                      pending_events_read.push(events::Event::PendingHTLCsForwardable {
 +                              time_forwardable: Duration::from_secs(2),
 +                      });
 +              }
 +
                let inbound_pmt_key_material = args.keys_manager.get_inbound_payment_key_material();
                let expanded_inbound_key = inbound_payment::ExpandedKey::new(&inbound_pmt_key_material);
  
@@@ -8606,7 -8555,7 +8604,7 @@@ pub mod bench 
                                $node_b.handle_revoke_and_ack(&$node_a.get_our_node_id(), &get_event_msg!(NodeHolder { node: &$node_a }, MessageSendEvent::SendRevokeAndACK, $node_b.get_our_node_id()));
  
                                expect_pending_htlcs_forwardable!(NodeHolder { node: &$node_b });
 -                              expect_payment_received!(NodeHolder { node: &$node_b }, payment_hash, payment_secret, 10_000);
 +                              expect_payment_claimable!(NodeHolder { node: &$node_b }, payment_hash, payment_secret, 10_000);
                                $node_b.claim_funds(payment_preimage);
                                expect_payment_claimed!(NodeHolder { node: &$node_b }, payment_hash, 10_000);
  
index 4bb5402ce6431bb25ccfeab406f3084ef746bb6c,2010a691d3a4fd0277436897e5a27765c7fdb1d7..79c85e75447d5bb959ef391c5941d0d62db933ff
@@@ -30,7 -30,7 +30,7 @@@ use crate::ln::features::{ChannelFeatur
  use crate::ln::msgs;
  use crate::ln::msgs::{ChannelMessageHandler, RoutingMessageHandler, ErrorAction};
  use crate::util::enforcing_trait_impls::EnforcingSigner;
- use crate::util::{byte_utils, test_utils};
+ use crate::util::test_utils;
  use crate::util::events::{Event, MessageSendEvent, MessageSendEventsProvider, PaymentPurpose, ClosureReason, HTLCDestination};
  use crate::util::errors::APIError;
  use crate::util::ser::{Writeable, ReadableArgs};
@@@ -705,7 -705,7 +705,7 @@@ fn test_update_fee_that_funder_cannot_a
  
        // Assemble the set of keys we can use for signatures for our commitment_signed message.
        let commit_tx_keys = chan_utils::TxCreationKeys::derive_new(&secp_ctx, &remote_point, &remote_delayed_payment_basepoint,
 -              &remote_htlc_basepoint, &local_revocation_basepoint, &local_htlc_basepoint).unwrap();
 +              &remote_htlc_basepoint, &local_revocation_basepoint, &local_htlc_basepoint);
  
        let res = {
                let local_chan_lock = nodes[0].node.channel_state.lock().unwrap();
@@@ -834,7 -834,7 +834,7 @@@ fn test_update_fee_with_fundee_update_a
        let events = nodes[0].node.get_and_clear_pending_events();
        assert_eq!(events.len(), 1);
        match events[0] {
 -              Event::PaymentReceived { .. } => { },
 +              Event::PaymentClaimable { .. } => { },
                _ => panic!("Unexpected event"),
        };
  
@@@ -1179,7 -1179,7 +1179,7 @@@ fn holding_cell_htlc_counting() 
        assert_eq!(events.len(), payments.len());
        for (event, &(_, ref hash)) in events.iter().zip(payments.iter()) {
                match event {
 -                      &Event::PaymentReceived { ref payment_hash, .. } => {
 +                      &Event::PaymentClaimable { ref payment_hash, .. } => {
                                assert_eq!(*payment_hash, *hash);
                        },
                        _ => panic!("Unexpected event"),
@@@ -1412,7 -1412,7 +1412,7 @@@ fn test_fee_spike_violation_fails_htlc(
  
        // Assemble the set of keys we can use for signatures for our commitment_signed message.
        let commit_tx_keys = chan_utils::TxCreationKeys::derive_new(&secp_ctx, &remote_point, &remote_delayed_payment_basepoint,
 -              &remote_htlc_basepoint, &local_revocation_basepoint, &local_htlc_basepoint).unwrap();
 +              &remote_htlc_basepoint, &local_revocation_basepoint, &local_htlc_basepoint);
  
        // Build the remote commitment transaction so we can sign it, and then later use the
        // signature for the commitment_signed message.
@@@ -1936,7 -1936,7 +1936,7 @@@ fn test_channel_reserve_holding_cell_ht
        commitment_signed_dance!(nodes[2], nodes[1], payment_event_11.commitment_msg, false);
  
        expect_pending_htlcs_forwardable!(nodes[2]);
 -      expect_payment_received!(nodes[2], our_payment_hash_1, our_payment_secret_1, recv_value_1);
 +      expect_payment_claimable!(nodes[2], our_payment_hash_1, our_payment_secret_1, recv_value_1);
  
        // flush the htlcs in the holding cell
        assert_eq!(commitment_update_2.update_add_htlcs.len(), 2);
        let events = nodes[2].node.get_and_clear_pending_events();
        assert_eq!(events.len(), 2);
        match events[0] {
 -              Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id: _ } => {
 +              Event::PaymentClaimable { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id: _ } => {
                        assert_eq!(our_payment_hash_21, *payment_hash);
                        assert_eq!(recv_value_21, amount_msat);
                        assert_eq!(nodes[2].node.get_our_node_id(), receiver_node_id.unwrap());
                _ => panic!("Unexpected event"),
        }
        match events[1] {
 -              Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id: _ } => {
 +              Event::PaymentClaimable { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id: _ } => {
                        assert_eq!(our_payment_hash_22, *payment_hash);
                        assert_eq!(recv_value_22, amount_msat);
                        assert_eq!(nodes[2].node.get_our_node_id(), receiver_node_id.unwrap());
@@@ -2106,7 -2106,7 +2106,7 @@@ fn channel_reserve_in_flight_removes() 
        assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
  
        expect_pending_htlcs_forwardable!(nodes[1]);
 -      expect_payment_received!(nodes[1], payment_hash_3, payment_secret_3, 100000);
 +      expect_payment_claimable!(nodes[1], payment_hash_3, payment_secret_3, 100000);
  
        // Note that as this RAA was generated before the delivery of the update_fulfill it shouldn't
        // resolve the second HTLC from A's point of view.
        check_added_monitors!(nodes[0], 1);
  
        expect_pending_htlcs_forwardable!(nodes[0]);
 -      expect_payment_received!(nodes[0], payment_hash_4, payment_secret_4, 10000);
 +      expect_payment_claimable!(nodes[0], payment_hash_4, payment_secret_4, 10000);
  
        claim_payment(&nodes[1], &[&nodes[0]], payment_preimage_4);
        claim_payment(&nodes[0], &[&nodes[1]], payment_preimage_3);
@@@ -3739,7 -3739,7 +3739,7 @@@ fn do_test_drop_messages_peer_disconnec
        let events_2 = nodes[1].node.get_and_clear_pending_events();
        assert_eq!(events_2.len(), 1);
        match events_2[0] {
 -              Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id: _ } => {
 +              Event::PaymentClaimable { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id: _ } => {
                        assert_eq!(payment_hash_1, *payment_hash);
                        assert_eq!(amount_msat, 1_000_000);
                        assert_eq!(receiver_node_id.unwrap(), nodes[1].node.get_our_node_id());
@@@ -4025,7 -4025,7 +4025,7 @@@ fn test_drop_messages_peer_disconnect_d
        let events_5 = nodes[1].node.get_and_clear_pending_events();
        assert_eq!(events_5.len(), 1);
        match events_5[0] {
 -              Event::PaymentReceived { ref payment_hash, ref purpose, .. } => {
 +              Event::PaymentClaimable { ref payment_hash, ref purpose, .. } => {
                        assert_eq!(payment_hash_2, *payment_hash);
                        match &purpose {
                                PaymentPurpose::InvoicePayment { payment_preimage, payment_secret, .. } => {
@@@ -4068,7 -4068,7 +4068,7 @@@ fn do_test_htlc_timeout(send_partial_mp
                let mut events = nodes[0].node.get_and_clear_pending_msg_events();
                assert_eq!(events.len(), 1);
                // Now do the relevant commitment_signed/RAA dances along the path, noting that the final
 -              // hop should *not* yet generate any PaymentReceived event(s).
 +              // hop should *not* yet generate any PaymentClaimable event(s).
                pass_along_path(&nodes[0], &[&nodes[1]], 100000, our_payment_hash, Some(payment_secret), events.drain(..).next().unwrap(), false, None);
                our_payment_hash
        } else {
        nodes[0].node.handle_update_fail_htlc(&nodes[1].node.get_our_node_id(), &htlc_timeout_updates.update_fail_htlcs[0]);
        commitment_signed_dance!(nodes[0], nodes[1], htlc_timeout_updates.commitment_signed, false);
        // 100_000 msat as u64, followed by the height at which we failed back above
-       let mut expected_failure_data = byte_utils::be64_to_array(100_000).to_vec();
-       expected_failure_data.extend_from_slice(&byte_utils::be32_to_array(block_count - 1));
+       let mut expected_failure_data = (100_000 as u64).to_be_bytes().to_vec();
+       expected_failure_data.extend_from_slice(&(block_count - 1).to_be_bytes());
        expect_payment_failed!(nodes[0], our_payment_hash, true, 0x4000 | 15, &expected_failure_data[..]);
  }
  
@@@ -4803,7 -4803,7 +4803,7 @@@ fn test_duplicate_payment_hash_one_fail
        assert_eq!(htlc_success_txn[2], commitment_txn[0]);
        assert_eq!(htlc_success_txn[3], htlc_success_txn[0]);
        assert_eq!(htlc_success_txn[4], htlc_success_txn[1]);
-       assert_ne!(htlc_success_txn[0].input[0].previous_output, htlc_timeout_tx.input[0].previous_output);
+       assert_ne!(htlc_success_txn[1].input[0].previous_output, htlc_timeout_tx.input[0].previous_output);
  
        mine_transaction(&nodes[1], &htlc_timeout_tx);
        connect_blocks(&nodes[1], ANTI_REORG_DELAY - 1);
        // Solve 2nd HTLC by broadcasting on B's chain HTLC-Success Tx from C
        // Note that the fee paid is effectively double as the HTLC value (including the nodes[1] fee
        // and nodes[2] fee) is rounded down and then claimed in full.
-       mine_transaction(&nodes[1], &htlc_success_txn[0]);
+       mine_transaction(&nodes[1], &htlc_success_txn[1]);
        expect_payment_forwarded!(nodes[1], nodes[0], nodes[2], Some(196*2), true, true);
        let updates = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
        assert!(updates.update_add_htlcs.is_empty());
@@@ -5800,7 -5800,7 +5800,7 @@@ fn test_free_and_fail_holding_cell_htlc
        let events = nodes[1].node.get_and_clear_pending_events();
        assert_eq!(events.len(), 1);
        match events[0] {
 -              Event::PaymentReceived { .. } => {},
 +              Event::PaymentClaimable { .. } => {},
                _ => panic!("Unexpected event"),
        }
        nodes[1].node.claim_funds(payment_preimage_1);
@@@ -6059,7 -6059,7 +6059,7 @@@ fn test_update_add_htlc_bolt2_sender_ex
                commitment_signed_dance!(nodes[1], nodes[0], payment_event.commitment_msg, false);
  
                expect_pending_htlcs_forwardable!(nodes[1]);
 -              expect_payment_received!(nodes[1], our_payment_hash, our_payment_secret, 100000);
 +              expect_payment_claimable!(nodes[1], our_payment_hash, our_payment_secret, 100000);
        }
        let (route, our_payment_hash, _, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[1], 100000);
        unwrap_send_err!(nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret), PaymentId(our_payment_hash.0)), true, APIError::ChannelUnavailable { ref err },
@@@ -6974,8 -6974,8 +6974,8 @@@ fn test_check_htlc_underpaying() 
        commitment_signed_dance!(nodes[0], nodes[1], commitment_signed, false, true);
  
        // 10_000 msat as u64, followed by a height of CHAN_CONFIRM_DEPTH as u32
-       let mut expected_failure_data = byte_utils::be64_to_array(10_000).to_vec();
-       expected_failure_data.extend_from_slice(&byte_utils::be32_to_array(CHAN_CONFIRM_DEPTH));
+       let mut expected_failure_data = (10_000 as u64).to_be_bytes().to_vec();
+       expected_failure_data.extend_from_slice(&CHAN_CONFIRM_DEPTH.to_be_bytes());
        expect_payment_failed!(nodes[0], our_payment_hash, true, 0x4000|15, &expected_failure_data[..]);
  }
  
@@@ -7954,7 -7954,7 +7954,7 @@@ fn test_preimage_storage() 
        let events = nodes[1].node.get_and_clear_pending_events();
        assert_eq!(events.len(), 1);
        match events[0] {
 -              Event::PaymentReceived { ref purpose, .. } => {
 +              Event::PaymentClaimable { ref purpose, .. } => {
                        match &purpose {
                                PaymentPurpose::InvoicePayment { payment_preimage, .. } => {
                                        claim_payment(&nodes[0], &[&nodes[1]], payment_preimage.unwrap());
@@@ -8024,7 -8024,7 +8024,7 @@@ fn test_secret_timeout() 
        let events = nodes[1].node.get_and_clear_pending_events();
        assert_eq!(events.len(), 1);
        match events[0] {
 -              Event::PaymentReceived { purpose: PaymentPurpose::InvoicePayment { payment_preimage, payment_secret }, .. } => {
 +              Event::PaymentClaimable { purpose: PaymentPurpose::InvoicePayment { payment_preimage, payment_secret }, .. } => {
                        assert!(payment_preimage.is_none());
                        assert_eq!(payment_secret, our_payment_secret);
                        // We don't actually have the payment preimage with which to claim this payment!
@@@ -8131,7 -8131,7 +8131,7 @@@ fn test_update_err_monitor_lockdown() 
                let mut w = test_utils::TestVecWriter(Vec::new());
                monitor.write(&mut w).unwrap();
                let new_monitor = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(
-                               &mut io::Cursor::new(&w.0), &test_utils::OnlyReadsKeysInterface {}).unwrap().1;
+                               &mut io::Cursor::new(&w.0), nodes[0].keys_manager).unwrap().1;
                assert!(new_monitor == *monitor);
                let watchtower = test_utils::TestChainMonitor::new(Some(&chain_source), &chanmon_cfgs[0].tx_broadcaster, &logger, &chanmon_cfgs[0].fee_estimator, &persister, &node_cfgs[0].keys_manager);
                assert_eq!(watchtower.watch_channel(outpoint, new_monitor), ChannelMonitorUpdateStatus::Completed);
@@@ -8195,7 -8195,7 +8195,7 @@@ fn test_concurrent_monitor_claim() 
                let mut w = test_utils::TestVecWriter(Vec::new());
                monitor.write(&mut w).unwrap();
                let new_monitor = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(
-                               &mut io::Cursor::new(&w.0), &test_utils::OnlyReadsKeysInterface {}).unwrap().1;
+                               &mut io::Cursor::new(&w.0), nodes[0].keys_manager).unwrap().1;
                assert!(new_monitor == *monitor);
                let watchtower = test_utils::TestChainMonitor::new(Some(&chain_source), &chanmon_cfgs[0].tx_broadcaster, &logger, &chanmon_cfgs[0].fee_estimator, &persister, &node_cfgs[0].keys_manager);
                assert_eq!(watchtower.watch_channel(outpoint, new_monitor), ChannelMonitorUpdateStatus::Completed);
                let mut w = test_utils::TestVecWriter(Vec::new());
                monitor.write(&mut w).unwrap();
                let new_monitor = <(BlockHash, channelmonitor::ChannelMonitor<EnforcingSigner>)>::read(
-                               &mut io::Cursor::new(&w.0), &test_utils::OnlyReadsKeysInterface {}).unwrap().1;
+                               &mut io::Cursor::new(&w.0), nodes[0].keys_manager).unwrap().1;
                assert!(new_monitor == *monitor);
                let watchtower = test_utils::TestChainMonitor::new(Some(&chain_source), &chanmon_cfgs[0].tx_broadcaster, &logger, &chanmon_cfgs[0].fee_estimator, &persister, &node_cfgs[0].keys_manager);
                assert_eq!(watchtower.watch_channel(outpoint, new_monitor), ChannelMonitorUpdateStatus::Completed);
@@@ -8959,7 -8959,7 +8959,7 @@@ fn do_test_dup_htlc_second_rejected(tes
                commitment_signed_dance!(nodes[1], nodes[0], payment_event.commitment_msg, false);
        }
        expect_pending_htlcs_forwardable!(nodes[1]);
 -      expect_payment_received!(nodes[1], our_payment_hash, our_payment_secret, 10_000);
 +      expect_payment_claimable!(nodes[1], our_payment_hash, our_payment_secret, 10_000);
  
        {
                // Note that we use a different PaymentId here to allow us to duplicativly pay
  #[test]
  fn test_dup_htlc_second_fail_panic() {
        // Previously, if we received two HTLCs back-to-back, where the second overran the expected
 -      // value for the payment, we'd fail back both HTLCs after generating a `PaymentReceived` event.
 +      // value for the payment, we'd fail back both HTLCs after generating a `PaymentClaimable` event.
        // Then, if the user failed the second payment, they'd hit a "tried to fail an already failed
        // HTLC" debug panic. This tests for this behavior, checking that only one HTLC is auto-failed.
        do_test_dup_htlc_second_rejected(true);
@@@ -9208,9 -9208,9 +9208,9 @@@ fn test_keysend_payments_to_private_nod
  
  #[test]
  fn test_double_partial_claim() {
 -      // Test what happens if a node receives a payment, generates a PaymentReceived event, the HTLCs
 +      // Test what happens if a node receives a payment, generates a PaymentClaimable event, the HTLCs
        // time out, the sender resends only some of the MPP parts, then the user processes the
 -      // PaymentReceived event, ensuring they don't inadvertently claim only part of the full payment
 +      // PaymentClaimable event, ensuring they don't inadvertently claim only part of the full payment
        // amount.
        let chanmon_cfgs = create_chanmon_cfgs(4);
        let node_cfgs = create_node_cfgs(4, &chanmon_cfgs);
        });
  
        send_along_route_with_secret(&nodes[0], route.clone(), &[&[&nodes[1], &nodes[3]], &[&nodes[2], &nodes[3]]], 15_000_000, payment_hash, payment_secret);
 -      // nodes[3] has now received a PaymentReceived event...which it will take some (exorbitant)
 +      // nodes[3] has now received a PaymentClaimable event...which it will take some (exorbitant)
        // amount of time to respond to.
  
        // Connect some blocks to time out the payment
        pass_along_path(&nodes[0], &[&nodes[1], &nodes[3]], 15_000_000, payment_hash, Some(payment_secret), events.drain(..).next().unwrap(), false, None);
  
        // At this point nodes[3] has received one half of the payment, and the user goes to handle
 -      // that PaymentReceived event they got hours ago and never handled...we should refuse to claim.
 +      // that PaymentClaimable event they got hours ago and never handled...we should refuse to claim.
        nodes[3].node.claim_funds(payment_preimage);
        check_added_monitors!(nodes[3], 0);
        assert!(nodes[3].node.get_and_clear_pending_msg_events().is_empty());
index aa0308925a026755391c0d840718f74448dade74,b69f57403caf1cd00bf277dcff4913e0da2559d7..48b8f05b3e2b5fe0099d6a9a1203c05137e24cd2
@@@ -25,7 -25,7 +25,7 @@@ use crate::ln::msgs::{ChannelMessageHan
  use crate::ln::wire::Encode;
  use crate::util::events::{Event, HTLCDestination, MessageSendEvent, MessageSendEventsProvider};
  use crate::util::ser::{Writeable, Writer};
- use crate::util::{byte_utils, test_utils};
+ use crate::util::test_utils;
  use crate::util::config::{UserConfig, ChannelConfig};
  use crate::util::errors::APIError;
  
@@@ -125,7 -125,7 +125,7 @@@ fn run_onion_failure_test_with_fail_int
  
                        if test_case == 2 || test_case == 200 {
                                expect_htlc_forward!(&nodes[2]);
 -                              expect_event!(&nodes[2], Event::PaymentReceived);
 +                              expect_event!(&nodes[2], Event::PaymentClaimable);
                                callback_node();
                                expect_pending_htlcs_forwardable_and_htlc_handling_failed!(nodes[2], vec![HTLCDestination::FailedPayment { payment_hash: payment_hash.clone() }]);
                        }
@@@ -1053,8 -1053,8 +1053,8 @@@ fn test_phantom_final_incorrect_cltv_ex
        commitment_signed_dance!(nodes[0], nodes[1], update_1.commitment_signed, false);
  
        // Ensure the payment fails with the expected error.
-       let expected_cltv = 82;
-       let error_data = byte_utils::be32_to_array(expected_cltv).to_vec();
+       let expected_cltv: u32 = 82;
+       let error_data = expected_cltv.to_be_bytes().to_vec();
        let mut fail_conditions = PaymentFailedConditions::new()
                .blamed_scid(phantom_scid)
                .expected_htlc_error_data(18, &error_data);
@@@ -1144,10 -1144,8 +1144,8 @@@ fn test_phantom_failure_too_low_recv_am
        commitment_signed_dance!(nodes[0], nodes[1], update_1.commitment_signed, false);
  
        // Ensure the payment fails with the expected error.
-       let mut error_data = byte_utils::be64_to_array(bad_recv_amt_msat).to_vec();
-       error_data.extend_from_slice(
-               &byte_utils::be32_to_array(nodes[1].node.best_block.read().unwrap().height()),
-       );
+       let mut error_data = bad_recv_amt_msat.to_be_bytes().to_vec();
+       error_data.extend_from_slice(&nodes[1].node.best_block.read().unwrap().height().to_be_bytes());
        let mut fail_conditions = PaymentFailedConditions::new()
                .blamed_scid(phantom_scid)
                .expected_htlc_error_data(0x4000 | 15, &error_data);
@@@ -1229,7 -1227,7 +1227,7 @@@ fn test_phantom_failure_reject_payment(
        nodes[1].node.process_pending_htlc_forwards();
        expect_pending_htlcs_forwardable_ignore!(nodes[1]);
        nodes[1].node.process_pending_htlc_forwards();
 -      expect_payment_received!(nodes[1], payment_hash, payment_secret, recv_amt_msat, None, route.paths[0].last().unwrap().pubkey);
 +      expect_payment_claimable!(nodes[1], payment_hash, payment_secret, recv_amt_msat, None, route.paths[0].last().unwrap().pubkey);
        nodes[1].node.fail_htlc_backwards(&payment_hash);
        expect_pending_htlcs_forwardable_and_htlc_handling_failed_ignore!(nodes[1], vec![HTLCDestination::FailedPayment { payment_hash }]);
        nodes[1].node.process_pending_htlc_forwards();
        commitment_signed_dance!(nodes[0], nodes[1], update_1.commitment_signed, false);
  
        // Ensure the payment fails with the expected error.
-       let mut error_data = byte_utils::be64_to_array(recv_amt_msat).to_vec();
-       error_data.extend_from_slice(
-               &byte_utils::be32_to_array(nodes[1].node.best_block.read().unwrap().height()),
-       );
+       let mut error_data = recv_amt_msat.to_be_bytes().to_vec();
+       error_data.extend_from_slice(&nodes[1].node.best_block.read().unwrap().height().to_be_bytes());
        let mut fail_conditions = PaymentFailedConditions::new()
                .blamed_scid(phantom_scid)
                .expected_htlc_error_data(0x4000 | 15, &error_data);