pczt/roles/tx_extractor/
sapling.rs1use rand_core::CryptoRng;
2use sapling::{
3 BatchValidator, Bundle,
4 bundle::Authorized,
5 circuit::{OutputVerifyingKey, SpendVerifyingKey},
6};
7use zcash_protocol::value::ZatBalance;
8
9pub(super) fn verify_bundle(
10 rng: impl CryptoRng,
11 bundle: &Bundle<Authorized, ZatBalance>,
12 spend_vk: &SpendVerifyingKey,
13 output_vk: &OutputVerifyingKey,
14 sighash: [u8; 32],
15) -> Result<(), SaplingError> {
16 let mut validator = BatchValidator::new();
17
18 if !validator.check_bundle(bundle.clone(), sighash) {
19 return Err(SaplingError::ConsensusRuleViolation);
20 }
21
22 if !validator.validate(spend_vk, output_vk, rng) {
23 return Err(SaplingError::InvalidProofsOrSignatures);
24 }
25
26 Ok(())
27}
28
29#[derive(Debug)]
30pub enum SaplingError {
31 ConsensusRuleViolation,
32 Extract(sapling::pczt::TxExtractorError),
33 InvalidProofsOrSignatures,
34}