Lightening Tech Evidence, not opinion

Blockchain & Web3

Smart contract security review

An independent read of your contracts before mainnet — findings ranked by severity, attacks written out, and a re-review after your fixes land.

From
$3,000–$40,000
Typical time
2–6 weeks
Usually bought by
Protocol teams

What this actually solves

You are about to put contracts on mainnet that will hold money, and everything you know about them comes from the people who wrote them. That is not a comment on your team. It is a structural problem — the person who built a system tests the paths they had in mind, and the attack that costs you money will come down a path nobody had in mind. Once it is deployed, there is no rollback, no chargeback, and no support line. The money leaves and the incident keeps your project's name attached to it permanently, in search results, for years.

There is a second reason people buy this, and it is worth naming because it changes what a good report looks like. A review is also a document you hand to other people. It goes to your investors, to an exchange's listing team, onto your own site. That makes the honesty of the report part of its value. A report that says everything is fine is worth nothing to a sophisticated reader, because they know what such a report costs to obtain. A report that states its scope precisely, ranks what it found, and is explicit about what it did not examine is the one that survives being read by somebody's technical adviser.

How the review runs

  1. Scope, freeze and read the intent. We agree exactly which files, which commit hash and which deployment parameters are in scope, then read the specification, whitepaper and documentation before the code. Serious findings are often not bugs in the usual sense at all — they are places where the code does something the specification does not describe, and you can only see that if you read the intent first. Two to four days.
  2. Manual review, line by line. The slow part, and the part that finds the expensive things. Access control on every state-changing function. Arithmetic and rounding direction. Ordering of effects against external calls. Assumptions about the tokens your contracts will interact with. What happens at the boundaries — zero, one, maximum supply, an empty pool, a paused dependency. One to three weeks depending on size and novelty.
  3. Tooling and adversarial testing. Slither and Semgrep rules for the known patterns, then Foundry invariant testing and Echidna to attack the properties that must never break, and Tenderly to simulate specific transactions against forked state. Tools do not replace the reading — they cover the ground that reading does badly, which is the long tail of random inputs. Three to six days.
  4. Write the attacks, not just the observations. Every candidate finding is pushed toward a concrete question with a yes or no answer. Can I move an external price with a flash loan and profit inside a single transaction. Can I withdraw against another user's balance. Can the admin, acting alone, take everything and leave. A finding that cannot be turned into a sequence of calls gets ranked lower and labelled as such, rather than padding the report. Three to five days.
  5. Report, then re-review the fixes. Findings arrive ranked Critical, High, Medium, Low and Informational, each with the damage it causes and a concrete remediation. Critical means money can be taken now. Informational is housekeeping. After your team fixes, we look again at the diff and mark each item Fixed or Acknowledged, and the final report records which is which. Report 2 to 3 days, re-review 2 to 5 days.

Two things are deliberately absent from the process. We do not use an AI assistant to produce findings — it is genuinely useful for cleaning up code before a review, but it does not reason about the relationship between two contracts, it does not invent the economic attacks that dominate real incidents, and, most disqualifying of all, it cannot tell you what it failed to look at. And we do not describe our own security work on a contract we built as an independent review, because it is not one.

What moves the price

Size and novelty of the code. Lines matter, but a fork of a widely deployed protocol with limited changes is a fundamentally different job from a new design, because on the fork the reviewer's attention goes straight to the diff and the assumptions the original made that your changes break.

How many external protocols you touch. Every oracle, router, lending market or bridge you integrate adds an interface whose behaviour under stress has to be reasoned about — what your contract does when that dependency pauses, returns a stale price, or is manipulated for a single block.

Whether the economics are part of the scope. Reviewing that a contract does what its specification says is one job. Reviewing whether the specification itself can be gamed — incentive design, liquidation thresholds, fee routing — is a larger one. The range is $3,000–$40,000 over 2–6 weeks, and this distinction moves a project across most of it.

What usually goes wrong

A clean static analysis run is presented as an audit. This misunderstanding is common and it is expensive. A static analyser matches known patterns. It does not know that your reward accountant is supposed to conserve a funded pool, so it will never tell you that it does not. Reporting a clean tool run as evidence of security is only ever a statement that nothing from a published list of generic weaknesses was matched.

Findings get quietly downgraded during the fix window. A High becomes Acknowledged because the fix is awkward and the launch date is fixed, and the report goes onto the website anyway with that column not especially prominent. Whoever is doing real diligence on you reads that column first. If you are going to accept a risk, accept it explicitly and say why in the report — that reads far better than an unexplained Acknowledged.

The deployed code is not the reviewed code. The commit drifts. A fix is applied, then a small unrelated improvement goes in on top, then a parameter is tweaked at deployment time. Now the report describes something that no longer exists, and the difference is exactly where nobody has looked. The controls are a frozen commit hash printed in the report, a re-review of the fix diff, and reading every deployed parameter back off the chain and comparing it against what the review assumed.

See where the site stands before you brief anyone.

If the site is already live, start from what it scores rather than from a guess. The audit reports what it checked, what it found, and — the part most tools leave out — what it could not check, and why.

See the website audit Talk about this work

Questions people ask before they commit.

Will you certify that our contract is safe?
No, and you should treat anyone who does with suspicion. No serious reviewer says a contract has no bugs, because that is a claim about every attack that has not been invented yet. What a report can honestly say is which files at which commit were examined, under what assumptions, what was found, what was ranked how, and what was explicitly not in scope. That last section is the one most reports leave out and the one that protects you.
What is the difference between a finding marked Fixed and one marked Acknowledged?
Fixed means the code changed and we confirmed the change works. Acknowledged means your team read the finding, accepted the risk and shipped anyway. Both are legitimate outcomes, but they are not the same thing, and a report published with High-severity items sitting at Acknowledged tells a careful reader something. If you are showing the report to an exchange or an investor, expect them to look at that column first.
What do you need from us before you can start?
A frozen commit hash, the specification or whitepaper describing what the protocol is meant to do, deployment parameters, and access to whoever designed the economics. The frozen commit matters more than it sounds — a report is bound to one exact state of the code, and a push made during the review quietly invalidates the parts already written.
Is the re-review after our fixes included?
It is quoted separately, and it is not optional in practice. Fixes routinely create new bugs, particularly when a fix touches shared state or reorders operations. Skipping the second look is the cheapest way to publish a report describing code that is no longer the code you deployed.
We already ran a static analyser and it came back clean. Is that enough?
It is a good first step and it is not a review. A static analyser recognises known patterns — reentrancy shapes, unchecked return values, dangerous delegate calls. It has no idea what your protocol is supposed to do, so it will never flag the mistake that lives in your own arithmetic, your own access rules, or the relationship between two of your contracts. A clean run means nothing from a published list of generic weaknesses was found.
Should we also run a bug bounty or an audit contest?
If real money will sit in these contracts, yes, and after a review rather than instead of one. A review is a small number of people reading deeply for weeks. A bounty or contest is a large number of people attacking in parallel, paid only for what they actually find. They catch different things, and the second is far more useful once the obvious layer has already been cleared.

Often taken together.

Start with the brief, not the invoice.

Send what you are trying to achieve. You get a written scope, a price and a date — or an honest “this is not the right service for that”.

Talk about Smart contract audit All Blockchain & Web3 services