diff --git a/miden-crypto/src/merkle/smt/simple/mod.rs b/miden-crypto/src/merkle/smt/simple/mod.rs index 6773cd1..054e08e 100644 --- a/miden-crypto/src/merkle/smt/simple/mod.rs +++ b/miden-crypto/src/merkle/smt/simple/mod.rs @@ -1,5 +1,7 @@ use alloc::collections::BTreeSet; +use crate::merkle::{SparseMerklePath, SparseValuePath}; + use super::{ super::ValuePath, EMPTY_WORD, EmptySubtreeRoots, InnerNode, InnerNodeInfo, InnerNodes, LeafIndex, MerkleError, MerklePath, MutationSet, NodeIndex, RpoDigest, SMT_MAX_DEPTH, @@ -169,8 +171,15 @@ impl SimpleSmt { /// Returns an opening of the leaf associated with `key`. Conceptually, an opening is a Merkle /// path to the leaf, as well as the leaf itself. - pub fn open(&self, key: &LeafIndex) -> ValuePath { - >::open(self, key) + pub fn open(&self, key: &LeafIndex) -> SparseValuePath { + let value = RpoDigest::new(self.get_value(key)); + let nodes = key.index.proof_indices().map(|index| self.get_hash(index)); + // `from_sized_iter()` returns an error if there are more nodes than `SMT_MAX_DEPTH`, but + // this could only happen if we have more levels than `SMT_MAX_DEPTH` ourselves, which is + // guarded against in `SimpleSmt::new()`. + let path = SparseMerklePath::from_sized_iter(nodes).unwrap(); + + SparseValuePath { value, path } } /// Returns a boolean value indicating whether the SMT is empty.