use alloc::string::String;
use miden_crypto_derive::WordWrapper;
use super::{Felt, Hasher, Word};
use crate::note::{NoteAssets, NoteRecipient};
use crate::utils::serde::{
ByteReader,
ByteWriter,
Deserializable,
DeserializationError,
Serializable,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, WordWrapper)]
pub struct NoteDetailsCommitment(Word);
impl NoteDetailsCommitment {
pub fn new(recipient: &NoteRecipient, assets: &NoteAssets) -> Self {
Self::from_raw_commitments(recipient.digest(), assets.commitment())
}
pub fn from_raw_commitments(recipient: Word, asset_commitment: Word) -> Self {
Self(Hasher::merge(&[recipient, asset_commitment]))
}
}
impl Serializable for NoteDetailsCommitment {
fn write_into<W: ByteWriter>(&self, target: &mut W) {
target.write_bytes(&self.0.to_bytes());
}
fn get_size_hint(&self) -> usize {
Word::SERIALIZED_SIZE
}
}
impl Deserializable for NoteDetailsCommitment {
fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
let commitment = Word::read_from(source)?;
Ok(Self(commitment))
}
}