From 289def4fa18ad8be7df90098cf00b95f2fdbcbb9 Mon Sep 17 00:00:00 2001 From: gbengaeben Date: Thu, 27 Aug 2026 16:45:00 +0000 Subject: [PATCH] test(staking): cover non-admin rejection of set_slashing_coordinator set_slashing_coordinator was only exercised as the admin in test setup; its admin-gated auth was never asserted. Add a test confirming a non-admin caller is rejected with Unauthorized, and that after the admin sets the coordinator, the coordinator can slash a validator and the slash reduces self-stake. Closes #1029 --- contracts/staking/src/tests.rs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/contracts/staking/src/tests.rs b/contracts/staking/src/tests.rs index 5678f53d6..220492737 100644 --- a/contracts/staking/src/tests.rs +++ b/contracts/staking/src/tests.rs @@ -596,6 +596,31 @@ mod tests { assert_eq!(r2.amount, 20_000u128 * (100 - SLASH_PERCENT) / 100); } + #[ink::test] + fn set_slashing_coordinator_non_admin_fails() { + let accounts = default_accounts(); + set_caller(accounts.alice); + let mut staking = Staking::new(500, 1_000); + + // A non-admin caller cannot configure who is allowed to slash. + set_caller(accounts.bob); + assert_eq!( + staking.set_slashing_coordinator(accounts.bob), + Err(Error::Unauthorized) + ); + + // Admin can still set it afterwards, and the coordinator can then slash. + set_caller(accounts.alice); + staking.set_slashing_coordinator(accounts.bob).unwrap(); + + set_caller(accounts.bob); + staking.register_validator(MIN_VALIDATOR_STAKE, 500).unwrap(); + staking.slash_validator(accounts.bob).unwrap(); + let info = staking.get_validator_info(accounts.bob).unwrap(); + let expected = MIN_VALIDATOR_STAKE * (100 - SLASH_PERCENT) / 100; + assert_eq!(info.self_stake, expected); + } + #[ink::test] fn total_delegated_stake_consistency() { let mut staking = create_staking();