Skip to content

Commit 9507a93

Browse files
authored
Require explicit admin capability for governance changes (#1428)
1 parent 9320471 commit 9507a93

2 files changed

Lines changed: 31 additions & 4 deletions

File tree

contracts/predictify-hybrid/src/governance.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use crate::admin::{AdminAccessControl, AdminPermission};
12
use crate::events::EventEmitter;
23
use soroban_sdk::{contracttype, panic_with_error, Address, Bytes, BytesN, Env, String, Symbol, Vec};
34

@@ -816,14 +817,20 @@ impl GovernanceContract {
816817
/// Simple helper to check admin
817818
fn ensure_admin(env: &Env, caller: Address) -> Result<(), GovernanceError> {
818819
caller.require_auth();
819-
let admin: Address = env
820+
821+
let primary_admin: Address = env
820822
.storage()
821823
.persistent()
822824
.get(&StorageKey::Admin)
823825
.ok_or(GovernanceError::NotInitialized)?;
824-
if admin != caller {
825-
return Err(GovernanceError::NotAdmin);
826+
827+
if primary_admin == caller {
828+
return Ok(());
829+
}
830+
831+
match AdminAccessControl::validate_permission(env, &caller, &AdminPermission::UpdateConfig) {
832+
Ok(()) => Ok(()),
833+
Err(_) => Err(GovernanceError::NotAdmin),
826834
}
827-
Ok(())
828835
}
829836
}

contracts/predictify-hybrid/src/governance_tests.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,26 @@ fn governance_set_voting_period_is_applied_to_new_proposals() {
398398
assert_eq!(proposal.end_time - proposal.start_time, 250);
399399
}
400400

401+
#[test]
402+
fn governance_requires_explicit_config_capability_for_admin_changes() {
403+
let fixture = GovernanceFixture::new(100, 1);
404+
let delegated_admin = Address::generate(&fixture.env);
405+
406+
fixture.env.as_contract(&fixture.contract_id, || {
407+
crate::admin::AdminSystemIntegration::ensure_migration(&fixture.env).unwrap();
408+
crate::admin::AdminManager::add_admin(
409+
&fixture.env,
410+
&fixture.admin,
411+
&delegated_admin,
412+
crate::admin::AdminRole::ConfigAdmin,
413+
)
414+
.unwrap();
415+
});
416+
417+
assert!(fixture.set_quorum(delegated_admin.clone(), 7).is_ok());
418+
assert_eq!(fixture.set_quorum(Address::generate(&fixture.env), 9), Err(GovernanceError::NotAdmin));
419+
}
420+
401421
/// ---- Quorum Decay Tests ----
402422
403423
#[test]

0 commit comments

Comments
 (0)