Skip to main content

miden_standards/account/components/
mod.rs

1use alloc::collections::BTreeSet;
2use alloc::vec::Vec;
3
4use miden_protocol::account::AccountProcedureRoot;
5
6use crate::account::access::{Authority, Ownable2Step, RoleBasedAccessControl};
7use crate::account::auth::{
8    AuthGuardedMultisig,
9    AuthMultisig,
10    AuthMultisigSmart,
11    AuthNetworkAccount,
12    AuthSingleSig,
13    AuthSingleSigAcl,
14    NoAuth,
15};
16use crate::account::faucets::FungibleFaucet;
17use crate::account::interface::AccountComponentInterface;
18use crate::account::wallets::BasicWallet;
19
20// STANDARD ACCOUNT COMPONENTS
21// ================================================================================================
22
23/// The enum holding the types of standard account components defined in the `miden-standards`
24/// crate.
25pub enum StandardAccountComponent {
26    BasicWallet,
27    FungibleFaucet,
28    Authority,
29    Ownable2Step,
30    RoleBasedAccessControl,
31    AuthSingleSig,
32    AuthSingleSigAcl,
33    AuthMultisig,
34    AuthMultisigSmart,
35    AuthGuardedMultisig,
36    AuthNoAuth,
37    AuthNetworkAccount,
38}
39
40impl StandardAccountComponent {
41    /// Returns the iterator over the [`AccountProcedureRoot`]s of all procedures exported from
42    /// the component.
43    pub fn procedure_roots(&self) -> impl Iterator<Item = AccountProcedureRoot> {
44        let code = match self {
45            Self::BasicWallet => BasicWallet::code(),
46            Self::FungibleFaucet => FungibleFaucet::code(),
47            Self::Authority => Authority::code(),
48            Self::Ownable2Step => Ownable2Step::code(),
49            Self::RoleBasedAccessControl => RoleBasedAccessControl::code(),
50            Self::AuthSingleSig => AuthSingleSig::code(),
51            Self::AuthSingleSigAcl => AuthSingleSigAcl::code(),
52            Self::AuthMultisig => AuthMultisig::code(),
53            Self::AuthMultisigSmart => AuthMultisigSmart::code(),
54            Self::AuthGuardedMultisig => AuthGuardedMultisig::code(),
55            Self::AuthNoAuth => NoAuth::code(),
56            Self::AuthNetworkAccount => AuthNetworkAccount::code(),
57        };
58
59        code.procedure_roots()
60    }
61
62    /// Checks whether procedures from the current component are present in the procedures map
63    /// and if so it removes these procedures from this map and pushes the corresponding component
64    /// interface to the component interface vector.
65    fn extract_component(
66        &self,
67        procedures_set: &mut BTreeSet<AccountProcedureRoot>,
68        component_interface_vec: &mut Vec<AccountComponentInterface>,
69    ) {
70        // Determine if this component should be extracted based on procedure matching
71        if self.procedure_roots().all(|proc_root| procedures_set.contains(&proc_root)) {
72            // Remove the procedure root of any matching procedure.
73            self.procedure_roots().for_each(|component_procedure| {
74                procedures_set.remove(&component_procedure);
75            });
76
77            // Create the appropriate component interface
78            match self {
79                Self::BasicWallet => {
80                    component_interface_vec.push(AccountComponentInterface::BasicWallet)
81                },
82                Self::FungibleFaucet => {
83                    component_interface_vec.push(AccountComponentInterface::FungibleFaucet)
84                },
85                Self::Authority => {
86                    component_interface_vec.push(AccountComponentInterface::Authority)
87                },
88                Self::Ownable2Step => {
89                    component_interface_vec.push(AccountComponentInterface::Ownable2Step)
90                },
91                Self::RoleBasedAccessControl => {
92                    component_interface_vec.push(AccountComponentInterface::RoleBasedAccessControl)
93                },
94                Self::AuthSingleSig => {
95                    component_interface_vec.push(AccountComponentInterface::AuthSingleSig)
96                },
97                Self::AuthSingleSigAcl => {
98                    component_interface_vec.push(AccountComponentInterface::AuthSingleSigAcl)
99                },
100                Self::AuthMultisig => {
101                    component_interface_vec.push(AccountComponentInterface::AuthMultisig)
102                },
103                Self::AuthMultisigSmart => {
104                    component_interface_vec.push(AccountComponentInterface::AuthMultisigSmart)
105                },
106                Self::AuthGuardedMultisig => {
107                    component_interface_vec.push(AccountComponentInterface::AuthGuardedMultisig)
108                },
109                Self::AuthNoAuth => {
110                    component_interface_vec.push(AccountComponentInterface::AuthNoAuth)
111                },
112                Self::AuthNetworkAccount => {
113                    component_interface_vec.push(AccountComponentInterface::AuthNetworkAccount)
114                },
115            }
116        }
117    }
118
119    /// Gets all standard components which could be constructed from the provided procedures map
120    /// and pushes them to the `component_interface_vec`.
121    pub fn extract_standard_components(
122        procedures_set: &mut BTreeSet<AccountProcedureRoot>,
123        component_interface_vec: &mut Vec<AccountComponentInterface>,
124    ) {
125        Self::BasicWallet.extract_component(procedures_set, component_interface_vec);
126        Self::FungibleFaucet.extract_component(procedures_set, component_interface_vec);
127        Self::Authority.extract_component(procedures_set, component_interface_vec);
128        Self::RoleBasedAccessControl.extract_component(procedures_set, component_interface_vec);
129        Self::Ownable2Step.extract_component(procedures_set, component_interface_vec);
130        Self::AuthSingleSig.extract_component(procedures_set, component_interface_vec);
131        Self::AuthSingleSigAcl.extract_component(procedures_set, component_interface_vec);
132        Self::AuthGuardedMultisig.extract_component(procedures_set, component_interface_vec);
133        Self::AuthMultisig.extract_component(procedures_set, component_interface_vec);
134        Self::AuthMultisigSmart.extract_component(procedures_set, component_interface_vec);
135        Self::AuthNoAuth.extract_component(procedures_set, component_interface_vec);
136        Self::AuthNetworkAccount.extract_component(procedures_set, component_interface_vec);
137    }
138}