Mythril: symbolic execution security analysis for EVM bytecode
Mythril is a symbolic-execution-based securty analysis tool for EVM bytecode. It detects security vulnerabilities in smart contracts built for Ethereum and other EVM-compatible blockchains.
At a glance
- What is it?
- Mythril is a Python tool that runs symbolic execution over EVM bytecode to find security issues in Ethereum and other EVM-compatible contracts. It installs from PyPI or Docker, and its trade-off is depth of analysis against execution time and state explosion.
- Who is it for?
- Adopt Mythril if you want a bytecode-level second opinion on contracts you already understand, and if you can pay the execution time that symbolic execution demands. Do not adopt it as a replacement for a manual audit or as a CI gate that must finish in seconds.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 160 days ago.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 3, 2026, and from our analysis. They are not legal advice.
Editorial analysis
What Mythril analyzes, and who actually needs it
Mythril is a static analysis tool for EVM bytecode. The README describes it as "a symbolic-execution-based security analysis tool for EVM bytecode" that "detects security vulnerabilities in smart contracts built for Ethereum and other EVM-compatible blockchains." That wording matters: the input is bytecode, not Solidity source. Solidity files are accepted because Mythril compiles them first, but the analysis itself happens on the EVM instruction stream.
The audience is narrow. Smart contract developers who want a machine-checked pass over a contract before deployment, and auditors who want a second opinion on code they have already read by hand. It is not a linter for style, it does not check gas efficiency, and it does not tell you whether the business logic is correct. It looks for known vulnerability classes, and its output is a transaction sequence that reaches the problematic instruction.
The project lives under the ConsenSys Diligence organisation, and the homepage points at mythx.io. The licence is MIT. The last push to the develop branch was on 2026-04-27, and the most recent tagged release in the repository is v0.24.8 from 2024-03-27. That gap between tagged releases and branch activity is worth noticing: the codebase moves, the release cadence is slower.
Symbolic execution and the transaction sequence output
The mechanism is symbolic execution. Mythril loads the bytecode into a virtual machine, then explores execution paths while treating unknown values (calldata, caller address, storage contents, contract balance) as symbols rather than concrete numbers. At each branch it forks the state and keeps going. When a path reaches an instruction that matches a known vulnerability pattern, it records the path.
The `-t` flag bounds how many transactions the engine will explore, and `--execution-timeout` bounds wall-clock time. Those two knobs exist because the state space is unbounded otherwise. This is the central engineering trade-off in the tool: more transactions means deeper reachability and more findings, but the search grows quickly and can run for a long time without terminating.
The README's example output shows what a finding looks like. Running `myth a killbilly.sol -t 3` reports an "Unprotected Selfdestruct" with SWC ID 106 and severity High, names the contract and function, gives a PC address, estimates gas usage, and then prints an initial state and a transaction sequence. That sequence is the useful part: it shows the creator call, then attacker calls to `killerize(address)`, `activatekillability()`, and `commencekilling()`, with the raw txdata for each. You can replay that reasoning against your own contract to see whether the path is genuinely reachable in production.
Findings are labelled with SWC IDs. The README points at the Smart Contract Vulnerability Classification Registry at swcregistry.io for remediation guidance, which is where you go after the tool tells you what it found.
Installing Mythril and running a first analysis
There are two supported install paths in the README. Docker is the simpler one because it avoids Python version constraints:
docker pull mythril/mythThe README also gives a PyPI path, and states the supported Python range as 3.7 to 3.10:
pip3 install mythrilNote the version ceiling. If your environment is on Python 3.11 or newer, the README does not claim support, and the Docker image is the safer route. The Dockerfile defaults to `PYTHON_VERSION=3.10`.
Once installed, analysis of a local Solidity file is one command. The README's own example, abbreviated with the `a` alias for `analyze`:
myth analyze killbilly.sol -t 3You should see a report block per finding, with severity, contract and function name, PC address, an estimated gas range, a source line reference, and the transaction sequence. If nothing is found, the tool reports no issues; that is not a proof of safety, only that this search found nothing within the transaction bound you set.
To analyze a deployed contract instead of a file, pass the address. The README gives:
myth analyze -a <contract-address>The README also documents a pre-commit hook integration, where the hook id is `mythril` and you can switch the command with `args: [disassemble]` or `args: [read-storage]` instead of the default `analyze`.
Where Mythril gives you the wrong answer
The most important limitation is that a clean run is not evidence of a safe contract. Symbolic execution explores paths within the bounds you set. A contract whose vulnerability requires four transactions will not be found at `-t 3`, and the tool will report nothing. The absence of findings is a statement about the search, not about the code.
State explosion is the second problem, and it is structural rather than a bug. Loops with data-dependent bounds, heavy storage interaction, and delegatecall into unknown code all multiply the path count. The `--execution-timeout` flag exists precisely so you can cap this, but a timeout means the analysis is incomplete, and the output does not always make that obvious to someone reading a summary line.
Compiler version is a quieter failure mode. Mythril needs a solc that matches the source, and the Dockerfile installs solc versions through `svm` at build time via the `INSTALLED_SOLC_VERSIONS` build argument. If the compiler used for your source is not installed, or if you analyze bytecode compiled by a different version than the source you are reading, the PC addresses and source line references in the report can point somewhere misleading.
Finally, it is the wrong tool for anything that is not EVM bytecode. Contracts on non-EVM chains, off-chain logic, and front-end or key-management issues are all outside its scope.
How Mythril differs from Slither and fuzzing tools
The closest alternative in the same ecosystem is Slither, which also analyzes Solidity contracts for vulnerabilities. The difference is the technique. Slither works on the source and the AST, building a static model of the contract and running detectors over it. That makes it fast and predictable, and its findings usually map cleanly to source lines.
Mythril instead executes the bytecode symbolically. It can therefore reason about paths that depend on concrete values flowing through the EVM, and it produces a witness: the transaction sequence that reaches the bug. That witness is something a source-level static analyzer typically does not give you. The cost is runtime and the state-explosion ceiling.
Property-based fuzzers sit at the other end. They execute the contract with random or guided inputs and check invariants. They scale to large contracts better than symbolic execution, but they only find bugs their input generation happens to reach, and they give no symbolic guarantee about the paths they missed. Mythril's value is in the middle: more reachability reasoning than a fuzzer on specific path shapes, less speed than a source linter.
A practical arrangement is to run a fast source-level tool on every commit and Mythril on the contracts that matter, with a transaction bound high enough to be meaningful. The two produce different classes of findings, and neither subsumes the other.
Maintenance, upgrade cost, and the MIT licence
The repository is not archived, and the last push to develop was on 2026-04-27. The most recent tagged release in the repository is v0.24.8, dated 2024-03-27, with v0.24.7 and v0.24.6 both from March 2024. Anyone pinning to a release tag should be aware that the tag they pin is older than the branch, so the changelog between the two is not summarised in a release note they can read.
Upgrade cost is dominated by the dependency graph, not by Mythril's own code. The requirements file pins aggressively in places: `py-evm==0.10.1b2`, `z3-solver>=4.8.8.0,<=4.13.4.0`, `mypy-extensions==1.0.0`, `hexbytes<1.4.0`, `eth-hash>=0.3.1,<0.8.0`. The z3 upper bound in particular will block upgrades until the project raises it, because the SMT solver is what does the constraint solving underneath. The `py-evm` pin is a beta release, which is a deliberate choice but one that makes the dependency story harder to reason about.
The Dockerfile is where the build cost actually lands. It compiles wheels in a first stage that installs Rust via rustup, then installs `svm-rs` from cargo to manage solc versions, and pre-installs whichever solc versions you pass through `INSTALLED_SOLC_VERSIONS`. A first build is not quick, and the image carries a signatures database at `/home/mythril/.mythril/signatures.db`.
The licence is MIT. That is permissive and generally compatible with commercial use and redistribution, but the file itself is the authority, and this is not legal advice. If you are embedding Mythril in a product, read LICENSE in the repository root rather than relying on a summary.
Editorial conclusion
Adopt Mythril if you want a bytecode-level second opinion on contracts you already understand, and if you can pay the execution time that symbolic execution demands. Do not adopt it as a replacement for a manual audit or as a CI gate that must finish in seconds. Before trusting a run, verify that the solc version it picked matches the compiler that produced the deployed bytecode, and check the reported PC addresses against the source lines it prints.
Frequently asked questions
How do I install Mythril?
The README gives two paths: pull the Docker image with docker pull mythril/myth, or install from PyPI with pip3 install mythril, which the README states supports Python 3.7 to 3.10.
How do I run Mythril on a contract?
Run myth analyze <solidity-file> for a local file, or myth analyze -a <contract-address> for a deployed contract. The README's example uses the shorthand myth a killbilly.sol -t 3 to limit the search to three transactions.
What does Mythril actually detect?
It looks for security vulnerabilities in EVM bytecode and labels findings with SWC IDs, such as SWC ID 106 for an unprotected selfdestruct in the README's example. The README directs readers to the Smart Contract Vulnerability Classification Registry for remediation guidance.
Can I use Mythril in a pre-commit hook?
Yes. The README shows a pre-commit configuration pointing at the Consensys/mythril repository with hook id mythril, and notes that you can set args: [disassemble] or args: [read-storage] to run a different command than the default analyze.
Does a clean Mythril run mean my contract is safe?
No. The tool explores paths within the transaction bound you set with -t and the time limit you set with --execution-timeout, so a run that finds nothing may simply not have reached the vulnerable path.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/consensysdiligence-mythril)