Mask
Comments and string literals are blanked to spaces, preserving length and line breaks. A vulnerability written inside a comment does not fire.
Paste a contract. Thirteen vulnerability patterns are checked as you type, entirely inside your browser. Your source code is never uploaded, stored, or transmitted anywhere. There is no server to send it to.
It means thirteen text patterns did not match. Nothing more than that.
This tool does not compile your code. It does not follow values between functions, model your protocol’s economics, read your other contracts, or understand what you intended the code to do. It cannot tell you whether your access control makes sense, whether your incentives can be gamed, or whether two individually-correct functions combine into a bug.
Those are the findings that matter, and every one we have ever reported that mattered came from a person reading the code slowly, not from pattern matching.
Use this the way you would use a spell-checker: it catches the obvious, and its silence proves nothing.
Inline assembly is not analysed. Read-only reentrancy is not detected as reentrancy. Cross-contract and cross-function state flow is invisible to it. Proxy upgrade logic beyond the initializer check is out of scope. Anything expressed through an unusual idiom may simply not match.
Each maps to a vulnerability class we check by hand during a real review. Follow any of them for a full worked explanation with vulnerable code, a fix, and a test.
An external call hands control to another address before the contract updates its own state. Detects low-level calls, ERC777 hooks, ERC721 safe-transfer callbacks, and typed interface calls to a caller-controlled address.
A function reachable by anyone can destroy the contract and forward its balance to the caller.
An externally callable initialize() with no initializer modifier, allowing anyone to claim ownership, repeatedly.
Authentication against the transaction originator rather than the immediate caller, which any contract the owner touches can defeat.
Randomness built from block.timestamp, prevrandao, or blockhash, all visible to or influenced by the proposer.
Prices derived from instantaneous reserves or slot0, which a flash loan can move and restore inside one transaction.
A recovered signature with no nonce consumed and no deadline checked, so the same bytes can be submitted repeatedly.
A pragma older than 0.8.0 with no SafeMath import, where unsigned subtraction below zero wraps instead of reverting.
Solidity 0.8 checks arithmetic but not explicit casts. uint128(x) truncates silently when the value does not fit.
send() and call() return a boolean rather than reverting. Ignoring it lets execution continue as though the transfer succeeded.
A payout loop over an array anyone can grow, where one reverting recipient or enough entries bricks the function permanently.
Logic gated on address(this).balance ==, which a stranger can break forever by force-sending ETH.
Conditions on block.timestamp. Fine for day-scale deadlines, exploitable when it gates a payout or a short window.
Comments and string literals are blanked to spaces, preserving length and line breaks. A vulnerability written inside a comment does not fire.
Function bodies are extracted by brace matching, so the tool knows whether a call and a state write sit inside the same function.
Thirteen detectors run over the masked source. Locals are distinguished from storage, so a temporary variable is not mistaken for state.
Findings sort by severity, deduplicate, and display with two lines of context either side. Everything above happens in your tab.
Send one contract and a named auditor reviews it by hand: every issue found at that depth, with severity, impact and a concrete fix, plus an honest list of what was not covered.
Most audit firms put a contact form where their expertise should be. We would rather show you thirteen of the checks we run, hand you the tool, and let you judge whether we know what we are doing before you talk to us.
If it finds nothing and you still feel uneasy, that instinct is worth more than the tool. That is what the free snapshot is for.