zebra_chain/primitives/
zcash_note_encryption.rsuse crate::{
block::Height,
parameters::{Network, NetworkUpgrade},
transaction::Transaction,
};
pub fn decrypts_successfully(tx: &Transaction, network: &Network, height: Height) -> bool {
let nu = NetworkUpgrade::current(network, height);
let Ok(tx) = tx.to_librustzcash(nu) else {
return false;
};
let null_sapling_ovk = sapling_crypto::keys::OutgoingViewingKey([0u8; 32]);
let zip_212_enforcement = if nu >= NetworkUpgrade::Canopy {
sapling_crypto::note_encryption::Zip212Enforcement::On
} else {
sapling_crypto::note_encryption::Zip212Enforcement::Off
};
if let Some(bundle) = tx.sapling_bundle() {
for output in bundle.shielded_outputs().iter() {
let recovery = sapling_crypto::note_encryption::try_sapling_output_recovery(
&null_sapling_ovk,
output,
zip_212_enforcement,
);
if recovery.is_none() {
return false;
}
}
}
if let Some(bundle) = tx.orchard_bundle() {
for act in bundle.actions() {
if zcash_note_encryption::try_output_recovery_with_ovk(
&orchard::note_encryption::OrchardDomain::for_action(act),
&orchard::keys::OutgoingViewingKey::from([0u8; 32]),
act,
act.cv_net(),
&act.encrypted_note().out_ciphertext,
)
.is_none()
{
return false;
}
}
}
true
}