miden_objects/batch/
note_tree.rs1use alloc::vec::Vec;
2
3use crate::crypto::merkle::{LeafIndex, MerkleError, SimpleSmt};
4use crate::note::{NoteId, NoteMetadata, compute_note_commitment};
5use crate::utils::{ByteReader, ByteWriter, Deserializable, DeserializationError, Serializable};
6use crate::{BATCH_NOTE_TREE_DEPTH, EMPTY_WORD, Word};
7
8#[derive(Debug, Clone, PartialEq, Eq)]
12pub struct BatchNoteTree(SimpleSmt<BATCH_NOTE_TREE_DEPTH>);
13
14impl BatchNoteTree {
15 pub fn with_contiguous_leaves<'a>(
22 entries: impl IntoIterator<Item = (NoteId, &'a NoteMetadata)>,
23 ) -> Result<Self, MerkleError> {
24 let leaves = entries
25 .into_iter()
26 .map(|(note_id, metadata)| compute_note_commitment(note_id, metadata));
27
28 SimpleSmt::with_contiguous_leaves(leaves).map(Self)
29 }
30
31 pub fn root(&self) -> Word {
33 self.0.root()
34 }
35
36 pub fn num_leaves(&self) -> usize {
38 self.0.num_leaves()
39 }
40
41 pub fn remove(&mut self, index: u64) -> Result<(), MerkleError> {
49 let key = LeafIndex::new(index)?;
50 self.0.insert(key, EMPTY_WORD);
51
52 Ok(())
53 }
54
55 pub fn into_smt(self) -> SimpleSmt<BATCH_NOTE_TREE_DEPTH> {
57 self.0
58 }
59}
60
61impl Serializable for BatchNoteTree {
65 fn write_into<W: ByteWriter>(&self, target: &mut W) {
66 self.0.leaves().collect::<Vec<_>>().write_into(target);
67 }
68}
69
70impl Deserializable for BatchNoteTree {
71 fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
72 let leaves = Vec::read_from(source)?;
73 let smt = SimpleSmt::with_leaves(leaves.into_iter()).map_err(|err| {
74 DeserializationError::UnknownError(format!(
75 "failed to deserialize BatchNoteTree: {err}"
76 ))
77 })?;
78 Ok(Self(smt))
79 }
80}