Comprehensive Solidity smart contract security audit skill. Activates when auditing, reviewing, or assessing EVM smart contracts for vulnerabilities. Covers reentrancy, access control, oracle manipulation, flash loans, MEV, weird tokens, and protocol-specific risks. Includes 100+ item checklist, severity rubric, and real exploit examples.
Systematically audit Solidity smart contracts for security vulnerabilities using a structured methodology that combines:
Objective: Understand what you're auditing before looking for bugs.
Scope Definition
Architecture Mapping
Documentation Review
Output: Architecture diagram, entry point list, role map
Objective: Catch low-hanging fruit automatically.
Run Slither
slither . --print human-summary
slither . --print contract-summary
slither .
Check Compiler Warnings
forge build --force 2>&1 | grep -i warning
Run Additional Detectors
slither-check-erc for token conformanceslither-check-upgradeability for proxiesOutput: Slither report, triaged findings
Objective: Find bugs that tools miss.
See: resources/checklist.md for full 100+ item checklist
Objective: Confirm findings with evidence.
Write PoC Tests
Test Edge Cases
forge test --match-contract Exploit -vvvv
Fuzz Critical Functions
forge test --match-test testFuzz
Objective: Communicate findings clearly.
See: resources/report-template.md
| Severity | Criteria |
|---|---|
| Critical | Direct loss of funds, no user action required |
| High | Loss of funds with user action, or protocol insolvency |
| Medium | Conditional loss, or significant protocol disruption |
| Low | Minor issues, best practice violations |
| Informational | Gas optimizations, code quality |
See: resources/severity.md for detailed rubric
// VULNERABLE
function withdraw() external {
uint amount = balances[msg.sender];
(bool success,) = msg.sender.call{value: amount}("");
balances[msg.sender] = 0; // State change AFTER external call
}
// FIXED: CEI Pattern
function withdraw() external {
uint amount = balances[msg.sender];
balances[msg.sender] = 0; // State change BEFORE
(bool success,) = msg.sender.call{value: amount}("");
}
// VULNERABLE
function setPrice(uint _price) external {
price = _price; // Anyone can call!
}
// FIXED
function setPrice(uint _price) external onlyOwner {
price = _price;
}
// VULNERABLE: Spot price
uint price = pair.getReserves().reserve0 / pair.getReserves().reserve1;
// FIXED: TWAP
uint price = oracle.consult(token, 1e18, 30 minutes);
See: resources/exploits/ for real-world examples
resources/protocols/lending.mdresources/protocols/amm.mdresources/protocols/staking.mdresources/protocols/governance.mdresources/protocols/bridges.mdReal exploits with root cause analysis:
resources/exploits/reentrancy.md (DAO, Cream, Fei)resources/exploits/oracle.md (Harvest, Mango)resources/exploits/flash-loan.md (Euler, bZx)resources/exploits/access-control.md (Parity, Ronin)resources/exploits/logic-bugs.md (Nomad, Wormhole)For full Foundry reproductions, see:
submodules/DeFiHackLabs/submodules/learn-evm-attacks/| Rationalization | Why It's Wrong |
|---|---|
| "Slither found nothing, must be safe" | Slither misses ~60% of bugs (logic, economic) |
| "It's audited by X firm" | Audits miss bugs; multiple reviews are better |
| "No reentrancy guard but CEI is followed" | Check ALL functions, not just the obvious ones |
| "Only admin can call this" | Admin keys get compromised; assume adversarial |
| "This is standard OpenZeppelin code" | Integration bugs happen at the seams |
| "Low probability, won't happen" | If profitable, attackers WILL find it |
Provide me with:
I'll follow this methodology systematically.