solidity-code-review
Solidity Code Review Guide
When to Apply
Apply this methodology when performing a security audit, peer review, or general assessment of Solidity smart contracts. It is designed to identify vulnerabilities, ensure adherence to best practices, and verify the robustness of the contract logic.
Pre-Review Checklist
Before beginning the manual review, ensure the following items are addressed:
- Compilation: Verify the code compiles without errors using the project's build system (Foundry, Hardhat, etc.).
- Test Suite: Run the existing test suite. Ensure tests pass and review coverage reports to identify untested logic.
- Dependencies: Identify all external libraries and inherited contracts. Verify versions are pinned and trusted.
- Documentation: Review technical specifications and NatSpec comments to understand intended behavior.
- Known Issues: Check for previous audit reports or documented "known risks" provided by the developers.
- Scope: Define the exact list of contracts and functions that are within the audit scope.
Review Methodology
- Step 1: Scope & Architecture: Map out the contract inheritance, external dependencies, and system architecture.
- Step 2: Manual Line-by-Line Review: Perform a deep dive into critical functions, focusing on state changes and value transfers.
- Step 3: Automated Analysis: Run static analysis tools (Slither, Aderyn, Solhint) to catch common patterns and style violations.
- Step 4: Vulnerability Pattern Matching: Specifically check for known SCWE patterns (Reentrancy, Access Control, etc.).
- Step 5: Integration & Edge Cases: Analyze how contracts interact and test boundary conditions (e.g., zero values, max integers).
Severity Classification
| Severity | Criteria | Examples |
|---|---|---|
| Critical | Direct loss of funds, permanent contract lock, or total compromise. | Reentrancy, Unprotected withdraw, Logic error in transfer. |
| High | Significant impact on system functionality or exploitable under realistic conditions. | Access control bypass, Unchecked external calls, Oracle manipulation. |
| Medium | Limited impact or requires specific, difficult-to-achieve conditions. | Timestamp dependence, Front-running, Denial of Service (DoS). |
| Low | Best practice violations, informational findings, or minor optimizations. | Missing events, Floating pragma, Unused variables. |
Key Inspection Areas
Access Control & Authorization
- Verify
onlyOwneror role-based access on all sensitive state-changing functions. - Ensure initializers are protected and can only be called once.
- Check for
tx.originusage instead ofmsg.sender.
External Call Safety
- Follow the Check-Effects-Interactions (CEI) pattern strictly.
- Use
call()instead oftransfer()orsend()for ETH transfers. - Handle return values of all external calls.
State Management & Reentrancy
- Use
ReentrancyGuardfor functions making external calls. - Check for cross-contract reentrancy where state is shared.
- Ensure state variables are updated before external interactions.
Arithmetic & Type Safety
- For Solidity <0.8.0, ensure
SafeMathis used. - Check for precision loss in divisions (multiply before dividing).
- Verify safe casting between types (e.g.,
uint256touint8).
Token Handling (ERC20/721)
- Use
SafeERC20fortransferandtransferFrom. - Account for "fee-on-transfer" tokens if applicable.
- Verify
approverace condition handling.
Upgrade Mechanisms
- Check for storage gaps in logic contracts to prevent collisions.
- Ensure logic contracts do not use
selfdestructordelegatecall. - Verify the proxy admin has restricted access.
Event Emissions
- Emit events for all significant state changes (ownership, parameters, transfers).
- Use
indexedparameters for efficient off-chain filtering.
NatSpec Documentation
- Ensure
@notice,@param, and@returnare accurate. - Use
@devto document complex logic or security assumptions.
Style Guide Compliance
- Code follows the official Solidity style guide conventions.
- Naming conventions: PascalCase (contracts), camelCase (functions), UPPER_CASE (constants).
- Function ordering: by visibility (external → public → internal → private), then by mutability (state-changing → view → pure) within each group.
- Function modifier order: visibility, mutability, virtual, override, custom.
- See the Solidity Style Guide Reference for the full checklist.
Reporting Format
Findings should be documented using the following template:
[SEVERITY] Finding Title
ID: SCWE-XXX (replace with actual SCWE ID, e.g., SCWE-046 — see search_vulnerabilities)
Location: ContractName.sol:L42
Description: Detailed explanation of the vulnerability and how it can be triggered.
Impact: What happens if this is exploited (e.g., "User funds can be stolen").
Remediation: Specific code changes or architectural adjustments to fix the issue.
Enhanced with MCP
When using the solidity-agent-toolkit, leverage these tools in a structured review workflow:
Step 1 — Static Analysis:
run_slither— Comprehensive static analysis with SCWE-mapped findingsrun_aderyn— Fast Rust-based vulnerability scannerrun_solhint— Linting and style enforcement
Step 2 — Pattern Detection:
match_vulnerability_patterns— Regex-based detection of 32+ common vulnerability patterns
Step 3 — Vulnerability Lookup:
search_vulnerabilities— Search the OWASP SCWE database by keywordget_remediation— Get specific fix guidance with code examples for any SCWE IDcheck_vulnerability— Check if code matches a known SCWE pattern
Step 4 — Style & Quality:
check_style— Automated Solidity style guide compliance (12 rules)format_code— Auto-format Solidity codevalidate_natspec— Verify NatSpec documentation completeness
Step 5 — Full Audit:
- Use the
security_auditprompt for a structured, guided audit process - Use the
code_reviewprompt for comprehensive code quality assessment
References
More from whackur/solidity-agent-toolkit
solidity-hardhat-development
Hardhat 3 development workflow for Solidity smart contracts. Use when building, testing, or deploying with Hardhat 3.x (hardhat, ignition, EDR). Covers ESM-first project setup, defineConfig, Solidity-native tests, TypeScript tests, multichain support, Hardhat Ignition deployment, and hook-based plugin system. Triggers on tasks involving hardhat init, hardhat build, hardhat test, hardhat ignition, or Hardhat-based Solidity development.
37solidity-foundry-development
Foundry development workflow for Solidity smart contracts. Use when building, testing, or deploying with Foundry (forge, cast, anvil). Covers project setup, foundry.toml configuration, testing patterns, fuzz testing, invariant testing, fork testing, cheatcodes, deployment scripts, and debugging. Triggers on tasks involving forge build, forge test, forge script, cast, anvil, or Foundry-based Solidity development.
31solidity-security-best-practices
Smart contract security best practices for Solidity development. Use when writing, reviewing, or auditing Solidity code. Covers reentrancy prevention, access control patterns, safe external calls, input validation, upgrade safety, and OWASP Smart Contract Top 10 vulnerabilities. Triggers on tasks involving security, vulnerability detection, access control, CEI pattern, ReentrancyGuard, SafeERC20, or smart contract auditing.
27solidity-gas-optimization
Gas optimization patterns for Solidity smart contracts. Use when optimizing contract deployment costs, runtime gas usage, or storage efficiency. Covers storage packing, custom errors, immutable variables, calldata optimization, loop patterns, assembly usage, and Solady gas-optimized alternatives. Triggers on tasks involving gas optimization, storage layout, deployment cost reduction, or EVM efficiency.
19solidity-erc-standards
ERC token standard implementation guidelines for Solidity. Use when implementing, extending, or reviewing ERC20, ERC721, ERC1155, or ERC4626 contracts. Covers interface compliance, common pitfalls, OpenZeppelin and Solady implementations, extension patterns, and testing strategies. Triggers on tasks involving token implementation, NFT contracts, vault standards, or ERC compliance.
18solidity-adversarial-analysis
Adversarial scenario analysis and threat modeling for Solidity smart contracts. Use when analyzing contracts from an attacker's perspective, identifying multi-step attack vectors, or performing threat modeling. Covers flash loan attacks, oracle manipulation, MEV/front-running, governance exploits, reentrancy scenarios, access control bypasses, economic logic exploits, and cross-contract composability risks. Triggers on tasks involving adversarial analysis, threat modeling, attack scenarios, attack vectors, exploit analysis, or red team review.
15