Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Audit a Solidity contract by first defining what it is supposed to protect and who can change its behavior, then tracing sensitive state transitions and external calls, testing adversarial inputs and sequences, and combining manual review with static analysis, fuzzing, and targeted symbolic execution. Finish by verifying fixes and checking that the team can monitor and respond to problems after deployment. No clean tool report or completed audit proves a contract is bug-free.

1. Fix the audit scope and threat model

Collect the exact version being reviewed

Start with the source revision intended for deployment or upgrade, the compiler version and settings, dependency lockfile, deployment configuration, and a diagram or description of the system’s contract interactions. The review should match the code and dependencies that will actually run; reviewing a nearby commit or a different compiler setup can leave important changes outside scope.

Map assets, actors, and trust boundaries

List what can be lost, frozen, minted, redirected, or misaccounted: for example, Ether, tokens, shares, collateral, rewards, and control of an implementation address. For each asset or critical state, identify who can affect it, which external contracts it depends on, and what assumptions the system makes about them. Include privileged users, governance, keepers, oracles, bridges, and upgrade administrators where applicable.

Describe the system as a state machine rather than a set of isolated functions. Write the important invariants in plain language before turning them into tests. Examples include: total shares remain consistent with recorded deposits; only an authorized actor can change an implementation; a user cannot withdraw more than their entitlement; and pausing prevents the actions it is intended to stop. Ethereum.org’s security guidance recommends using threat modeling to prioritize high-value or weak areas when review time is limited.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

2. Review access control and administrative powers

Inventory every sensitive operation

Search the system for functions and state that can move assets or alter who may do so. Include minting and burning, withdrawals, fee changes, role assignment, pausing, implementation changes, user eligibility, and configuration of external addresses. For each operation, record who may call it, the conditions under which it is reachable, and the consequences of misuse.

  • Check for missing, overly broad, misassigned, or inherited permissions.
  • Trace ownership and role setup during deployment or initialization, including what happens if initialization is called twice or not at all.
  • Check whether role transfer, revocation, pause, and emergency functions leave the system recoverable without granting unintended authority.
  • For upgradeable contracts, verify who authorizes an upgrade and whether implementation and administrative responsibilities are separated as intended.

Include the people and keys behind the roles

Solidity access checks do not establish that the privileged key is well controlled. Determine who holds privileged wallets, how access is protected, and whether the project’s risk warrants multi-party approval. Slither summaries can help expose visibility, inheritance, and authorization relationships, but a tool cannot determine whether the project’s governance arrangement is appropriate.

3. Trace external calls and reentrancy

Follow control flow across every interaction

For each Ether transfer, token call, callback, low-level call, or other contract interaction, inspect the state read and written before and after the call. Solidity 0.8.23’s Security Considerations documentation explains: “Any interaction from a contract (A) with another contract (B) and any transfer of Ether hands over control to that contract (B).” The callee may call back before the original operation finishes.

Ask whether a callback can reenter the same function or a different function that shares relevant balances, permissions, or accounting. Check whether invariants temporarily break during the interaction, whether failure handling creates an alternate path, and whether checks-effects-interactions or a reentrancy guard is suitable for the actual shared-state paths. A guard on one function is not enough if another entry point can exploit the same state.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Look beyond a search for .call

Trace token hooks, proxy and delegatecall behavior, cross-function paths, and external protocol callbacks. Consider unusual token behavior and error cases as well as the apparent happy path. Reentrancy is one form of risk from handing over control; economic assumptions, transaction ordering, and protocol composition need separate review.

4. Check accounting, state transitions, and boundary cases

Exercise values and sequences at the edges

For each calculation and state transition, examine zero, minimum and maximum inputs, rounding direction, division by zero, casts, decimal and precision assumptions, and loop bounds. Compare paired operations such as deposit and withdrawal or mint and burn: they should update balances, shares, debt, rewards, and permissions consistently, including after unusual sequences of transactions.

Check that user-controlled inputs cannot produce an unintended state, and that transaction ordering or front-running cannot violate a stated invariant. Review cryptographic operations and privacy assumptions manually where they affect the protocol’s security; these are not reliably resolved by generic static checks.

Use the project’s actual compiler and dependencies

