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
12procedure_root!(
14 CODE_INSPECTION_HAS_PROCEDURE,
15 CodeInspection::NAME,
16 CodeInspection::HAS_PROCEDURE_PROC_NAME,
17 CodeInspection::code()
18);
19
20procedure_root!(
22 CODE_INSPECTION_GET_CODE_COMMITMENT,
23 CodeInspection::NAME,
24 CodeInspection::GET_CODE_COMMITMENT_PROC_NAME,
25 CodeInspection::code()
26);
27
28procedure_root!(
30 CODE_INSPECTION_GET_NUM_PROCEDURES,
31 CodeInspection::NAME,
32 CodeInspection::GET_NUM_PROCEDURES_PROC_NAME,
33 CodeInspection::code()
34);
35
36procedure_root!(
38 CODE_INSPECTION_GET_PROCEDURE_ROOT,
39 CodeInspection::NAME,
40 CodeInspection::GET_PROCEDURE_ROOT_PROC_NAME,
41 CodeInspection::code()
42);
43
44pub struct CodeInspection;
62
63impl CodeInspection {
64 pub const NAME: &'static str = "miden::standards::components::inspection::code_inspection";
69
70 const HAS_PROCEDURE_PROC_NAME: &str = "has_procedure";
71 const GET_CODE_COMMITMENT_PROC_NAME: &str = "get_code_commitment";
72 const GET_NUM_PROCEDURES_PROC_NAME: &str = "get_num_procedures";
73 const GET_PROCEDURE_ROOT_PROC_NAME: &str = "get_procedure_root";
74
75 pub const fn name() -> AccountComponentName {
77 AccountComponentName::from_static_str(Self::NAME)
78 }
79
80 pub fn code() -> &'static AccountComponentCode {
85 &CODE_INSPECTION_CODE
86 }
87
88 pub fn has_procedure_root() -> AccountProcedureRoot {
90 *CODE_INSPECTION_HAS_PROCEDURE
91 }
92
93 pub fn get_code_commitment_root() -> AccountProcedureRoot {
95 *CODE_INSPECTION_GET_CODE_COMMITMENT
96 }
97
98 pub fn get_num_procedures_root() -> AccountProcedureRoot {
100 *CODE_INSPECTION_GET_NUM_PROCEDURES
101 }
102
103 pub fn get_procedure_root_root() -> AccountProcedureRoot {
105 *CODE_INSPECTION_GET_PROCEDURE_ROOT
106 }
107
108 pub fn component_metadata() -> AccountComponentMetadata {
110 AccountComponentMetadata::new(Self::NAME)
111 .with_description("Read-only introspection over the account's own code")
112 }
113}
114
115impl From<CodeInspection> for AccountComponent {
116 fn from(_: CodeInspection) -> Self {
117 let metadata = CodeInspection::component_metadata();
118
119 AccountComponent::new(CodeInspection::code().clone(), vec![], metadata).expect(
120 "code inspection component should satisfy the requirements of a valid account component",
121 )
122 }
123}
124
125#[cfg(test)]
129mod tests {
130 use miden_protocol::account::{AccountBuilder, AccountType};
131
132 use super::CodeInspection;
133 use crate::account::auth::NoAuth;
134
135 #[test]
137 fn get_code_inspection_procedures() {
138 let _has_procedure_root = CodeInspection::has_procedure_root();
139 let _get_code_commitment_root = CodeInspection::get_code_commitment_root();
140 let _get_num_procedures_root = CodeInspection::get_num_procedures_root();
141 let _get_procedure_root_root = CodeInspection::get_procedure_root_root();
142 }
143
144 #[test]
147 fn account_exposes_code_inspection_procedures() -> anyhow::Result<()> {
148 let account = AccountBuilder::new([1; 32])
149 .account_type(AccountType::Public)
150 .with_auth_component(NoAuth)
151 .with_component(CodeInspection)
152 .build_existing()?;
153
154 let code = account.code();
155 assert!(code.has_procedure(*CodeInspection::has_procedure_root().mast_root()));
156 assert!(code.has_procedure(*CodeInspection::get_code_commitment_root().mast_root()));
157 assert!(code.has_procedure(*CodeInspection::get_num_procedures_root().mast_root()));
158 assert!(code.has_procedure(*CodeInspection::get_procedure_root_root().mast_root()));
159
160 Ok(())
161 }
162}