use anchor_lang::{prelude::*, Bumps};
use crate::{
states::{RoleKey, Store},
CoreError,
};
pub(crate) trait Authentication<'info> {
fn authority(&self) -> &Signer<'info>;
fn store(&self) -> &AccountLoader<'info, Store>;
fn only_admin(&self) -> Result<()> {
require!(
self.store().load()?.has_admin_role(self.authority().key)?,
CoreError::NotAnAdmin
);
Ok(())
}
fn only_role(&self, role: &str) -> Result<()> {
require!(
self.store().load()?.has_role(self.authority().key, role)?,
CoreError::PermissionDenied
);
Ok(())
}
}
pub(crate) trait Authenticate<'info>: Authentication<'info> + Bumps + Sized {
fn only(ctx: &Context<Self>, role: &str) -> Result<()> {
ctx.accounts.only_role(role)
}
fn only_admin(ctx: &Context<Self>) -> Result<()> {
ctx.accounts.only_admin()
}
fn only_oracle_controller(ctx: &Context<Self>) -> Result<()> {
Self::only(ctx, RoleKey::ORACLE_CONTROLLER)
}
fn only_gt_controller(ctx: &Context<Self>) -> Result<()> {
Self::only(ctx, RoleKey::GT_CONTROLLER)
}
fn only_market_keeper(ctx: &Context<Self>) -> Result<()> {
Self::only(ctx, RoleKey::MARKET_KEEPER)
}
fn only_order_keeper(ctx: &Context<Self>) -> Result<()> {
Self::only(ctx, RoleKey::ORDER_KEEPER)
}
fn only_feature_keeper(ctx: &Context<Self>) -> Result<()> {
Self::only(ctx, RoleKey::FEATURE_KEEPER)
}
fn only_config_keeper(ctx: &Context<Self>) -> Result<()> {
Self::only(ctx, RoleKey::CONFIG_KEEPER)
}
fn only_price_keeper(ctx: &Context<Self>) -> Result<()> {
Self::only(ctx, RoleKey::PRICE_KEEPER)
}
fn only_migration_keeper(ctx: &Context<Self>) -> Result<()> {
Self::only(ctx, RoleKey::MIGRATION_KEEPER)
}
}
impl<'info, T> Authenticate<'info> for T where T: Authentication<'info> + Bumps + Sized {}