Solidity Scanner Skill

SkillSecurity

Use when the user wants to audit Solidity smart contracts for security vulnerabilities, scan EVM-compatible contracts for reentrancy, oracle manipulation, access-control, or flash-loan issues, review DeFi protocols on Ethereum, Arbitrum, Optimism, Base, Polygon, or BSC, or generate security audit reports for smart contract deployments.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Solidity Scanner Skill skill

What this skill tells your AI

The instructions your AI receives, as published by 0x-shashi/web3-audit-skills in skills/solidity-scanner/SKILL.md and read by ahel’s review.

Purpose

Analyze Solidity smart contracts for security vulnerabilities across all EVM-compatible chains. This is the primary scanner for the most widely-deployed smart contract language, covering DeFi, NFTs, governance, bridges, and all Ethereum-ecosystem protocols.

Supported Chains

ChainEVM CompatibilityKey Differences
EthereumFullBaseline — all patterns apply
ArbitrumFullL2 sequencer risk, block.number returns L1 block, gas pricing differs
Optimism / BaseFullL2 sequencer risk, TIMESTAMP from L1, cross-domain messaging
PolygonFullDifferent gas token (MATIC), PoS consensus, reorg risk higher
BSCFullLower gas costs enable different attack economics
AvalancheFullSubnet awareness, different finality model
ScrollFullzkEVM — some precompile differences
LineaFullzkEVM — some opcode cost differences
zkSync EraPartialDifferent address derivation, no SELFDESTRUCT, custom deployment model
BlastFullNative yield — WETH.balance() increases, rebasing assumptions

Chain-Specific Audit Considerations

When auditing for a specific chain, check these additional concerns:

Arbitrum/Optimism:
  ├── Sequencer downtime → oracle stale price risk
  ├── L1-to-L2 message delay → bridge timing attacks
  └── block.number semantics differ from L1

zkSync Era:
  ├── msg.value behaves differently in system contracts
  ├── Contract deployment uses CREATE2-like hash, not CREATE
  ├── Some opcodes unavailable or priced differently
  └── Native account abstraction changes tx.origin semantics

Blast:
  ├── ETH and USDB are rebasing tokens by default
  ├── Protocol must explicitly configure yield mode
  └── balanceOf(address) can change between transactions without transfers

Detection Capabilities

Critical / High Severity

CategorySpecific PatternsDetection Method
ReentrancyClassic single-function, cross-function, cross-contract, read-only, ERC777 callback, ERC721 callbackState write after external call analysis
Access controlMissing modifiers, tx.origin auth, unprotected initialize(), unprotected selfdestruct, privilege escalationPublic/external function modifier scan
Unsafe external callsUnchecked transfer() return, unchecked low-level call, unchecked approve(), USDT non-standard behaviorReturn value tracking
Oracle manipulationUniswap V2/V3 spot price, missing Chainlink staleness check, reserve-based pricing, circular pricingOracle usage pattern matching
Flash loan vectorsBalance-based pricing, single-tx manipulation, donation attacksBalance-as-input detection
Proxy vulnerabilitiesUninitialized impl, storage collision, missing _disableInitializers(), UUPS auth bypassProxy pattern recognition

Medium Severity

CategorySpecific PatternsDetection Method
Integer issuesUnsafe downcast, truncation on assignment, rounding errors in share math, first depositor inflationSafeCast absence, division analysis
Token handlingFee-on-transfer incompatibility, rebasing token assumption, non-standard decimals, approve race conditionToken interaction pattern scan
MEV exposureMissing deadline, missing slippage protection, sandwich vulnerability, permit front-runningSwap/router call analysis
CentralizationUntimelocked admin powers, excessive owner privileges, upgradeable without governanceAdmin function audit
Signature issuesMissing nonce, missing chainId, missing deadline, ecrecover zero-address, malleable signaturesSignature verification scan
DoS vectorsUnbounded loops, external call revert in batch, force-sent ETH breaking balance checksLoop and batch analysis

Low / Informational

CategorySpecific Patterns
Gas optimizationStorage vs memory, redundant SLOADs, unchecked math for bounded loops, calldata vs memory
Code qualityMissing events, missing NatSpec, unused variables, floating pragma, unlocked compiler
Best practicesblock.timestamp dependency, missing zero-address checks, magic numbers, missing error messages

Compiler Version Awareness

Solidity VersionKey Security Considerations
< 0.8.0No built-in overflow protection — check for SafeMath usage
0.8.0–0.8.12Built-in overflow but unchecked blocks bypass it — audit all unchecked usage
0.8.13–0.8.14ABI encoder bug with nested arrays (fixed in 0.8.15)
0.8.15–0.8.19Optimizer bug with Yul code (fixed in 0.8.20)
0.8.20+Default EVM target = Shanghai (PUSH0) — may not deploy on all L2s
0.8.24+Transient storage (TSTORE/TLOAD) available — new reentrancy guard patterns
0.8.26+Custom storage layouts, event errors in interfaces

Workflows

WorkflowDurationBest ForLink
Quick Scan15–20 minTriage, contest warm-up, initial assessmentquick-scan.md
Comprehensive Audit3–5 daysProtocol launch, client engagement, major upgradecomprehensive-audit.md
Competitive Audit8–16 hoursCode4rena, Sherlock, CodeHawks contestscompetitive-audit.md

Resources

ResourcePurposeLink
Vulnerability PatternsComplete pattern catalog with code examplesvulnerability-patterns.md
Severity GuideClassification criteria with decision treeseverity-guide.md
Tool ConfigsSlither, Aderyn, Mythril, Semgrep setuptool-configs.md
False PositivesCommon FPs with reasoning for eachfalse-positives.md
Foundry Security10 vulnerability categories with Foundry PoC testsfoundry-security.md
Foundry TestingFuzz, invariant, fork, differential testing guidefoundry-testing.md
Foundry Cheatcodes150+ cheatcodes reference for security auditorsfoundry-cheatcodes.md
Gas & SecurityGas optimization patterns with security trade-offsgas-security.md
Foundry CI/CDGitHub Actions for automated security testingfoundry-ci-cd.md

