Docs

Reference, indexed.
Quietly.

Versionv0.14.2
Updated2026-04-26
Enginesolc 0.8.x
Detectors514
LicenseBSL-1.1

§ 01 · OriginGetting started.

AuditHunt runs as a CLI, a long-lived daemon (audithunt watch), or a hosted REST API. The same scan pipeline backs all three. This page is the printed manual; you should be able to follow it without ever opening the product.

1.1Install

Three install paths. Pick one. They produce identical binaries.

# homebrew (mac, linux)
brew install audithunt/tap/audithunt

# cargo (any platform with rust)
cargo install audithunt

# container (CI-friendly)
docker pull ghcr.io/audithunt/cli:0.14.2

Verify the install:

$ audithunt --version
audithunt 0.14.2 (engine solc 0.8.26, 514 detectors)

1.2First scan

Point the binary at a Solidity file, a directory, or a verified contract address. Output is a findings.json by default; use --format md for the report deliverable.

# local file
audithunt scan ./contracts/Vault.sol

# whole project — picks up foundry.toml/hardhat.config
audithunt scan .

# mainnet contract by address
audithunt scan 0xDEADBEEF... --network mainnet

1.3Exit codes

The CLI exits non-zero when findings exceed the configured severity gate. Default gate is medium; override with --fail-on critical or set in audithunt.toml.

CodeMeaningTypical CI behavior
0Clean, or only findings below gatePipeline passes
1Findings at or above severity gateBlock merge
2Parse error, no scan performedSurface to author
3Engine crash (please --bug-report)Retry once, then alert
4Authentication / quotaRenew token

§ 02 · SurfaceThe command line.

Four verbs. Everything else is a flag. The CLI is the canonical surface; the API and SDK shell out to the same binary.

2.1scan

Run a one-shot audit and exit. The default and the verb you'll use 99% of the time.

cmd audithunt scan <target> [flags]
--network
mainnet · base · arbitrum · optimism · custom RPC
--format
json · md · sarif · html
--fail-on
info · low · medium · high · critical
--detectors
comma list, e.g. reentrancy,access-control
--exclude
glob list, applied to source paths
--cache-dir
~/.audithunt/cache
--timeout
per-detector, default 180s

2.2watch

Long-lived daemon. Re-runs only the detectors whose inputs changed. Useful for active development; not a CI tool.

$ audithunt watch .
[ 09:04:18 ] watching 14 files
[ 09:04:18 ] initial scan: 1 medium · 2 low (1.8s)
[ 09:06:42 ] Vault.sol changed
[ 09:06:42 ] partial rerun: reentrancy, access-control (0.4s)
[ 09:06:42 ] 1 critical · 1 medium · 2 low

2.3explain

Print the full reasoning behind a finding ID. Includes the SWC reference, the corpus links, and a synthesized PoC where one is available.

$ audithunt explain RE-001
RE-001 · Reentrancy on external call before state write
  SWC-107 · derived from 14 incidents in corpus
  pattern: call.value(...)(...) followed by write to msg.sender mapping
  PoC: synthesized · see ./.audithunt/poc/RE-001.t.sol
  fix: apply checks-effects-interactions; or use ReentrancyGuard

2.4config

Print the effective configuration after merging defaults, project file, and CLI flags. Use --explain to trace where each value came from.

$ audithunt config --explain
fail_on    = "medium"     // audithunt.toml [scan]
network    = "mainnet"    // flag --network
detectors  = "all"        // default
cache_dir  = "~/.audithunt/cache"  // default

§ 03 · PostureConfiguration.

Configuration is project-local, in TOML. Environment variables override the file; CLI flags override the environment. The file is committed to your repo so reviewers see the same gate the author saw.

3.1audithunt.toml

# Project root: audithunt.toml
[scan]
fail_on        = "medium"
network        = "mainnet"
include        = ["src/**/*.sol"]
exclude        = ["src/test/**", "src/mocks/**"]
timeout_per_detector = 180

[detectors]
disabled       = ["oracle-stale"]   # project uses pull-based oracle
weight.access-control = 2.0          # promote AC findings

[suppressions]
"src/lib/SafeMath.sol#L42" = "intentional unchecked block; gas-critical"

3.2Rules & suppressions

A suppression is a key — path#Lline or contract.function — paired with a one-sentence justification. Suppressions require the justification; an empty string fails the lint.

  • Suppressions are scoped to a finding ID at a location, not blanket-disabled.
  • The justification appears in the report so a reviewer can challenge it.
  • audithunt audit-suppressions lists every active one with its age.

3.3Environment variables

VariablePurposeDefault
AUDITHUNT_TOKENAPI auth, hosted runs
AUDITHUNT_RPCCustom RPC overridebuilt-in
AUDITHUNT_CACHECache dir~/.audithunt/cache
AUDITHUNT_TELEMETRYoff to disableon
NO_COLORPlain TTY output

§ 04 · CatalogDetector catalog.

