Why Every Solidity Developer Needs a Security Scanner
Smart contract vulnerabilities have caused billions of dollars in losses across DeFi. The DAO hack, the Parity wallet freeze, the Wormhole bridge exploit, countless flash loan attacks — each one exploited a bug that automated scanning could have flagged before deployment.
The problem is that most security audit firms charge $5,000 to $50,000+ per audit, with wait times measured in weeks. That puts professional security review out of reach for most developers, especially during active development when you need feedback the most.
The Solari Smart Contract Scanner solves this by providing free, instant vulnerability analysis directly in your browser. Paste your Solidity code, click scan, and get actionable results in seconds — no account creation, no API keys, no cost.
How the Free Solidity Scanner Works
The scanner uses pattern-based static analysis to identify known vulnerability classes in your Solidity source code. It parses your contract, maps control flow, and matches against a database of 20+ battle-tested vulnerability signatures.
Paste Your Code
Copy your Solidity smart contract source code into the editor. No file uploads, no build steps needed.
Instant Analysis
The scanner checks 20+ vulnerability patterns across 10 attack categories in under 5 seconds.
Get Your Report
Each finding includes severity level, affected line numbers, code context, and specific remediation guidance.
What Vulnerabilities Does It Detect?
The scanner covers the most exploited vulnerability classes in production smart contracts. Here are the 10 categories it checks, with specifics on what gets flagged.
Reentrancy Attacks
Detects external calls before state updates, cross-function reentrancy via shared state, and read-only reentrancy patterns. Catches the exact pattern that caused the DAO hack.
Access Control Flaws
Flags missing access modifiers on sensitive functions, unprotected initialize() functions, tx.origin authentication, and missing ownership checks on admin operations.
Oracle Manipulation
Identifies spot price dependencies, missing TWAP protections, single-source oracle reliance, and missing staleness checks on Chainlink price feeds.
Flash Loan Vectors
Spots price calculations vulnerable to single-block manipulation, unprotected liquidity pool ratios, and missing flash loan guards.
Token Handling Issues
Catches unsafe ERC-20 transfers (missing return value checks), fee-on-transfer token assumptions, rebasing token issues, and approval race conditions.
Signature Replay
Detects missing nonce tracking, missing chain ID in signed data, and ECDSA signatures without replay protection. Prevents cross-chain and same-chain replay attacks.
Denial of Service
Identifies unbounded loops over dynamic arrays, external calls in loops, block gas limit risks, and griefing vectors through selfdestruct or forced ether sends.
Proxy & Upgrade Issues
Flags storage collision risks, uninitialized implementation contracts, missing upgrade authorization checks, and function selector clashes in proxy patterns.
Arithmetic Vulnerabilities
Catches precision loss in division-before-multiplication, unchecked blocks with underflow/overflow potential, and unsafe casting between integer types.
Front-Running
Detects transactions vulnerable to MEV extraction, missing slippage protection on swaps, unprotected commit-reveal schemes, and sandwich attack surfaces.
Vulnerability Examples the Scanner Catches
Let's walk through concrete code patterns that the scanner flags, so you can understand exactly what it looks for and why each pattern is dangerous.
Example 1: Reentrancy (Critical)
The classic reentrancy bug — sending ETH via a low-level call before updating the sender's balance. An attacker contract can re-enter the withdraw function before balances[msg.sender] is decremented, draining the contract.
function withdraw(uint256 amount) external { require(balances[msg.sender] >= amount, "Insufficient"); // BUG: External call before state update (bool success,) = msg.sender.call{value: amount}(""); require(success); balances[msg.sender] -= amount; // Too late! }
function withdraw(uint256 amount) external { require(balances[msg.sender] >= amount, "Insufficient"); balances[msg.sender] -= amount; // State update FIRST (bool success,) = msg.sender.call{value: amount}(""); require(success); }
Example 2: Unprotected Initialize (Critical)
Upgradeable contracts use initialize() instead of constructors. If this function lacks access control, anyone can call it and claim ownership of the contract.
// Anyone can call this and become the owner function initialize(address _owner) external { owner = _owner; }
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; function initialize(address _owner) external initializer { owner = _owner; }
Example 3: tx.origin Authentication (High)
Using tx.origin for authentication is dangerous because it returns the original sender of the transaction, not the immediate caller. An attacker can trick the owner into calling a malicious contract that then calls the vulnerable function.
function emergencyWithdraw() external { require(tx.origin == owner, "Not owner"); // Phishable! payable(owner).transfer(address(this).balance); }
function emergencyWithdraw() external { require(msg.sender == owner, "Not owner"); // Direct caller only payable(owner).transfer(address(this).balance); }
Example 4: Unbounded Loop DoS (Medium)
Iterating over a dynamic array with no upper bound means an attacker can grow the array until the function exceeds the block gas limit, permanently bricking the contract.
function batchTransfer(address[] calldata recipients, uint256[] calldata amounts) external { for (uint256 i = 0; i < recipients.length; i++) { // No upper bound! payable(recipients[i]).transfer(amounts[i]); } }
uint256 constant MAX_BATCH = 50; function batchTransfer(address[] calldata recipients, uint256[] calldata amounts) external { require(recipients.length <= MAX_BATCH, "Too many"); for (uint256 i = 0; i < recipients.length; i++) { payable(recipients[i]).transfer(amounts[i]); } }
These are just 4 of the 20+ patterns the scanner checks. The full scan also covers oracle staleness, signature replay without nonces, unsafe ERC-20 transfers, storage collisions in proxies, precision loss in arithmetic, missing slippage checks, and more.
Who Should Use This Scanner?
- Solidity developers — catch vulnerabilities during development, before they reach testnet or mainnet
- DeFi protocol teams — quick sanity check before committing to a full manual audit
- Smart contract auditors — automated first pass to identify common patterns, freeing time for business logic review
- Security researchers — rapid triage of contracts during bug bounty hunting
- Hackathon builders — ship safer code under time pressure without waiting for an audit
- Students and learners — understand common vulnerability patterns with concrete examples
Scan Tiers: Free, Standard, and Comprehensive
The basic pattern scan is free with no limits. For deeper analysis that catches business logic flaws and economic exploits, upgrade to a paid tier.