+/// We use this to track counterparty commitment transactions and htlcs outputs and
+/// use it to generate any justice or 2nd-stage preimage/timeout transactions.
+#[derive(PartialEq)]
+struct CounterpartyCommitmentTransaction {
+ counterparty_delayed_payment_base_key: PublicKey,
+ counterparty_htlc_base_key: PublicKey,
+ on_counterparty_tx_csv: u16,
+ per_htlc: HashMap<Txid, Vec<HTLCOutputInCommitment>>
+}
+
+impl Writeable for CounterpartyCommitmentTransaction {
+ fn write<W: Writer>(&self, w: &mut W) -> Result<(), ::std::io::Error> {
+ self.counterparty_delayed_payment_base_key.write(w)?;
+ self.counterparty_htlc_base_key.write(w)?;
+ w.write_all(&byte_utils::be16_to_array(self.on_counterparty_tx_csv))?;
+ w.write_all(&byte_utils::be64_to_array(self.per_htlc.len() as u64))?;
+ for (ref txid, ref htlcs) in self.per_htlc.iter() {
+ w.write_all(&txid[..])?;
+ w.write_all(&byte_utils::be64_to_array(htlcs.len() as u64))?;
+ for &ref htlc in htlcs.iter() {
+ htlc.write(w)?;
+ }
+ }
+ Ok(())
+ }
+}
+impl Readable for CounterpartyCommitmentTransaction {
+ fn read<R: ::std::io::Read>(r: &mut R) -> Result<Self, DecodeError> {
+ let counterparty_commitment_transaction = {
+ let counterparty_delayed_payment_base_key = Readable::read(r)?;
+ let counterparty_htlc_base_key = Readable::read(r)?;
+ let on_counterparty_tx_csv: u16 = Readable::read(r)?;
+ let per_htlc_len: u64 = Readable::read(r)?;
+ 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(r)?;
+ let htlcs_count: u64 = Readable::read(r)?;
+ 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(r)?;
+ htlcs.push(htlc);
+ }
+ if let Some(_) = per_htlc.insert(txid, htlcs) {
+ return Err(DecodeError::InvalidValue);
+ }
+ }
+ CounterpartyCommitmentTransaction {
+ counterparty_delayed_payment_base_key,
+ counterparty_htlc_base_key,
+ on_counterparty_tx_csv,
+ per_htlc,
+ }
+ };
+ Ok(counterparty_commitment_transaction)
+ }
+}
+