514 detectors, spanning Solidity, Cairo, Rust and Vyper across every supported chain. Each detector traces back to one or more SWC entries and to specific incidents in the corpus. The coverage breakdown follows, then a representative slice of the full table.

CoverageScopeDetectors
EVM · universalRuns on every EVM chain437
Cairo · StarknetCairo VM51
SolanaAnchor / Rust programs15
EVM chain-specificEth 3 · Optimism 4 · Arbitrum 4 · BSC 213
TotalAll languages + chains514
By languageDetectorsBy severityDetectors
Solidity181Critical21
Cairo51High152
Rust15Medium271
Vyper4Low44
Universal263Info23
IDFamilyNameSWCDefault severity
RE-001ReentrancyCross-function reentrancySWC-107Critical
RE-002ReentrancyRead-only reentrancySWC-107High
AC-001Access controlMissing modifier on privileged fnSWC-105Critical
AC-002Access controlRenounceable owner without successionSWC-105Medium
AR-001ArithmeticUnchecked block over external valueSWC-101High
AR-002ArithmeticPrecision loss on divisionSWC-101Low
OR-001OracleSingle-source price feedSWC-136High
OR-002OracleStale price tolerance > 1hSWC-136Medium
XC-001External callUnbounded loop over external callSWC-128Medium
SG-001SignatureMissing nonce on permit-style sigSWC-117High
ST-001StorageLayout collision after upgradeSWC-119Critical
DS-001DoSGriefable transfer in loopSWC-113Medium
Catalog truncated The full table prints 106 detectors. Run audithunt detectors --list to dump them locally with version stamps and corpus edges.

4.1Reentrancy family

Six detectors in this family. They all derive from SWC-107, but they fan out across what an attacker actually does — cross-function reentry, read-only reentry through view shares, ERC-777 hooks, and three more.

RE-001 · Cross-function reentrancy. Triggers when a function performs an external call before writing to msg.sender's state. The classic. The corpus binds this detector to The DAO, bZx round one, and seven smaller incidents.

RE-002 · Read-only reentrancy. Newer. Fires when a view function exposes a balance that a stateful function later reads back, while in the middle of an external call. Not theoretical — there are 220M USD of incidents in the corpus that took this shape.

4.2Access control family

Five detectors. The Parity wallet incident lives in this family's history; so do most of the "ownership transferred to address(0)" griefing reports.

4.3Arithmetic family

Four detectors. Solidity 0.8 made overflow checked by default, which removed the original batchOverflow shape — but unchecked blocks brought the surface back, and arithmetic precision loss is a different family of bug entirely.

4.4Oracle family

Five detectors. Many of the largest incidents in the corpus — bZx round two, MakerDAO Black Thursday, Mango — bind to this family. Oracle issues account for roughly a third of the lifetime damage represented in the brain.

§ 05 · WireREST API.

JSON over HTTPS. Authenticated with a bearer token from your dashboard. Rate-limited per token; quotas reset hourly. Same scan pipeline as the CLI; identical result schemas.

5.1Auth

Authorization: Bearer ah_live_••••••••••••••••

Tokens are scoped — scan, read, admin. Use the narrowest scope your integration needs.

5.2/v1/scans

post/v1/scans
target
required · address, github URL, or uploaded source bundle ID
network
mainnet · base · arbitrum · optimism
detectors
array · default ["all"]
callback_url
optional · webhook fired on completion
{
  "id": "scan_01HX7K...",
  "status": "running",
  "target": "0xDEADBEEF...",
  "queued_at": "2026-04-26T14:02:11Z"
}
get/v1/scans/:id

Poll until status is complete. Or set callback_url on creation and don't poll at all.

5.3/v1/findings

get/v1/scans/:id/findings

Returns an array of finding objects. The shape mirrors what the CLI emits as findings.json.

[
  {
    "id": "RE-001",
    "severity": "critical",
    "location": { "file": "Vault.sol", "line": 184 },
    "swc": "SWC-107",
    "corpus_edges": ["the-dao", "bzx-1"],
    "poc": "./poc/RE-001.t.sol",
    "fix": "checks-effects-interactions"
  }
]

5.4Webhooks

Sent as POST to your callback_url with an HMAC-SHA256 signature in X-AuditHunt-Signature. Verify before acting.

POST /your/endpoint
X-AuditHunt-Signature: t=1745689331,v1=8a32b7...
Content-Type: application/json

{ "event": "scan.complete", "scan_id": "scan_01HX7K..." }

§ 06 · BindingsSDK.

Two officially-supported language bindings. Both wrap the REST API; community ports for Go and Rust live in the GitHub org.

6.1TypeScript

import { AuditHunt } from "@audithunt/sdk";

const ah = new AuditHunt({ token: process.env.AUDITHUNT_TOKEN });

const scan = await ah.scans.create({
  target:  "0xDEADBEEF...",
  network: "mainnet",
});

const findings = await ah.scans.waitForFindings(scan.id);
findings.filter(f => f.severity === "critical");

6.2Python

from audithunt import AuditHunt

ah = AuditHunt(token=os.environ["AUDITHUNT_TOKEN"])

