Smart contract audits: are they worth the high cost?
In 2024, Chainalysis reported roughly US$2.2 billion stolen from crypto platforms across 303 separate incidents — a year-over-year jump of about 21%.

In the same market window, a single smart contract audit engagement routinely falls somewhere between US$8,000 and well over US$300,000. The gap between what protocols spend on defense and what attackers extract is not a coincidence. It is the honest shape of an industry that treats the audit as its primary checkpoint and then learns, repeatedly, that the checkpoint is not the perimeter.
There is no shortage of vendor lists ranking the "top" audit firms, no shortage of dashboards scoring protocols by audit count, and no shortage of teams that will tell you an audit is a checkbox before a token launch. None of that addresses the engineering question: given a real codebase, a real timeline, and a real budget, what does a smart contract audit actually buy you, and what does it leave on the table?
The Economics of Security: Beyond the Price Tag
A smart contract audit is a service engagement, not a product SKU, and the published cost range reflects that. Sherlock's 2025 vendor market guide places engagements broadly between US$8,000 and US$300,000 or more. That is not a tariff; it is a contour line around a service whose price is shaped by what you ask the auditors to read, how fast you need them to read it, and who you want doing the reading.
The drivers are familiar to anyone who has run a protocol review:
- Codebase size and surface area — not just lines of code, but the number of externally callable entry points, the depth of inheritance, and whether the system spans multiple contracts, chains, or upgradeable proxies.
- Architectural novelty — a fork of an audited AMM is cheaper to review than a custom liquidation engine with cross-protocol accounting.
- Chain and tooling fit — Solidity on a familiar EVM-equivalent L2 is one cost shape; Cairo on a non-EVM stack, or contracts with custom precompiles, is another.
- Timeline pressure — a four-week engagement with two senior reviewers is materially different from a two-week engagement with one.
- Seniority mix — partners who have seen real exploits cost more than junior analysts, and you should want them on the parts of the codebase that touch value movement.
- Scope discipline — "audit the protocol" is not a brief; "audit the liquidation path under oracle-down conditions, the flash-loan callback surface, and the upgrade hook" is.
The economics question then becomes: is this a cost or an insurance premium? The honest answer is that it is neither, in isolation. It is a partial mitigation whose expected value has to be measured against the assets it protects, the time horizon of those assets, and the cost of the failure modes it does not address. A US$50,000 audit on a US$10 million TVL protocol is a different conversation from a US$50,000 audit on a US$1 billion protocol, and from a US$50,000 audit on a US$10 million protocol whose code controls a multisig that can drain a sister protocol with ten times the TVL. The audit's job is not to make your code safe in some abstract sense; its job is to reduce the probability of a specific class of failure within a specific window.
An audit is a snapshot of a specific commit, read by specific humans, against a specific threat model. Its value is bounded by all four.
Why Audits Are Not Security Guarantees
The single most common framing error in the space is treating an audit report as a certificate of safety. It is not. A smart contract audit is a point-in-time review performed by a finite team against an implicitly stated threat model, on a specific revision of the code. Three things follow from that, and they are worth holding in your head whenever you read an audit report or pay for one.
First, the auditors did not see your future. The version of the contract they reviewed is the version that went live, until someone — you, a maintainer, an upgrade hook — changes it. Upgradeable proxies, governance modules, and parameter-setter functions are all mechanisms that allow post-audit state to differ from audited state. Solidity's own documentation warns that reentrancy can be introduced through any external call, not only Ether transfers, which means a refactor that adds a callback path can open a hole that did not exist when the auditor was reading.
Second, the auditors did not see your economics. Most reputable audit firms will flag obvious reentrancy, missing access control, and uninitialized storage, because those are the patterns their detectors and checklists cover. Business logic — the actual sequence of conditions under which a vault, a liquidation, or a reward distribution behaves correctly — is harder. It is the layer at which flash-loan attacks, oracle manipulation, and accounting inconsistencies live, and it is the layer at which auditors most often rely on the protocol team to articulate invariants.
Third, the auditors did not see your dependencies. A protocol that integrates three external oracles, two lending markets, and a bridge inherits the bugs and governance risks of all of them. The audit can enumerate the integration surface, but it cannot guarantee that the oracle you depend on will not upgrade its feed logic next month, or that the bridge's multisig will not rotate signers in a way that voids your pause assumptions.
The market behaves as if an audit is a guarantee because the report is a deliverable, and deliverables feel like products. They are not. They are conversations between your codebase and a small group of humans under time pressure, recorded as findings and recommendations, with the rest of the surface area left implicit.
The Limitations of Automated and Formal Verification
The natural reaction to the limits of manual review is to reach for tools. Two classes of tool dominate the discussion, and both are necessary without being sufficient.
Static analyzers such as Slither operate on the source tree without executing it. They apply detectors — pattern matchers, dataflow analyses, and taint trackers — to surface known classes of bugs. Slither's documented detectors include high-severity reentrancy findings such as reentrancy-eth (reentrancy involving Ether theft) and reentrancy-balance (reentrancy that can invalidate a balance check after an external call). It is genuinely useful, and any team not running it in CI is leaving cheap wins on the table.
The catch is in the classification. Slither labels both of those detectors High severity but Medium confidence. That is not an oversight; it is the honest expression of what static analysis can do. The tool raises the alarm because it sees a pattern that often correlates with a vulnerability, and then it defers to a human to decide whether the pattern is exploitable in this codebase, on this chain, under these access conditions. Blind acceptance of static-analysis output produces noisy dashboards and, worse, a false sense of coverage. A Medium-confidence finding is a question, not an answer.
Formal verification sits at the other end of the spectrum. Certora's workflow compiles the contract and user-written rules into a verification condition that an SMT solver attempts to prove or disprove. When the solver succeeds, you have a mathematical guarantee that the contract satisfies the specified invariant, under the assumptions encoded in the rule. This is the strongest form of automated assurance you can buy.
It is also narrowly bounded. Formal verification only covers the properties you have actually specified. If you do not write a rule that says "the sum of all user balances equals the contract's reported total," no solver will tell you whether that invariant holds. If your invariant does not account for the reentrancy path that the static analyzer flagged, the formal proof will happily confirm a property that does not extend to the case you actually care about. The engineering cost of writing good specifications is non-trivial, which is why formal verification tends to land on the highest-value components of a protocol — the core accounting logic, the liquidation engine — rather than the entire surface.
The Checks-Effects-Interactions pattern recommended by Solidity's documentation sits between these two worlds: validate inputs first, update contract state second, make calls to other contracts only after planned state changes have been written. It is a coding discipline, not a tool, and it is the most reliable single mitigation against the reentrancy class of bugs that both Slither and Certora are designed to surface. In practice, the protocols that hold up best under audit combine disciplined coding patterns with both classes of tool, on a codebase where the invariants worth verifying have actually been written down.
| Approach | What it surfaces well | What it cannot see | Typical cost shape |
|---|---|---|---|
| Manual code review | Business logic flaws, economic attack vectors, access-control gaps | Code introduced after the review window | Scales with code size and reviewer seniority |
| Static analysis (e.g., Slither) | Known patterns: reentrancy, uninitialized storage, dangerous strict equalities | Novel logic, cross-protocol composability | Low; tooling cost dominates |
| Formal verification (e.g., Certora) | Specified invariants, proven under encoded assumptions | Anything not expressed in a rule | High; engineering hours for spec authoring |
| Bug bounty (post-launch) | Asymmetric attacker perspective, novel exploit chains | Low-criticality paths, slow patch cycles | Pay-per-finding, tail-heavy |
Governance and Post-Launch Defense Strategies
Once you accept that an audit is a snapshot, the architectural question becomes: what is the rest of the security model? For protocols that hold real value, the answer is layered, and it has to be designed before the audit report comes back.
OpenZeppelin's multisig documentation is direct about what a multisig does: it requires multiple authorized signers to approve an operation before execution, reducing the risk that a single signer can unilaterally perform a critical action. That is the entire value proposition. Conversely, a multisig does not protect you from a quorum that is too small, a signer set that is too concentrated, or signers who are individually compromised through social engineering. The multisig's threat model is "one bad key," not "a coordinated group of bad keys" or "five compromised keys at once." The configuration knobs — quorum threshold and signer-management controls — are not paperwork; they are the actual security boundary, and they deserve the same engineering attention as the contracts they administer.
Layered on top of the multisig is usually some form of delay. OpenZeppelin's TimelockController documentation describes the delay as time for users to review a privileged maintenance operation and exit if they judge it unsafe. In practice, the timelock is what turns an upgrade from a fait accompli into a publicly observable event with a window to react. The same documentation warns that a timelock can become permanently locked if the roles required to administer it are unavailable, which means the timelock's failure mode is not exploitation but deadlock. That is a failure mode you design for by ensuring signer availability, by assigning the administrative role to a secure governance contract such as a DAO or multisig, and by writing recovery procedures that do not require the timelock itself.
Bug bounties close the third loop. A bug bounty pays the asymmetric attacker to be a researcher instead. It works best after the audit, not in place of it, because the bounty defines the economic surface — what is in scope, what severity pays what, who adjudicates — that the audit does not. Conversely, a bug bounty without a working incident-response path is just a payment queue with no on-call engineer behind it. The judgment calls — payout curves, duplicate-finding policies, disclosure timelines — are the actual product, and a bounty program that has not thought them through will underpay the researchers it most needs.
Put together, the post-audit stack looks less like a wall and more like a series of filters: a multisig that requires multiple signers, a timelock that requires time, a bug bounty that invites outside scrutiny, and an on-call path that lets a finding turn into a patch within hours rather than days. None of these layers replaces an audit, and none of them makes a protocol safe in the abstract. They shrink the window in which a vulnerability can be found and exploited, and they make the difference between an incident and a catastrophe.
Lessons from the Euler Finance Incident
If you want a single case that illustrates the limits of audit-driven security, the March 2023 Euler Finance incident is the cleanest example in the recent record. Euler has stated that approximately US$197 million was exploited from Euler V1 on March 13, 2023. The protocol had been audited. The bug that was exploited was not a textbook reentrancy or an uninitialized storage pointer; it was a business-logic flaw in the donation-to-reserves path that interacted with the liquidation accounting in a way the audit had not articulated as an invariant.
Two details make the case worth sitting with. First, a previous bug bounty report had identified a different issue in the same area of the code. The team had patched it. The patch, in turn, created the exploit vector that was eventually used. In other words, the audit and the prior bounty had both engaged with the relevant surface; the failure was not absence of attention but a logic gap that survived both processes. Second, the funds were eventually returned. Euler Foundation announced on April 4, 2023, that recoverable exploited funds had been returned, and the recovery rate for an incident of that size was unusually high. Recovery is the exception, not the rule, and the fact that it happened here should not be read as a reason to rely on attacker goodwill.
Euler is not a story about an audit failing to do its job. It is a story about what an audit cannot do: it cannot see a logic flaw that the auditors did not think to express as an invariant, and it cannot protect against a patch that introduces a new assumption. The same shape shows up in the broader 2024 numbers — Chainalysis reported US$2.2 billion stolen across 303 incidents, with DeFi holding the largest share of stolen assets in the first quarter of 2024 and private-key compromise accounting for 43.8% of stolen crypto across the year, a category that a smart contract audit of the contracts themselves does not touch at all. The professional smart contract audit value proposition is real for the class of bugs it is designed to catch, and it leaves the rest to other layers.
The protocol does not become safe at the moment the audit report is delivered. It becomes safer, in a specific way, against a specific class of failure, for as long as the audited code remains the deployed code.
Closing Position
So is a smart contract audit worth the cost? The honest answer is that the question is malformed. The smart contract audit cost vs benefit calculation only resolves when you put a number on the assets at risk, a description of the governance model around the audited surface, and an honest accounting of the engineering practices that surround it. A US$20,000 manual review on a codebase that then gets patched six times before launch with no re-review is worth less than its invoice. A US$150,000 audit combined with static analysis in CI, a specified set of formal invariants on the accounting core, a multisig with a deliberately chosen quorum, a timelock on every privileged path, and a funded bug bounty is worth considerably more than its invoice. The line items are the same; the smart contract audit ROI is not.
What I would tell a peer deciding whether to commission one: do not shop by price. The published range exists for a reason, and the bottom of it is rarely the right number for a protocol that holds user funds. Choose a firm whose methodology you can interrogate, whose scope you can define in writing, and whose report you can read critically rather than display. Insist on a re-review after any material change to the audited surface, and treat the re-review as part of the original engagement in your budget rather than as a follow-on cost you will somehow avoid. The question of whether a smart contract audit is necessary has, at this point, a fairly boring answer: if the protocol moves value, yes; the live question is how to make it the load-bearing input to a layered model rather than a ceremonial one.
In practice, the protocols that hold up are the ones that treat the audit as one input into a layered security model, not as the model itself. Conversely, the protocols that break are almost always the ones that treated the audit report as a finish line. The cost is high. The value is real but conditional. The work is to make sure the conditions hold.
FAQ
Are smart contract audits a guarantee that my protocol is safe?
What factors influence the cost of a smart contract audit?
What is the difference between static analysis and formal verification?
Why do protocols still get hacked after being audited?
How should a protocol team use an audit report effectively?
By Lucas Meade