From c712aff1d0fa7926c9d0fd229f2deb101f24540b Mon Sep 17 00:00:00 2001 From: Alice Date: Mon, 30 Mar 2026 10:37:12 +0100 Subject: [PATCH] fix(access-control): replace initialize panic with typed ContractError Closes #166 - Add AlreadyInitialized = 2 to ContractError enum - Convert initialize() to return Result<(), ContractError> - Update test_double_initialize to assert Err(Ok(ContractError::AlreadyInitialized)) --- contracts/access-control/src/lib.rs | 6 ++++-- contracts/access-control/src/test.rs | 5 +++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/contracts/access-control/src/lib.rs b/contracts/access-control/src/lib.rs index f89ad36..573e1af 100644 --- a/contracts/access-control/src/lib.rs +++ b/contracts/access-control/src/lib.rs @@ -13,6 +13,7 @@ mod test; #[repr(u32)] pub enum ContractError { InvalidDidFormat = 1, + AlreadyInitialized = 2, } /// -------------------- @@ -73,15 +74,16 @@ impl AccessControl { /// /// # Arguments /// * `admin` - The admin address for the contract - pub fn initialize(env: Env, admin: Address) { + pub fn initialize(env: Env, admin: Address) -> Result<(), ContractError> { if env.storage().persistent().has(&DataKey::Admin) { - panic!("Contract already initialized"); + return Err(ContractError::AlreadyInitialized); } admin.require_auth(); env.storage().persistent().set(&DataKey::Admin, &admin); env.events() .publish((symbol_short!("init"), admin), symbol_short!("success")); + Ok(()) } /// Register a new entity in the system diff --git a/contracts/access-control/src/test.rs b/contracts/access-control/src/test.rs index 0b98a69..8cc734a 100644 --- a/contracts/access-control/src/test.rs +++ b/contracts/access-control/src/test.rs @@ -19,7 +19,6 @@ fn test_initialize() { } #[test] -#[should_panic(expected = "Contract already initialized")] fn test_double_initialize() { let env = Env::default(); env.mock_all_auths(); @@ -29,7 +28,9 @@ fn test_double_initialize() { let admin = Address::generate(&env); client.initialize(&admin); - client.initialize(&admin); // Should panic + + let result = client.try_initialize(&admin); + assert_eq!(result, Err(Ok(ContractError::AlreadyInitialized))); } #[test]