scan = ah.scans.create(target="0xDEADBEEF...", network="mainnet")
findings = ah.scans.wait_for_findings(scan.id)

for f in findings:
    if f.severity == "critical":
        print(f.id, f.location.file, f.location.line)

§ 07 · HooksCI integrations.

The CLI is the integration. The recipes below are conveniences — wrappers that surface the right defaults for the most common runners.

7.1GitHub Actions

# .github/workflows/audithunt.yml
name: audithunt
on: [pull_request]

jobs:
  scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: audithunt/action@v1
        with:
          token: ${{ secrets.AUDITHUNT_TOKEN }}
          fail-on: "medium"
          comment-pr: true

The action posts a single PR comment with the finding summary; subsequent runs edit it in place rather than spamming.

7.2Foundry / Hardhat hooks

Both toolchains expose a pre-test hook. AuditHunt installs into either with a one-line addition; see audithunt init for project-aware scaffolding.

# foundry.toml
[profile.default]
ffi = true
extra_output = ["audithunt"]

§ 08 · SedimentChangelog.

What this engine has learned, in reverse chronological order. Older entries get terser as their context fades; the corpus they reference is the durable record. This log tracks the engine; for platform release notes — new features, security hardening, and every detector as it ships — see the public changelog.

v0.142026-04-26

  • RE-002 · read-only reentrancy detector promoted out of beta.
  • Storage-collision detector (ST-001) now models OZ upgradeable's reserved gap.
  • Corpus refresh: +14 incidents from disclosed Q1 reports.

v0.132026-02-08

  • Oracle family rewrites: now models pull-based and push-based feeds separately.
  • CLI watch verb shipped with partial-rerun semantics.

v0.122025-11-22

  • 34th detector (DS-001 · griefable transfer) shipped.
  • SARIF output format for code-scanning integrations.

v0.102025-09-04

  • Public beta. 32 detectors. Hosted API opens with a waitlist.
Earlier v0.1 — v0.9 are bound to the brain. Run audithunt history to print the full log; the daemon mirrors it into ~/.audithunt/history.jsonl.

§ 09 · SkinDesign pack.

The brand kit. Logos, OG previews, motifs, design tokens, and the written guidelines, in one place. Provided so partners, journalists, integrators, and the Army can render AuditHunt in branded form without guessing.

Usage Recolor to mono allowed. Maintain 0.5× clear-space around the mark. Do not rotate or skew. Wordmark minimum width 80px. Exceptions: brand@audithunt.com.

9.1Logos & marks.

Vector. Drop into any document, any size. Always preserve original colors or recolor to a single fill from the token palette.

9.2OG / social previews.

One 1200×630 preview per page. Use the matching image when you link to a page — it sets the right palette before the reader clicks.

9.3Decorative motifs.

Six line drawings, one per page. Standalone use OK at ≥ 240px wide. Don't combine motifs from different pages in the same composition.

9.4Design tokens (drop-in CSS).

Take the AuditHunt palette, easing, depth, and type into your own project. These files are pure CSS custom properties — no preprocessor, no build step, no dependencies. Import the five and you inherit the entire system.

9.5Brand docs.

The written instructions that travel with the assets. Read first.

Need the whole pack as one zip? Clone the repo: git clone https://github.com/audithunt/audithunt.git — then take atlas/marks/, atlas/motifs/, atlas/tokens/, and atlas/design-pack/.

§ 10 · TraceAnalytics & advertising.

AuditHunt uses third-party measurement and advertising services to understand how the site is used and to reach the right audiences. We disclose them here in full, and you control them — nothing in this section runs until you accept it.

10.1Who we use

ProviderPurposeProcesses
Google Analytics 4Traffic & product-usage measurementIP, device/browser, pages, on-site events
Google AdsConversion measurement & remarketingAd-click & conversion signals
Google Tag ManagerTag delivery containerLoads the tags above
Meta (Facebook) PixelConversion measurement & audiencesPage & event signals for Meta ads

We may add similar measurement or advertising services over time; this list and the Privacy Policy § 04 are kept in step.

These services set cookies, so they are off by default. On your first visit a consent banner offers Accept or Decline. We implement Google Consent Mode v2: until you accept, analytics_storage, ad_storage, ad_user_data, and ad_personalization are all set to denied, and the Meta Pixel is not initialised at all. Strictly-necessary storage (your session, preferences, referral code) always runs and needs no consent.

10.3How to opt out

  • Decline on the consent banner, or clear this site's storage to be asked again.
  • Google Analytics: install the browser opt-out add-on.
  • Google Ads: adjust your Google ad settings.
  • Meta: adjust your Facebook/Instagram ad preferences.

10.4What we measure

We track product funnel events — page views, sign-up, scan started/completed, pricing & checkout, purchase, and affiliate actions — not your scan source. The full machine-readable event map is published for transparency at design_ops/registries/analytics_events.json. We never feed customer scan submissions to any analytics or advertising service.

Back to the brain End of documents · v3.9.0 Docs
v3.38.0 · docs