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