Solidity 0.8.23 documentation discusses version-specific risks and notes that compiler or platform bugs remain possible. Do not transfer a finding—or an assurance—from that documentation to every release. Confirm the project’s exact compiler version and settings, then check the corresponding current compiler documentation and the exact dependency versions included in the build.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

5. Review token integrations and upgrade paths

Do not assume every token behaves alike

Check how the contract handles transfer return values and whether its accounting assumes that the requested amount equals the amount received. Where relevant, test fee-on-transfer and rebasing tokens, callbacks, token decimals, blacklist or pause controls, and non-standard transfer behavior. Ethereum.org’s checklist recommends reviewing token integrations and targeted ERC conformance; the OWASP Smart Contract Security Verification Standard version 0.0.1 (2024) also covers areas including rebasing, rewards, fee handling, Merkle claims, arbitrary user input, and low-level calls.

Treat upgradeability as a separate review area

For upgradeable systems, inspect initialization, implementation and administrator separation, storage-layout compatibility, upgrade authorization, and recovery procedures. Trace how an upgrade affects existing state and what happens if deployment, initialization, or migration steps fail. Ordinary function review alone does not establish that an upgrade architecture is safe.

6. Combine tests and analysis tools

Use techniques in layers because they answer different questions. Keep unit and integration tests, but do not treat expected-behavior tests as a substitute for adversarial cases: Ethereum.org cautions that ordinary unit testing is not by itself well suited to the edge cases where security flaws often occur.

Technique Best use Effort and limitations
Manual review Business logic, authorization intent, economic assumptions, protocol composition, transaction ordering, privacy assumptions, and cryptographic reasoning. Requires reviewers who understand the system. It can find issues automation does not readily model, but it is not a proof that every path was considered.
Static analysis, such as Slither Fast checks for common patterns and structural issues; useful for examining inheritance, visibility, authorization relationships, and relevant standards checks. Ethereum.org’s tools guide describes Slither analysis as taking seconds, with moderate missed-bug risk and low false-alarm risk. These are the guide’s broad descriptions, not guarantees for a particular codebase or current tool release. Findings require contextual review.
Property-based fuzzing, such as Echidna Generate inputs and transaction sequences to test properties written from protocol invariants. The guide describes runs in minutes and true-positive reports, while noting that random exploration can miss bugs. Results depend on the properties, harness, and paths reached.
Symbolic execution, such as Manticore Explore selected critical properties or paths where deeper analysis justifies the setup and runtime. The guide describes runs that can take hours. Its “none” missed-bug and false-alarm entry is conditional on all paths being explored without timeout—not a general guarantee of completeness.

Turn invariants into adversarial tests

Write properties that express what must remain true, then exercise boundary inputs and sequences involving multiple actors and contract states. Fuzzing is most useful when its properties reflect meaningful accounting and authorization rules; random calls without a useful property may run without testing the risk that matters.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Target symbolic analysis rather than treating it as exhaustive by default

Choose high-impact properties and paths, and understand which inputs, state assumptions, and execution limits the analysis covers. A symbolic tool’s result applies to the scope it explored; timeouts or unmodeled dependencies can leave paths unexamined.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

7. Triage findings, fix, and verify

Make every finding actionable

For each issue or warning, record the affected contract and function, conditions required to reach it, attacker capability, likely impact, reproduction or other evidence, and a proposed remediation. Separate a confirmed vulnerability from a tool warning or an unresolved design question so teams can prioritize work without overstating certainty.

Retest the fix and changed behavior

After a fix, rerun the relevant tests and analyses against the revised code, including regression cases for the original failure and related state transitions. Request an independent review of important changes. Ethereum.org advises against treating audits as a silver bullet: reviews can find flaws missed earlier, but do not promise to catch every bug.

8. Prepare for deployment and incidents

Security work continues after code review. Confirm the team can identify deployed contract versions and dependencies, monitor relevant contract activity, secure privileged wallets, and carry out documented upgrade, migration, or recovery procedures. Define who can act and how if a flaw is discovered; an emergency control is useful only if its authority and consequences are understood.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Ethereum.org’s smart contract security page was last updated February 26, 2026, and the site reports an update on October 1, 2026. The Solidity Security Considerations cited here is specifically for version 0.8.23, while the OWASP standard cited is version 0.0.1 (2024). Tool behavior and compiler guidance can change, so verify them against the versions used by the project.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.