use std::collections::BTreeMap;
use miden_protocol::account::{AccountComponent, AccountProcedureRoot, RoleSymbol};
use miden_standards::account::access::{Authority, PausableManager};
use miden_standards::account::policies::BlocklistManager;
use super::{
ATTEST_ADMIN_ROLE,
BLK_MANAGER_ROLE,
DOM_PAUSER_ROLE,
DOM_UNPAUSER_ROLE,
XRESERVE_SET_ATTESTER_PROC_PATH,
XReserveFaucetExtension,
};
const ROLE_GATED_PROCEDURE_COUNT: usize = 5;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct XReserveAdminAuthority {
procedure_roles: BTreeMap<AccountProcedureRoot, RoleSymbol>,
}
impl XReserveAdminAuthority {
pub fn new() -> Self {
let pauser = RoleSymbol::new(DOM_PAUSER_ROLE)
.expect("the Domain pauser role symbol is a fixed valid symbol");
let unpauser = RoleSymbol::new(DOM_UNPAUSER_ROLE)
.expect("the Domain unpauser role symbol is a fixed valid symbol");
let attest_admin = RoleSymbol::new(ATTEST_ADMIN_ROLE)
.expect("the attester administrator role symbol is a fixed valid symbol");
let set_attester_root = XReserveFaucetExtension::code()
.get_procedure_root_by_path(XRESERVE_SET_ATTESTER_PROC_PATH)
.expect("the shipped faucet extension exports set_attester");
let blocklist_manager = RoleSymbol::new(BLK_MANAGER_ROLE)
.expect("the blocklist administrator role symbol is a fixed valid symbol");
let procedure_roles = BTreeMap::from([
(PausableManager::pause_root(), pauser),
(PausableManager::unpause_root(), unpauser),
(set_attester_root, attest_admin),
(BlocklistManager::block_account_root(), blocklist_manager.clone()),
(BlocklistManager::unblock_account_root(), blocklist_manager),
]);
assert_eq!(
procedure_roles.len(),
ROLE_GATED_PROCEDURE_COUNT,
"the five gated procedures must be five distinct roots",
);
Self { procedure_roles }
}
pub fn procedure_roles(&self) -> &BTreeMap<AccountProcedureRoot, RoleSymbol> {
&self.procedure_roles
}
}
impl Default for XReserveAdminAuthority {
fn default() -> Self {
Self::new()
}
}
impl From<XReserveAdminAuthority> for Authority {
fn from(authority: XReserveAdminAuthority) -> Self {
Authority::RbacControlled {
procedure_roles: authority.procedure_roles,
}
}
}
impl From<XReserveAdminAuthority> for AccountComponent {
fn from(authority: XReserveAdminAuthority) -> Self {
Authority::from(authority).into()
}
}