1use miden_lib::transaction::TransactionKernel;
2use miden_objects::{transaction::ProvenTransaction, vm::ProgramInfo};
3use miden_verifier::verify;
4
5use super::TransactionVerifierError;
6
7pub struct TransactionVerifier {
16 tx_program_info: ProgramInfo,
17 proof_security_level: u32,
18}
19
20impl TransactionVerifier {
21 pub fn new(proof_security_level: u32) -> Self {
23 let tx_program_info = TransactionKernel::program_info();
24 Self { tx_program_info, proof_security_level }
25 }
26
27 pub fn verify(&self, transaction: &ProvenTransaction) -> Result<(), TransactionVerifierError> {
34 let stack_inputs = TransactionKernel::build_input_stack(
36 transaction.account_id(),
37 transaction.account_update().initial_state_commitment(),
38 transaction.input_notes().commitment(),
39 transaction.ref_block_commitment(),
40 transaction.ref_block_num(),
41 );
42 let stack_outputs = TransactionKernel::build_output_stack(
43 transaction.account_update().final_state_commitment(),
44 transaction.output_notes().commitment(),
45 transaction.expiration_block_num(),
46 );
47
48 let proof_security_level = verify(
50 self.tx_program_info.clone(),
51 stack_inputs,
52 stack_outputs,
53 transaction.proof().clone(),
54 )
55 .map_err(TransactionVerifierError::TransactionVerificationFailed)?;
56
57 if proof_security_level < self.proof_security_level {
59 return Err(TransactionVerifierError::InsufficientProofSecurityLevel {
60 actual: proof_security_level,
61 expected_minimum: self.proof_security_level,
62 });
63 }
64
65 Ok(())
66 }
67}