Reentrancy guard
├─ external call ├─ state mutation └─ guard check
The AST is in memory. The detectors fire in parallel — each a small program looking for one shape. Reentrancy. Access. Arithmetic. Oracle. External call. Signature. Storage. DoS. Two seconds of attention against twelve hundred lines.
The cascade
Workers wake, families load, detectors fan out across the AST. The radar is the metaphor; the chips are the work. Each beat is a moment in the same scan — slowed enough to be readable, fast enough to be honest.
├─ external call ├─ state mutation └─ guard check
The catalog
A detector is small by design — it watches for one shape, in one node-kind, and stops. Its smallness is what lets thirty-four of them run in parallel and still finish before you've finished reading this sentence.
├─ external call ├─ state write after └─ no guard
├─ view fn called mid-call ├─ stale storage read └─ price/balance leak
├─ state-changing fn ├─ no modifier └─ no msg.sender check
├─ .call(...) ├─ no require on success └─ silent failure path
├─ uint256 → uint128 ├─ no bounds check └─ value-loss path
├─ updatedAt read ├─ no freshness check └─ unchecked answer
How it runs
The scan is not magic — it is a small, well-ordered set of moves the engine makes against a parsed AST in shared memory. Each beat owes a piece of evidence to the next. The whole journey takes about two seconds.
Eight worker threads come up. The detector registry is loaded and indexed by node-kind. The AST is mapped into shared memory, read-only.
Eight detector families register their predicates. Each predicate is a tiny pattern over one node-kind — function, call, assignment, modifier — never the whole tree.
Thirty-four detectors fan onto eight workers, scheduled by expected cost. The AST is walked once per worker; predicates fire as nodes pass.
A detector that fires keeps the offending node, the path that reached it, and a confidence score. No early reporting — every hit waits for the cross-correlate step.
Hits are grouped by storage slot, by call-graph proximity, by detector-pair affinity. A read-after-write on the same slot turns a low into a high; an external call into a contract you also touch turns a high into a critical.
Severity is assigned, evidence is sealed, the report is handed to the findings layer. The engine releases the AST and goes idle. The whole pass took two-point-one seconds.