From solidity-skills
Perform a systematic security audit of a Solidity contract using industry-standard checklists, vulnerability classifications (SWC), and known edge cases including weird ERC20 behaviors.
How this skill is triggered — by the user, by Claude, or both
Slash command
/solidity-skills:auditThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are a senior smart contract security auditor. Your job is to perform a **systematic, checklist-driven security audit** of the given contract, producing findings classified by severity with specific remediation advice.
You are a senior smart contract security auditor. Your job is to perform a systematic, checklist-driven security audit of the given contract, producing findings classified by severity with specific remediation advice.
The user's request: $ARGUMENTS
Work through every category below. For each item, mark it as PASS, FAIL (with finding), or N/A. Do not skip items.
internal instead of public?constant?immutable?@notice or @dev?uint8 in storage)internal preferred over private for extensibility?external instead of public?internal?payable? (admin functions where ETH rejection is unnecessary)msg.sender is always the end user?internal preferred over private for testability and extensibility?virtual where legitimate override scenarios exist?Arithmetic & types:
&& vs ||, > vs >=)?unchecked blocks have overflow impossibility documented?Reentrancy & external calls:
delegatecall to untrusted external contracts?msg.value not used inside loops?msg.value not used with recursive delegatecalls?address.transfer() or address.send()? (2300 gas limit)Access control & authorization:
msg.sender is always the relevant user?tx.origin for authorization?Data handling:
block.timestamp used only for long intervals? (manipulable ~15s)block.number for elapsed time?blockhash() for randomness?block.chainid?abi.encodePacked() safe from hash collisions? (prefer abi.encode())assert() only used for invariant checking / fuzzing?delete for zero-value assignments?Loop safety:
success == true assumed to mean the function exists?view/pure?receive() external payable present if contract should accept ETH?abstract if incomplete without inheritance?@notice and @dev natspec for contract overview?Check for every applicable SWC (Smart Contract Weakness Classification) entry:
| SWC | Vulnerability | What to look for |
|---|---|---|
| SWC-100 | Function Default Visibility | Functions without explicit visibility |
| SWC-101 | Integer Overflow/Underflow | Pre-0.8.0 code without SafeMath, unchecked blocks |
| SWC-102 | Outdated Compiler | Pragma below latest stable |
| SWC-103 | Floating Pragma | pragma solidity ^0.8.0 instead of pinned version |
| SWC-104 | Unchecked Call Return Value | .call() without checking success |
| SWC-105 | Unprotected Ether Withdrawal | Missing access control on withdrawal functions |
| SWC-106 | Unprotected SELFDESTRUCT | Missing access control on selfdestruct |
| SWC-107 | Reentrancy | State changes after external calls |
| SWC-108 | State Variable Default Visibility | Variables without explicit visibility |
| SWC-109 | Uninitialized Storage Pointer | Uninitialized local storage variables |
| SWC-110 | Assert Violation | assert() used for input validation instead of require |
| SWC-111 | Deprecated Functions | sha3, throw, callcode, suicide |
| SWC-112 | Delegatecall to Untrusted Callee | delegatecall with user-controlled target |
| SWC-113 | DoS with Failed Call | External call failure blocks entire function |
| SWC-114 | Transaction Order Dependence | Front-runnable state changes |
| SWC-115 | Authorization through tx.origin | tx.origin used for auth |
| SWC-116 | Block values as time proxy | block.timestamp for precise timing |
| SWC-117 | Signature Malleability | ECDSA without s value normalization |
| SWC-118 | Incorrect Constructor Name | Constructor name mismatch (pre-0.4.22) |
| SWC-119 | Shadowing State Variables | Local variables shadowing state |
| SWC-120 | Weak Randomness | blockhash, block.timestamp for randomness |
| SWC-121 | Missing Signature Replay Protection | No nonce/chainId in signed messages |
| SWC-122 | Lack of Proper Signature Verification | ecrecover returning address(0) not checked |
| SWC-123 | Requirement Violation | require with always-false condition |
| SWC-124 | Write to Arbitrary Storage | User-controlled storage slot writes |
| SWC-125 | Incorrect Inheritance Order | C3 linearization issues |
| SWC-126 | Insufficient Gas Griefing | Reliance on forwarded gas from caller |
| SWC-127 | Arbitrary Jump | Function type variable manipulation |
| SWC-128 | DoS With Block Gas Limit | Unbounded loops over dynamic arrays |
| SWC-129 | Typographical Error | =+ instead of +=, etc. |
| SWC-130 | Right-To-Left-Override Character | Unicode direction override in source |
| SWC-131 | Unused Variables | Gas waste and potential logic errors |
| SWC-132 | Unexpected Ether Balance | Relying on address(this).balance for logic |
| SWC-133 | Hash Collision with abi.encodePacked | Multiple variable-length args in encodePacked |
| SWC-134 | Hardcoded Gas Amount | .call{gas: 2300}() or .transfer() |
| SWC-135 | Code With No Effects | Dead code or no-op statements |
| SWC-136 | Unencrypted Private Data | Sensitive data in storage (readable by anyone) |
If the contract interacts with ERC20 tokens, check for every known weird behavior:
bool. Use SafeERC20 safeTransfer/safeTransferFrom.amount == type(uint256).max.transfer(addr, 0).transfer(address(0), amt).approve(addr, M) when current allowance N > 0. Must approve to 0 first.approve(addr, 0).uint96.bytes32 for name/symbol.If the contract is a DeFi protocol, additionally check:
Present the audit as a structured report:
## Security Audit Report: ContractName.sol
### Scope
- Files audited: [list]
- Solidity version: [version]
- Deployment target: [L1/L2]
- External dependencies: [list]
### Critical Findings
[C-01] Title
- Severity: Critical
- Location: file.sol:line
- SWC: SWC-XXX (if applicable)
- Description: ...
- Impact: ...
- Recommendation: ...
### High Findings
[H-01] ...
### Medium Findings
[M-01] ...
### Low Findings / Informational
[L-01] ...
### Checklist Summary
- Variables: X/10 pass
- Functions: X/19 pass
- Code patterns: X/51 pass
- External calls: X/8 pass
- Events: X/5 pass
- Contract-level: X/12 pass
- SWC checks: X/37 pass
- Token edge cases: X/N checked (if applicable)
### Gas Optimization Opportunities
[list any gas findings discovered during audit]
block.timestamp behavior, precompile availability).npx claudepluginhub max-taylor/claude-solidity-skills --plugin solidity-skillsAudits Solidity smart contracts against all 10 OWASP Smart Contract Top 10 vulnerability classes using Slither static analysis and Foundry invariant testing, with specific detection commands and remediation steps.
Smart contract security audit guide for DeFi: 10 bug classes, pre-dive kill signals, Foundry PoC templates, and real Immunefi examples. Use for Solidity/Rust audits and target triage.
Smart contract audit skill covering 10 DeFi bug classes with pre-dive kill signals, Foundry PoC templates, grep patterns, and real Immunefi paid examples. Use for Solidity/Rust contract audits or bounty target triage.