From c80a016c3d28d8b17a68e13310050cdce11cdfd6 Mon Sep 17 00:00:00 2001 From: AI Date: Fri, 28 Aug 2026 18:04:52 +0100 Subject: [PATCH] fix: amount precision and overflow in admin pause signer counting --- contracts/admin/src/pausable.rs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/contracts/admin/src/pausable.rs b/contracts/admin/src/pausable.rs index 6882306af..6faec2048 100644 --- a/contracts/admin/src/pausable.rs +++ b/contracts/admin/src/pausable.rs @@ -107,9 +107,12 @@ pub fn set_pause_signer(e: &Env, admin: &Address, signer: &Address, enabled: boo .instance() .get(&DataKey::PauseSignerCount) .unwrap_or(0); + let new_count = count + .checked_add(1) + .unwrap_or_else(|| panic_with_error!(e, ContractError::Overflow)); e.storage() .instance() - .set(&DataKey::PauseSignerCount, &count.saturating_add(1)); + .set(&DataKey::PauseSignerCount, &new_count); } } else if existing { e.storage().instance().remove(&key); @@ -118,24 +121,27 @@ pub fn set_pause_signer(e: &Env, admin: &Address, signer: &Address, enabled: boo .instance() .get(&DataKey::PauseSignerCount) .unwrap_or(0); + let new_count = count + .checked_sub(1) + .unwrap_or_else(|| panic_with_error!(e, ContractError::Overflow)); e.storage() .instance() - .set(&DataKey::PauseSignerCount, &count.saturating_sub(1)); + .set(&DataKey::PauseSignerCount, &new_count); let threshold: u32 = e .storage() .instance() .get(&DataKey::PauseThreshold) .unwrap_or(0); - let new_count: u32 = e + let current_count: u32 = e .storage() .instance() .get(&DataKey::PauseSignerCount) .unwrap_or(0); - if threshold > new_count { + if threshold > current_count { e.storage() .instance() - .set(&DataKey::PauseThreshold, &new_count); + .set(&DataKey::PauseThreshold, ¤t_count); } }