- let onchain_detection = {
- let keys = Readable::read(reader)?;
- // Technically this can fail and serialize fail a round-trip, but only for serialization of
- // barely-init'd ChannelMonitors that we can't do anything with.
- let outpoint = OutPoint {
- txid: Readable::read(reader)?,
- index: Readable::read(reader)?,
- };
- let funding_info = Some((outpoint, Readable::read(reader)?));
- let current_remote_commitment_txid = Readable::read(reader)?;
- let prev_remote_commitment_txid = Readable::read(reader)?;
- OnchainDetection {
- keys,
- funding_info,
- current_remote_commitment_txid,
- prev_remote_commitment_txid,
+ let keys = Readable::read(reader)?;
+ // Technically this can fail and serialize fail a round-trip, but only for serialization of
+ // barely-init'd ChannelMonitors that we can't do anything with.
+ let outpoint = OutPoint {
+ txid: Readable::read(reader)?,
+ index: Readable::read(reader)?,
+ };
+ let funding_info = (outpoint, Readable::read(reader)?);
+ let current_remote_commitment_txid = Readable::read(reader)?;
+ let prev_remote_commitment_txid = Readable::read(reader)?;
+
+ let remote_tx_cache = {
+ let remote_delayed_payment_base_key = Readable::read(reader)?;
+ let remote_htlc_base_key = Readable::read(reader)?;
+ let per_htlc_len: u64 = Readable::read(reader)?;
+ let mut per_htlc = HashMap::with_capacity(cmp::min(per_htlc_len as usize, MAX_ALLOC_SIZE / 64));
+ for _ in 0..per_htlc_len {
+ let txid: Txid = Readable::read(reader)?;
+ let htlcs_count: u64 = Readable::read(reader)?;
+ let mut htlcs = Vec::with_capacity(cmp::min(htlcs_count as usize, MAX_ALLOC_SIZE / 32));
+ for _ in 0..htlcs_count {
+ let htlc = Readable::read(reader)?;
+ htlcs.push(htlc);
+ }
+ if let Some(_) = per_htlc.insert(txid, htlcs) {
+ return Err(DecodeError::InvalidValue);
+ }
+ }
+ RemoteTxCache {
+ remote_delayed_payment_base_key,
+ remote_htlc_base_key,
+ per_htlc,