diff --git a/contracts/identity-registry-contract/src/contract.rs b/contracts/identity-registry-contract/src/contract.rs index 2c462ae..8b0cfe4 100644 --- a/contracts/identity-registry-contract/src/contract.rs +++ b/contracts/identity-registry-contract/src/contract.rs @@ -35,7 +35,28 @@ pub fn batch_add_experts(env:Env, experts: Vec
) -> Result<(), RegistryE Ok(()) } - + +/// Batch ban experts by setting their status to Banned (Admin only) +pub fn batch_ban_experts(env: Env, experts: Vec) -> Result<(), RegistryError> { + if experts.len() > 20 { + return Err(RegistryError::ExpertVecMax); + } + + let admin = storage::get_admin(&env).ok_or(RegistryError::NotInitialized)?; + admin.require_auth(); + + for expert in experts { + let status = storage::get_expert_status(&env, &expert); + if status == ExpertStatus::Banned { + return Err(RegistryError::AlreadyBanned); + } + storage::set_expert_record(&env, &expert, ExpertStatus::Banned); + events::emit_status_change(&env, expert, status, ExpertStatus::Banned, admin.clone()); + } + + Ok(()) +} + pub fn verify_expert(env: &Env, expert: &Address) -> Result<(), RegistryError> { let admin = storage::get_admin(env).ok_or(RegistryError::NotInitialized)?; diff --git a/contracts/identity-registry-contract/src/lib.rs b/contracts/identity-registry-contract/src/lib.rs index 8ac00bb..e5711de 100644 --- a/contracts/identity-registry-contract/src/lib.rs +++ b/contracts/identity-registry-contract/src/lib.rs @@ -26,7 +26,12 @@ impl IdentityRegistryContract { pub fn batch_add_experts(env: Env, experts: Vec) -> Result<(), RegistryError> { contract::batch_add_experts(env, experts) } - + + /// Batch ban experts and revoke their verification status (Admin only) + pub fn batch_ban_experts(env: Env, experts: Vec) -> Result<(), RegistryError> { + contract::batch_ban_experts(env, experts) + } + /// Add an expert to the whitelist (Admin only) pub fn add_expert(env: Env, expert: Address) -> Result<(), RegistryError> { contract::verify_expert(&env, &expert)