use super::{Hash, Transaction};
use crate::serialization::{sha256d, ZcashSerialize};
pub(super) struct TxIdBuilder<'a> {
trans: &'a Transaction,
}
impl<'a> TxIdBuilder<'a> {
pub fn new(trans: &'a Transaction) -> Self {
TxIdBuilder { trans }
}
pub(super) fn txid(self) -> Option<Hash> {
match self.trans {
Transaction::V1 { .. }
| Transaction::V2 { .. }
| Transaction::V3 { .. }
| Transaction::V4 { .. } => self.txid_v1_to_v4(),
Transaction::V5 { .. } => self.txid_v5(),
#[cfg(all(zcash_unstable = "nu7", feature = "tx_v6"))]
Transaction::V6 { .. } => self.txid_v6(),
}
}
fn txid_v1_to_v4(self) -> Option<Hash> {
let mut hash_writer = sha256d::Writer::default();
self.trans.zcash_serialize(&mut hash_writer).ok()?;
Some(Hash(hash_writer.finish()))
}
fn txid_v5(self) -> Option<Hash> {
let nu = self.trans.network_upgrade()?;
Some(Hash(*self.trans.to_librustzcash(nu).ok()?.txid().as_ref()))
}
#[cfg(all(zcash_unstable = "nu7", feature = "tx_v6"))]
fn txid_v6(self) -> Option<Hash> {
self.txid_v5()
}
}