Standard Audit Procedure

1. Load Solidity contract(s) and note compiler version
2. Map inheritance tree and external dependencies
3. Identify protocol type (DeFi, NFT, governance, bridge, etc.)
4. Select workflow based on engagement type
5. Run static analysis tools (Slither → Aderyn → Mythril)
6. Execute manual review per methodology
7. Classify each finding with severity guide
8. Run variant analysis on confirmed findings
9. Generate structured report

Integration with Other Skills

SkillHow Solidity Scanner Uses It
methodology/Provides the audit methodology framework (phases, timing, approach)
severity/Classifies each finding into Critical/High/Medium/Low
scoring/Scores overall protocol security posture
checklists/Protocol-specific security checklists (ERC-20, vault, AMM, etc.)
patterns/Vulnerability pattern database for cross-reference
variant-analysis/When one bug is found, hunt for all variants
static-analysis/Tool configuration and integration
exploit-forensics/Real-world exploit case studies for pattern awareness
fix-review/Verify proposed fixes after initial audit
differential-review/Compare upgraded contract versions
chain-guides/Chain-specific considerations when target != Ethereum mainnet

Error Code Reference

Common Solidity/EVM error selectors and revert reasons encountered during audits. Use a selector decoder like openchain.xyz or 4byte.directory to identify unknown selectors.

OpenZeppelin Standard Errors

Error SelectorError SignatureMeaning
0xe450d38cERC20InsufficientBalance(address,uint256,uint256)Token balance too low for transfer
0xfb8f41b2ERC20InsufficientAllowance(address,uint256,uint256)Allowance too low for transferFrom
0x118cdaa7OwnableUnauthorizedAccount(address)Caller is not the owner
0x1e4fbdf7OwnableInvalidOwner(address)Invalid owner address (e.g., zero address)
0xe602df05ERC20InvalidApprover(address)Invalid address for approve
0x94280d62ERC20InvalidReceiver(address)Invalid receiver (zero address)
0xd93c0665EnforcedPause()Contract is paused
0x8dfc202bExpectedPause()Contract is NOT paused (expected to be)
0xa9fbf51fAccessControlUnauthorizedAccount(address,bytes32)Missing role for access control
0xd92e233dZeroAddress()Zero address provided where not allowed

ERC Standard Errors

Error SelectorError SignatureMeaning
0x7e273289ERC721NonexistentToken(uint256)Token ID does not exist
0x177e802fERC721InsufficientApproval(address,uint256)Not approved for token operation
0x64283d7bERC721IncorrectOwner(address,uint256,address)Token not owned by expected address
0xf0dd15fdERC4626ExceededMaxDeposit(address,uint256,uint256)Deposit exceeds vault max
0x936941fcERC4626ExceededMaxRedeem(address,uint256,uint256)Redeem exceeds vault max

Common Revert Reasons (String)

Revert StringTypical SourceAudit Significance
"ReentrancyGuard: reentrant call"OpenZeppelin ReentrancyGuardGuard is active — check if all entry points are protected
"Initializable: contract is already initialized"OZ proxy initializerRe-initialization attempt — check _disableInitializers()
"Address: low-level call failed"OZ Address libraryExternal call failure — check error handling
"SafeERC20: low-level call failed"OZ SafeERC20Token transfer failure — may indicate non-standard token
"Pausable: paused" / "Pausable: not paused"OZ PausablePause state mismatch — check centralization risk
"ECDSA: invalid signature"OZ ECDSASignature verification failed — check for malleable sigs
"ERC20: transfer amount exceeds balance"OZ ERC20 (pre-custom-errors)Insufficient balance — older OZ version indicator

Proxy-Related Errors

Error SelectorError SignatureMeaning
0xb398979fERC1967InvalidImplementation(address)Invalid implementation address for proxy
0x4c9c8ce3ERC1967InvalidAdmin(address)Invalid admin address for transparent proxy
0x7e2732890ERC1967NonPayable()Proxy received ETH when not expected
0xf92ee8a9InvalidInitialization()OZ v5 Initializable — already initialized
0xd7e6bcf8NotInitializing()OZ v5 Initializable — not in initializing state

Troubleshooting

IssueLikely CauseSolution
Scanner loads generic patterns instead of Solidity-specificTrigger phrases not matching the Solidity scannerVerify triggers field in frontmatter matches user query; check TRIGGERS.md mapping
False positives on unchecked blocksScanner flags all unchecked math as unsafeCheck Solidity version — 0.8.x+ has built-in overflow; unchecked in bounded loops is safe
Missed reentrancy in cross-contract callsScanner only checks single-function reentrancyEnable cross-contract analysis mode; load patterns/ for read-only reentrancy patterns
Oracle manipulation not detectedProtocol uses custom oracle not matching known patternsManually check any balanceOf() or reserve-based pricing; add custom oracle pattern
L2-specific issues not flaggedChain-specific guide not loadedLoad the appropriate chain-guides/ file for the target L2 before scanning
Proxy storage collision missedScanner doesn't map storage layouts across proxy/implUse differential-review/ skill to compare storage layouts; check for _gap variables
Too many low-severity findingsScanning in paranoid modeSwitch to "Standard" scan profile; filter informational findings for final report

Signals

GitHub stars
60
Forks
10
Last commit
Feb 2026
Advanced
Catalog kind
skill
Gateway key
solidity-scanner
Source
github.com/0x-shashi/web3-audit-skills