miden_standards/account/inspection/
code_inspection.rs1use miden_protocol::account::component::{AccountComponentCode, AccountComponentMetadata};
2use miden_protocol::account::{AccountComponent, AccountComponentName, AccountProcedureRoot};
3
4use crate::account::account_component_code;
5use crate::procedure_root;
6
7account_component_code!(CODE_INSPECTION_CODE, "miden-standards-inspection-code-inspection.masp");
11
12const CODE_INSPECTION_LIBRARY_PATH: &str =
18 "miden::standards::components::inspection::code_inspection";
19
20procedure_root!(
22 CODE_INSPECTION_HAS_PROCEDURE,
23 CODE_INSPECTION_LIBRARY_PATH,
24 CodeInspection::HAS_PROCEDURE_PROC_NAME,
25 CodeInspection::code()
26);
27
28procedure_root!(
30 CODE_INSPECTION_GET_CODE_COMMITMENT,
31 CODE_INSPECTION_LIBRARY_PATH,
32 CodeInspection::GET_CODE_COMMITMENT_PROC_NAME,
33 CodeInspection::code()
34);
35
36procedure_root!(
38 CODE_INSPECTION_GET_NUM_PROCEDURES,
39 CODE_INSPECTION_LIBRARY_PATH,
40 CodeInspection::GET_NUM_PROCEDURES_PROC_NAME,
41 CodeInspection::code()
42);
43
44procedure_root!(
46 CODE_INSPECTION_GET_PROCEDURE_ROOT,
47 CODE_INSPECTION_LIBRARY_PATH,
48 CodeInspection::GET_PROCEDURE_ROOT_PROC_NAME,
49 CodeInspection::code()
50);
51
52pub struct CodeInspection;
70
71impl CodeInspection {
72 pub const NAME: &'static str = "miden::standards::inspection::code_inspection";
77
78 const HAS_PROCEDURE_PROC_NAME: &str = "has_procedure";
79 const GET_CODE_COMMITMENT_PROC_NAME: &str = "get_code_commitment";
80 const GET_NUM_PROCEDURES_PROC_NAME: &str = "get_num_procedures";
81 const GET_PROCEDURE_ROOT_PROC_NAME: &str = "get_procedure_root";
82
83 pub const fn name() -> AccountComponentName {
85 AccountComponentName::from_static_str(Self::NAME)
86 }
87
88 pub fn code() -> &'static AccountComponentCode {
93 &CODE_INSPECTION_CODE
94 }
95
96 pub fn has_procedure_root() -> AccountProcedureRoot {
98 *CODE_INSPECTION_HAS_PROCEDURE
99 }
100
101 pub fn get_code_commitment_root() -> AccountProcedureRoot {
103 *CODE_INSPECTION_GET_CODE_COMMITMENT
104 }
105
106 pub fn get_num_procedures_root() -> AccountProcedureRoot {
108 *CODE_INSPECTION_GET_NUM_PROCEDURES
109 }
110
111 pub fn get_procedure_root_root() -> AccountProcedureRoot {
113 *CODE_INSPECTION_GET_PROCEDURE_ROOT
114 }
115
116 pub fn component_metadata() -> AccountComponentMetadata {
118 AccountComponentMetadata::new(Self::NAME)
119 .with_description("Read-only introspection over the account's own code")
120 }
121}
122
123impl From<CodeInspection> for AccountComponent {
124 fn from(_: CodeInspection) -> Self {
125 let metadata = CodeInspection::component_metadata();
126
127 AccountComponent::new(CodeInspection::code().clone(), vec![], metadata).expect(
128 "code inspection component should satisfy the requirements of a valid account component",
129 )
130 }
131}
132
133#[cfg(test)]
137mod tests {
138 use miden_protocol::account::{AccountBuilder, AccountType};
139
140 use super::CodeInspection;
141 use crate::account::auth::NoAuth;
142
143 #[test]
145 fn get_code_inspection_procedures() {
146 let _has_procedure_root = CodeInspection::has_procedure_root();
147 let _get_code_commitment_root = CodeInspection::get_code_commitment_root();
148 let _get_num_procedures_root = CodeInspection::get_num_procedures_root();
149 let _get_procedure_root_root = CodeInspection::get_procedure_root_root();
150 }
151
152 #[test]
155 fn account_exposes_code_inspection_procedures() -> anyhow::Result<()> {
156 let account = AccountBuilder::new([1; 32])
157 .account_type(AccountType::Public)
158 .with_component(NoAuth)
159 .with_component(CodeInspection)
160 .build_existing()?;
161
162 let code = account.code();
163 assert!(code.has_procedure(*CodeInspection::has_procedure_root().mast_root()));
164 assert!(code.has_procedure(*CodeInspection::get_code_commitment_root().mast_root()));
165 assert!(code.has_procedure(*CodeInspection::get_num_procedures_root().mast_root()));
166 assert!(code.has_procedure(*CodeInspection::get_procedure_root_root().mast_root()));
167
168 Ok(())
169 }
170}