Tool: Aderyn
Report file: doc/security/audits/tools/aderyn-report.md
Assessment date: 2026-05-05
| ID | Finding | Tool Severity | Assessment | Decision |
|---|---|---|---|---|
| L-1 | Centralization Risk | Low | Valid observation of privileged governance model | Accepted by design |
| L-2 | Unspecific Solidity Pragma | Low | Intentional library-style pragma with pinned compiler in tooling | Accepted by design |
| L-3 | PUSH0 Opcode | Low | Not applicable for configured target EVM | Accepted by design |
| L-4 | Modifier Invoked Only Once | Low | Style heuristic; modifier supports hook pattern consistency | Accepted by design |
| L-5 | Empty Block | Low | Expected for hook overrides where modifier carries logic | Accepted by design |
| L-6 | Loop Contains require/revert |
Low | Required for atomicity in setRules |
Accepted by design |
| L-7 | Costly operations inside loop | Low | Storage writes are intrinsic to rule registration | Accepted by design |
| L-8 | Unchecked Return | Low | _grantRole return not security-relevant in constructor flow |
Accepted by design |
No High findings were reported.
This contract family is explicitly administrative compliance infrastructure. RuleEngine (RBAC), RuleEngineOwnable, and RuleEngineOwnable2Step intentionally expose privileged operations for rule and token binding governance. This is a product requirement, not a vulnerability.
^0.8.20 is intentional for integrator compatibility. Build tooling remains pinned (Solc 0.8.34). This is a common and acceptable pattern for reusable contract packages.
The project target is modern EVM (prague). PUSH0 compatibility concerns only pre-Shanghai targets; those are outside the supported deployment matrix.
onlyRulesLimitManager being used once is not a risk. It preserves the same extensible access-control abstraction used across modules and variants.
Empty bodies in _onlyComplianceManager, _onlyRulesManager, and _onlyRulesLimitManager are intentional. Authorization executes in the modifier, and the empty body enforces a clean virtual-hook architecture.
setRules must be all-or-nothing. Reverting on invalid element prevents partial updates and inconsistent policy state.
EnumerableSet.add in a loop is unavoidable for persistent rule set updates. Cost scales with rule count and is an operator-controlled admin path.
Ignoring _grantRole return in constructor is acceptable; no exploitable path is introduced, and constructor semantics do not depend on that boolean.
All Aderyn findings are either design tradeoffs or static-analysis style heuristics. No code changes are required based on this report.