Skip to main content

miden_node_proto/domain/
transaction.rs

1use miden_protocol::Word;
2use miden_protocol::note::Nullifier;
3use miden_protocol::transaction::{InputNoteCommitment, TransactionId};
4
5use crate::decode::{ConversionResultExt, GrpcDecodeExt};
6use crate::errors::ConversionError;
7use crate::{decode, generated as proto};
8
9// FROM TRANSACTION ID
10// ================================================================================================
11
12impl From<&TransactionId> for proto::primitives::Digest {
13    fn from(value: &TransactionId) -> Self {
14        value.as_word().into()
15    }
16}
17
18impl From<TransactionId> for proto::primitives::Digest {
19    fn from(value: TransactionId) -> Self {
20        value.as_word().into()
21    }
22}
23
24impl From<&TransactionId> for proto::transaction::TransactionId {
25    fn from(value: &TransactionId) -> Self {
26        proto::transaction::TransactionId { id: Some(value.into()) }
27    }
28}
29
30impl From<TransactionId> for proto::transaction::TransactionId {
31    fn from(value: TransactionId) -> Self {
32        (&value).into()
33    }
34}
35
36// INTO TRANSACTION ID
37// ================================================================================================
38
39impl TryFrom<proto::primitives::Digest> for TransactionId {
40    type Error = ConversionError;
41
42    fn try_from(value: proto::primitives::Digest) -> Result<Self, Self::Error> {
43        let digest: Word = value.try_into()?;
44        Ok(TransactionId::from_raw(digest))
45    }
46}
47
48impl TryFrom<proto::transaction::TransactionId> for TransactionId {
49    type Error = ConversionError;
50
51    fn try_from(value: proto::transaction::TransactionId) -> Result<Self, Self::Error> {
52        let decoder = value.decoder();
53        decode!(decoder, value.id)
54    }
55}
56
57// INPUT NOTE COMMITMENT
58// ================================================================================================
59
60impl From<InputNoteCommitment> for proto::transaction::InputNoteCommitment {
61    fn from(value: InputNoteCommitment) -> Self {
62        Self {
63            nullifier: Some(value.nullifier().into()),
64            header: value.header().cloned().map(Into::into),
65        }
66    }
67}
68
69impl TryFrom<proto::transaction::InputNoteCommitment> for InputNoteCommitment {
70    type Error = ConversionError;
71
72    fn try_from(value: proto::transaction::InputNoteCommitment) -> Result<Self, Self::Error> {
73        let decoder = value.decoder();
74        let nullifier: Nullifier = decode!(decoder, value.nullifier)?;
75
76        let header: Option<miden_protocol::note::NoteHeader> =
77            value.header.map(TryInto::try_into).transpose().context("header")?;
78
79        Ok(InputNoteCommitment::from_parts_unchecked(nullifier, header))
80    }
81}