Overview
Several production (non-test) contract files panic or unwrap on data that may legitimately be absent:
contracts/src/access_control.rs:79-82 — panic!("Caller does not have Admin role") etc. instead of returning an error (reverts burn all gas for the caller)
contracts/src/access_control.rs:34,53,68 — roles.get(i).unwrap()
contracts/src/analyticsStorage.rs:71,107,134,148,187-188,203 — unwrap() on vector indexing
In Soroban, panics revert the transaction and waste the entire submission fee; a panic in an admin-check path also bricks governance operations for everyone. Unwraps on Vec::get should be require!(...) or ok_or(...)? with clear error codes.
Evidence
contracts/src/access_control.rs — panics in require_role-style logic
contracts/src/analyticsStorage.rs — multiple .unwrap()
Acceptance Criteria
Files to Modify
contracts/src/access_control.rs
contracts/src/analyticsStorage.rs
Priority: High
Overview
Several production (non-test) contract files panic or unwrap on data that may legitimately be absent:
contracts/src/access_control.rs:79-82—panic!("Caller does not have Admin role")etc. instead of returning an error (reverts burn all gas for the caller)contracts/src/access_control.rs:34,53,68—roles.get(i).unwrap()contracts/src/analyticsStorage.rs:71,107,134,148,187-188,203—unwrap()on vector indexingIn Soroban, panics revert the transaction and waste the entire submission fee; a panic in an admin-check path also bricks governance operations for everyone. Unwraps on
Vec::getshould berequire!(...)orok_or(...)?with clear error codes.Evidence
contracts/src/access_control.rs— panics inrequire_role-style logiccontracts/src/analyticsStorage.rs— multiple.unwrap()Acceptance Criteria
require!/error returns (or#[contracterror]variants).unwrap()on vector lookups with checked access and contract errorsErrinstead of panickingFiles to Modify
contracts/src/access_control.rscontracts/src/analyticsStorage.rsPriority: High