use ink::primitives::AccountId;
pub type RoleType = u32;
pub const DEFAULT_ADMIN_ROLE: RoleType = 0;
use ink::{contract_ref, env::DefaultEnvironment};
pub type AccessControlRef = contract_ref!(AccessControl, DefaultEnvironment);
#[ink::trait_definition]
pub trait AccessControl {
#[ink(message)]
fn has_role(&self, role: RoleType, address: Option<AccountId>) -> bool;
#[ink(message)]
fn get_role_admin(&self, role: RoleType) -> RoleType;
#[ink(message)]
fn grant_role(
&mut self,
role: RoleType,
account: Option<AccountId>,
) -> Result<(), AccessControlError>;
#[ink(message)]
fn revoke_role(
&mut self,
role: RoleType,
account: Option<AccountId>,
) -> Result<(), AccessControlError>;
#[ink(message)]
fn renounce_role(
&mut self,
role: RoleType,
account: Option<AccountId>,
) -> Result<(), AccessControlError>;
#[ink(message)]
fn set_role_admin(
&mut self,
role: RoleType,
new_admin: RoleType,
) -> Result<(), AccessControlError>;
}
pub trait AccessControlStorage {
fn has_role(&self, role: RoleType, account: &Option<AccountId>) -> bool;
fn add(&mut self, role: RoleType, account: &Option<AccountId>);
fn remove(&mut self, role: RoleType, account: &Option<AccountId>);
fn get_role_admin(&self, role: RoleType) -> Option<RoleType>;
fn set_role_admin(&mut self, role: RoleType, new_admin: RoleType);
}
pub trait AccessControlInternal {
fn _default_admin() -> RoleType;
fn _has_role(&self, role: RoleType, account: Option<AccountId>) -> bool;
fn _grant_role(
&mut self,
role: RoleType,
member: Option<AccountId>,
) -> Result<(), AccessControlError>;
fn _do_revoke_role(
&mut self,
role: RoleType,
account: Option<AccountId>,
) -> Result<(), AccessControlError>;
fn _get_role_admin(&self, role: RoleType) -> RoleType;
fn _set_role_admin(&mut self, role: RoleType, new_admin: RoleType);
fn _ensure_has_role(
&self,
role: RoleType,
account: Option<AccountId>,
) -> Result<(), AccessControlError>;
}