use miden_protocol::Word;
use miden_protocol::note::Nullifier;
use miden_protocol::transaction::{InputNoteCommitment, TransactionId};
use crate::decode::{ConversionResultExt, GrpcDecodeExt};
use crate::errors::ConversionError;
use crate::{decode, generated as proto};
impl From<&TransactionId> for proto::primitives::Digest {
fn from(value: &TransactionId) -> Self {
value.as_word().into()
}
}
impl From<TransactionId> for proto::primitives::Digest {
fn from(value: TransactionId) -> Self {
value.as_word().into()
}
}
impl From<&TransactionId> for proto::transaction::TransactionId {
fn from(value: &TransactionId) -> Self {
proto::transaction::TransactionId { id: Some(value.into()) }
}
}
impl From<TransactionId> for proto::transaction::TransactionId {
fn from(value: TransactionId) -> Self {
(&value).into()
}
}
impl TryFrom<proto::primitives::Digest> for TransactionId {
type Error = ConversionError;
fn try_from(value: proto::primitives::Digest) -> Result<Self, Self::Error> {
let digest: Word = value.try_into()?;
Ok(TransactionId::from_raw(digest))
}
}
impl TryFrom<proto::transaction::TransactionId> for TransactionId {
type Error = ConversionError;
fn try_from(value: proto::transaction::TransactionId) -> Result<Self, Self::Error> {
let decoder = value.decoder();
decode!(decoder, value.id)
}
}
impl From<InputNoteCommitment> for proto::transaction::InputNoteCommitment {
fn from(value: InputNoteCommitment) -> Self {
Self {
nullifier: Some(value.nullifier().into()),
header: value.header().cloned().map(Into::into),
}
}
}
impl TryFrom<proto::transaction::InputNoteCommitment> for InputNoteCommitment {
type Error = ConversionError;
fn try_from(value: proto::transaction::InputNoteCommitment) -> Result<Self, Self::Error> {
let decoder = value.decoder();
let nullifier: Nullifier = decode!(decoder, value.nullifier)?;
let header: Option<miden_protocol::note::NoteHeader> =
value.header.map(TryInto::try_into).transpose().context("header")?;
Ok(InputNoteCommitment::from_parts_unchecked(nullifier, header))
}
}