Skip to main content

miden_objects/decoded/transaction/
args.rs

1use miden_protobuf::unwrap_infallible;
2pub use proto::transaction::DecodedTransactionScript as TransactionScript;
3
4use crate::decoded::VerificationError;
5use crate::{Verify, proto};
6
7#[cfg(test)]
8mod tests;
9
10impl Verify for TransactionScript {
11    type Verified = miden_protocol::transaction::TransactionScript;
12    type Error = VerificationError;
13    fn verify(self) -> Result<Self::Verified, Self::Error> {
14        let mast = self.mast.verify()?;
15        let entrypoint = miden_protocol::MastNodeId::from_u32_safe(self.entrypoint, &mast)?;
16        Self::Verified::from_parts(alloc::sync::Arc::new(mast), entrypoint)
17            .map_err(VerificationError::new)
18    }
19}
20
21pub use proto::transaction::DecodedNoteArgument as NoteArgument;
22
23impl Verify for NoteArgument {
24    type Verified = (miden_protocol::note::NoteId, miden_protocol::Word);
25    type Error = core::convert::Infallible;
26    fn verify(self) -> Result<Self::Verified, Self::Error> {
27        Ok((self.note_id.verify()?, self.args))
28    }
29}
30
31pub use proto::transaction::DecodedTransactionArgs as TransactionArgs;
32
33impl Verify for TransactionArgs {
34    type Verified = miden_protocol::transaction::TransactionArgs;
35    type Error = VerificationError;
36    fn verify(self) -> Result<Self::Verified, Self::Error> {
37        let tx_script = self.tx_script.map(Verify::verify).transpose()?;
38        let mut note_args = alloc::collections::BTreeMap::new();
39        for argument in self.note_args {
40            let (id, args) = unwrap_infallible(argument.verify());
41            if note_args.insert(id, args).is_some() {
42                return Err(TransactionArgsError::DuplicateNoteArgument(id).into());
43            }
44        }
45        Ok(Self::Verified::from_parts(
46            tx_script,
47            self.tx_script_args,
48            note_args,
49            self.advice_inputs.verify()?,
50            self.auth_args,
51        ))
52    }
53}
54
55#[derive(Debug, thiserror::Error)]
56pub enum TransactionArgsError {
57    #[error("duplicate note argument {0}")]
58    DuplicateNoteArgument(miden_protocol::note::NoteId),
59}