Smart contract audit service reports: a step-by-step guide
Between January 2022 and March 2026, 218 documented Web3 exploits drained $7.76 billion from users and protocols. The eight largest incidents account for 50.6% of that cumulative loss.

The audit report is the document most yield strategies rely on to bound that exposure, but reading it wrong — or stopping at the cover page — is how capital gets mispriced. The report is a structured argument about a specific version of code, evaluated with bounded tools, over a finite period, by a counterparty paid by the project. It is a useful input, not a guarantee.
Roughly 79% to 84% of every public audit finding lives inside Solidity and EVM-compatible codebases. That figure is a useful anchor for the strategist: it tells you where the empirical signal is deepest, where the tooling is most mature, and where your baseline confidence in a clean audit should be highest. The remaining footprint — Rust on Solana, Move on Aptos and Sui, FunC on TON — sits on a thinner dataset with a shorter track record. Knowing which ecosystem you are allocating into changes the calibration of every audit report you read.
The freshness check: matching audit reports to deployed bytecode
The single highest-leverage action in audit reading is also the most routinely skipped: confirm the on-chain deployment matches the audited commit hash. Each report identifies a specific Git commit — a unique fingerprint of the exact source code the auditor reviewed. The deployed contract on Etherscan, Basescan, or the relevant block explorer has its own verifiable bytecode. If those two identifiers do not line up, the protocol has shipped code the auditor never touched, and every finding in the report — Critical, High, Low, and Informational — applied to a different system than the one you are about to interact with.
The freshness check is mechanical and takes under five minutes:
- Locate the commit hash on the first two pages of the report, usually in the "Scope" or "Revision" section.
- Pull the deployed contract address from the protocol's official documentation — never from a tweet, a Discord link, or a third-party tracker.
- Match the source code on the explorer against the audited commit line by line, or use a bytecode diff tool to compare the on-chain artifact against the deployment.
- If the audit predates the current deployment by more than a few weeks, treat that as a structural red flag. The audit is now analytical only, not operational.
Protocols that ship upgrades after the audit — frequently without a second review — effectively reset the freshness counter to zero. A one-year-old audit with a "fixed in PR #412" annotation, applied to a forked contract, is barely worth the disk space it occupies. From a position-sizing perspective, the commit hash is the variable with the tightest correlation to realized risk.
A clean audit on stale code is a worse signal than a moderate audit on the exact bytecode you are about to interact with.
Decoding severity levels: from critical vulnerabilities to informational notes
Audit firms apply a tiered classification to findings, and the distribution between buckets tells you more about the protocol than the raw count of issues. The standard ladder, used consistently across reputable firms, runs as follows:
| Severity | Operational meaning | Capital impact |
|---|---|---|
| Critical | Immediate threat to solvency or user funds | Direct loss path; cannot proceed |
| High | Severe impact under specific conditions | Conditional drain; depends on state or price action |
| Medium | Systemic risk or logic errors that compound | Indirect exposure; often interacts with governance |
| Low | Minor bugs, deprecated syntax, gas inefficiency | Negligible economic risk in isolation |
| Informational | Code style, naming, best-practice commentary | No directional risk |
The empirical distribution from 2022 through 2026 is informative. Critical and High-severity findings consistently make up 15% to 17% of all reported issues, while Low-severity findings now represent 37.5% — the largest single bucket. The reading is that the easy wins have been found: what remains is concentrated, technical, and frequently requires a deep understanding of the protocol's economic logic to surface. Old-school reentrancy, once the canonical Web3 vulnerability, accounts for only 2.1% of public audit findings over the same period — not because it has disappeared, but because developers and modern compilers catch it long before the auditor opens the file.
For a yield strategist, the math is straightforward. Count the Critical and High findings, verify they are remediated, and treat the rest as informational noise. A protocol with 30 Low findings and zero Critical items is structurally safer than one with 8 Low findings and a single unpatched High. Headline finding counts, the way protocols advertise them in marketing copy, are a misleading variable — and a giveaway that the team is selling the report instead of underwriting it.
The hidden risks: why audits often miss private key and social engineering threats
This is the section that should reframe how you think about allocating into "audited" protocols.
Between 2022 and 2026, private-key compromises, phishing, and social engineering accounted for 49.6% of cumulative Web3 exploit losses. That figure is roughly equal to the entire universe of code-level vulnerabilities combined. Audits do not surface these threats because they are not present in the audit-able code path — they live in the operational layer around the protocol: the multisig configuration, the admin key distribution, the front-end's DNS records, the Discord admin's password hygiene, the bridge relayer's infrastructure. Smart contract audits are scoped to the bytecode; the loss surface is not.
Reentrancy went from 100% of the conversation in 2016 to 2.1% of audit findings in 2026. That is a positive signal about Solidity's maturity and the hardening of compiler-level protections. The dominance of operational risk in the loss ledger is the opposite signal — it is the failure mode that has not been solved. For the yield-seeking allocator, this reframes the question. A protocol with a flawless audit and a 3-of-5 multisig controlled by pseudonymous team members with private keys stored on hot wallets is structurally exposed to a loss category the audit never touched. The audit's contribution to your risk model for that protocol is bounded; the operational gaps are not.
Threats to price explicitly beyond the audit document:
- Multisig configuration and signer identity: public, reputable, or anonymous?
- Admin key custody: hardware wallet, hot wallet, institutional custody, or worse?
- DNS and front-end infrastructure: who controls the domain, is there a registrar lock, is the front-end pinned to IPFS or Arweave?
- Bridge relayer architecture and validator diversity, including the geographic and jurisdictional distribution of operators.
- Governance attack surface: does the timelock duration match the size of the exposure being protected, or can a quorum drain the contract on a Sunday night?
Half of every dollar lost in Web3 over the past four years was taken without touching the smart contract at all.
Analyzing remediation status: distinguishing fixed issues from accepted risks
The remediation column is where the audit report separates operational signal from marketing theatre. Each finding should resolve into one of four states:
1. Resolved — the protocol's code reflects the fix described in the report.
2. Acknowledged / Accepted — the team formally accepts the risk and does not patch it. Sometimes a legitimate engineering trade-off, but it must be visible to the allocator.
3. Partially resolved — the fix is in flight but not complete.
4. Disputed — the team rejects the auditor's classification or diagnosis.
Accepted findings are the most underappreciated category. A protocol can legitimately decide that a Low-severity finding about a deprecated function is not worth the migration cost and leave it unpatched. That is a defensible engineering decision. What is not defensible is publishing an audit report that lists a Medium or High finding as "acknowledged" without a written explanation, while marketing the report as a clean bill of health. When you see remediation status as "accepted" on anything above Low severity, you are looking at a protocol that has chosen a risk profile you must explicitly underwrite — and your position sizing should reflect that.
The "disputed" status is the rarest and most consequential. Auditors do not enjoy public disputes — they damage future engagement pipelines. When a team disputes a finding, the auditor is usually pointing at something structural about the protocol's economic assumptions, not a stylistic code preference. Read those pages first.
The auditor's economic alignment is also worth pricing directly. The project pays the audit firm; that is a structural incentive. The premium firms — Trail of Bits, OpenZeppelin, ChainSecurity, Spearbit, Cantina — have sufficient reputation capital that walking away from a compressed contract is a survivable decision. The long tail of smaller shops does not have that margin. A 1,000-line Solidity contract reviewed in three days for a flat fee should be sized proportionally to the engagement intensity, not to the report's marketing weight. Cross-reference any post-audit exploits involving the firm: the track record is a leading indicator of how the auditor benchmarks against the next zero-day.
EVM dominance and the evolving landscape of smart contract security
The empirical anchor for nearly every audit quality benchmark is Solidity and EVM-compatible code. Between 79% and 84% of public findings annually originate from these ecosystems, which means the bulk of security tooling — Slither, Mythril, formal verification frameworks, fuzzing harnesses — has been optimized for them. The auditor pool is also concentrated here: the firms with the deepest public track records operate predominantly in EVM, and the dataset of historical vulnerabilities is richer and more uniform.
For an investor allocating into Solana-based protocols, Move-powered chains, or TON, the audit landscape is materially thinner. The auditors are fewer, the tooling is younger, and the history of publicly studied exploits is shorter. That does not mean these ecosystems are inherently riskier — they are simply less statistically settled. A "clean" audit on a Rust-based Solana program is a less empirically grounded signal than a clean audit on a Solidity contract of equivalent scope, because the dataset against which the audit firm calibrated its detection heuristics is smaller and the peg stability of its tooling against the target language is less proven.
For portfolio construction, the practical implication is to weight EVM audits more heavily than non-EVM audits when sizing positions, and to demand additional layers of mitigation — protocol-native insurance coverage, smaller initial allocations, faster exit ramps — when the underlying chain sits outside the EVM data-rich zone. The historical distribution of audit findings is not just a stylistic fact; it is a confidence interval you can apply directly to your position sizing.
A reading order for every audit report
The sequence below compresses the entire framework into a workflow you can run before any allocation decision:
1. Verify the audited commit hash matches the deployed bytecode on the relevant block explorer. If they diverge, stop.
2. Read the severity distribution. Critical and High should be 0% of the finding count after remediation. If they are not, dig into the remediation status.
3. Confirm the remediation status of every finding above Low severity. Any "accepted" item is a position-sizing variable, not a footnote.
4. Identify the auditor and their track record on similar codebases. Cross-reference any post-audit exploits involving that firm.
5. Discount the audit's coverage of operational risks by the empirical 49.6% factor. Insist on multisig specs, timelock duration, and admin key custody as separate diligence.
6. Adjust confidence interval based on chain. EVM audits carry heavier empirical weight than non-EVM audits at equivalent scope.
The audit report is a bounded, time-stamped, peer-evaluated argument about a specific version of code. Its value is real but partial. The yield strategist who treats it as one input — alongside multisig configuration, oracle quality, governance attack surface, and historical incident data — will allocate more accurately than the one who treats the report itself as a moat. The most expensive lesson in the dataset is the one the audit never had a chance to flag. Pricing that risk explicitly, instead of folding it into a generic "audited = safe" assumption, is the only durable edge.