We do not audit. We ship and harden smart contract code, then external firms audit it. Before that audit window opens, we run this 30-item pre-audit checklist across 6 categories: compiler and toolchain, access control and roles, arithmetic and overflow, external calls and reentrancy, upgradability and storage, gas and DoS surfaces. Every item below has burned us or a peer on a real engagement. Clearing all 30 has cut auditor finding counts on our handovers by roughly 60 to 80 percent in our engagement history, which means cheaper audits and faster mainnet.
This is the list we wish someone had handed us on day one of Scramble Pay, Quivr, Lightbridge, and our Account Abstraction work. We do not call it an audit. It is a hardening review, designed to make the audit boring.
Going to audit soon?
Book Free ConsultationSix categories, five items each, thirty items total. We treat the checklist as a gate. If an item fails, the contract does not leave our repo until it is fixed or explicitly waived in writing by the client with a reason. We pair this with our TDD workflow and QA service so every fix lands with a regression test.
foundry.toml or hardhat.config. Floating pragmas like ^0.8.20 mean two developers can compile two different bytecodes from the same source.git dependencies pointing at main. We diff every dependency upgrade.onlyOwner by default. We map each function to a role and document who holds it at deployment.Ownable2Step or equivalent. A typo on a one-step transfer is unrecoverable._disableInitializers() in the constructor of every implementation contract, no exceptions.unchecked block has a comment explaining why overflow is impossible at the call site./ in financial paths and review each one.uint256 to uint128 or smaller has an explicit bound check or SafeCast.onERC1155Received, ERC721 onERC721Received. Assume any external token is hostile.(bool ok, ) = target.call(...) with no return data check is a silent failure waiting to happen.
"Hardening is what makes the audit boring. Boring audits ship."
forge inspect storage layout before and after, and reject any reordered slot.uint256[50] private __gap; per OpenZeppelin convention.try/catch.forge snapshot and reject regressions over 5 percent.Auditors charge by the line of code and by the day. Sending unhardened code to an audit is paying senior engineers €2,000 to €4,000 per day to find bugs your own team could have caught with Slither and a fuzz harness. In our engagement history, projects that completed all 30 items before audit handoff came back with auditor finding counts in the single digits, most of them informational. Projects that skipped the checklist routinely came back with 30+ findings including criticals, which then required a re-audit at full cost.
This is the difference between Wavect and a generalist shop. See Wavect vs a generalist dev agency for the full context. We build Web3 systems with a security-first cadence baked into our blockchain service, so the audit becomes a sign-off rather than a rescue.
The Wavect tech lead on the engagement. They sign off each item with a commit reference and a test reference. The client receives the signed checklist as part of the audit handover package, which the external auditor receives alongside the code. Auditors love this because it tells them where to focus their attention.
30 items, 6 categories, one signed-off document per release. That is the pre-audit hardening review. We do not replace external auditors and we never claim to. What we do is hand them code that has already cleared the obvious vectors, so their fee buys you deep findings instead of obvious ones.
If you are about to ship a Solidity codebase to mainnet and you have not run a structured hardening pass, you are paying audit rates for work you could have done at engineering rates. Talk to us before you book the audit slot, not after.
Shipping smart contracts?
Book Free Consultation