miden_tx/host/
script_mast_forest_store.rs1use alloc::collections::BTreeMap;
2use alloc::sync::Arc;
3
4use miden_processor::MastForestStore;
5use miden_protocol::Word;
6use miden_protocol::assembly::mast::MastForest;
7use miden_protocol::note::NoteScript;
8use miden_protocol::transaction::TransactionScript;
9use miden_protocol::vm::AdviceMap;
10
11#[derive(Debug, Clone, Default)]
16pub struct ScriptMastForestStore {
17 mast_forests: BTreeMap<Word, Arc<MastForest>>,
18 advice_map: AdviceMap,
19}
20
21impl ScriptMastForestStore {
22 pub fn new(
24 tx_script: Option<&TransactionScript>,
25 note_scripts: impl Iterator<Item = impl AsRef<NoteScript>>,
26 ) -> Self {
27 let mut mast_store = ScriptMastForestStore {
28 mast_forests: BTreeMap::new(),
29 advice_map: AdviceMap::default(),
30 };
31
32 for note_script in note_scripts {
33 mast_store.insert(note_script.as_ref().mast());
34 }
35
36 if let Some(tx_script) = tx_script {
37 mast_store.insert(tx_script.mast());
38 }
39 mast_store
40 }
41
42 fn insert(&mut self, mast_forest: Arc<MastForest>) {
44 for proc_digest in mast_forest.local_procedure_digests() {
46 self.mast_forests.insert(proc_digest, mast_forest.clone());
47 }
48
49 for (key, values) in mast_forest.advice_map().clone() {
51 self.advice_map.insert((*key).into(), values);
52 }
53 }
54
55 pub fn advice_map(&self) -> &AdviceMap {
57 &self.advice_map
58 }
59}
60
61impl MastForestStore for ScriptMastForestStore {
65 fn get(&self, procedure_root: &Word) -> Option<Arc<MastForest>> {
66 self.mast_forests.get(procedure_root).cloned()
67 }
68}