{"id":19830708,"url":"https://github.com/crytic/optik","last_synced_at":"2025-04-30T06:23:50.658Z","repository":{"id":47963454,"uuid":"489018761","full_name":"crytic/optik","owner":"crytic","description":"Optik is a set of symbolic execution tools that assist smart-contract fuzzers","archived":false,"fork":false,"pushed_at":"2024-09-03T21:37:29.000Z","size":608,"stargazers_count":93,"open_issues_count":28,"forks_count":12,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-04-14T06:50:06.289Z","etag":null,"topics":["echidna","evm","fuzzing","maat","security-tools","smart-contracts","symbolic-execution"],"latest_commit_sha":null,"homepage":"https://github.com/crytic/optik","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/crytic.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-05-05T15:03:50.000Z","updated_at":"2025-01-12T06:46:51.000Z","dependencies_parsed_at":"2024-11-12T11:29:30.388Z","dependency_job_id":"7c430793-5ad5-4f81-867f-522f11b51dd5","html_url":"https://github.com/crytic/optik","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crytic%2Foptik","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crytic%2Foptik/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crytic%2Foptik/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/crytic%2Foptik/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/crytic","download_url":"https://codeload.github.com/crytic/optik/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251652512,"owners_count":21621960,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["echidna","evm","fuzzing","maat","security-tools","smart-contracts","symbolic-execution"],"created_at":"2024-11-12T11:24:58.588Z","updated_at":"2025-04-30T06:23:50.636Z","avatar_url":"https://github.com/crytic.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Optik\n\n**Optik** is a set of symbolic execution tools that assist smart contract fuzzers, letting them run in a _hybrid_ mode. Optik couples [Echidna](https://github.com/crytic/echidna), our smart contract fuzzer, with the [Maat](https://github.com/trailofbits/maat) symbolic executor that replays the fuzzing corpus and extends it with new inputs that increase coverage.\n\n#### Current limitations\n\nOptik is a work in progress and should not be used for real audits yet. Current limitations include:\n\n- Symbolic `KECCAK` hashes are not supported\n- `CREATE2`, `CALLCODE`, and `DELEGATECALL` are not yet supported\n- Gas is not taken into account\n- Some echidna options are not yet supported (see `hybrid-echidna -h`)\n\n## Hybrid Echidna\n\n\u003cp align=\"center\" \u003e\n\u003cimg width=\"80%\" src=\".resources/hybrid_echidna.png\"/\u003e \u003cbr\u003e\n\u003c/p\u003e\n\nOptik allows to run the [Echidna](https://github.com/crytic/echidna) smart-contract \nfuzzer in _hybrid_ mode. It basically couples Echidna with the [Maat](https://github.com/trailofbits/maat) symbolic executor that replays the Echidna corpus and extends it with new inputs that increase coverage. \n\n`hybrid-echidna` starts with several \u003ci\u003eincremental seeding\u003c/i\u003e steps, where it seeds the corpus with short transactions sequences obtained by [Slither](https://github.com/crytic/slither)'s dataflow analysis, and uses symbolic execution more intensely to solve new inputs. The sequence length is incremented at each seeding step. Once it reaches a certain length threshold, `hybrid-echidna` falls back into its normal mode, starts to limit the number of symbolic inputs to solve, and stops using dataflow analysis for seeding the corpus.\n\n### Usage\n\nHybrid echidna can be used seamlessly in place of regular Echidna by replacing `echidna-test` with `hybrid-echidna` in your Echidna command line. \nFor example: \n\n```\nhybrid-echidna MyContract.sol  --test-mode assertion --corpus-dir /tmp/test --contract MyContract\n```\n\nAdditionnal options are available in hybrid mode to control `hybrid-echidna`'s behaviour:\n\n- `--max-iters`: maximum number of fuzzing iterations to perform (one iteration is one Echidna campaign + one symbolic executor run on the corpus)\n\n- `--solver-timeout`: maximum time in milliseconds to spend solving each possible new input\n\n- `--incremental-threshold`: number of initial incremental seeding steps to perform\n\n- `--no-incremental`: skip initial incremental seeding\n\n- `--cov-mode`: type of coverage to increase when solving new inputs. Most coverage modes are implemented for experimental purposes. Unless you are developing/hacking on Optik, we recommend to keep the default mode\n\nDebugging, logging and terminal display:\n\n- `--debug`: add debugging information to the log output\n\n- `--logs`: write logs to a given file (or `stdout`)\n\n- `--no-display`: disable the graphical terminal display\n\n## Installation\n\nFor a quick installation, run:\n\n```console\npython3 -m pip install optik-tools\n```\n\nTo keep up with the latest features and fixes, install Optik from its `master` branch:\n\n```console\ngit clone https://github.com/crytic/optik \u0026\u0026 cd optik\npython3 -m pip install .\n```\n\nYou can also run it from Docker:\n\n```console\ngit clone https://github.com/crytic/optik \u0026\u0026 cd optik\ndocker build -t crytic/optik .\ndocker run -it --rm --mount type=bind,source=\"$(pwd)\",target=/workdir crytic/optik\n# This runs the Docker container, mounting the local directory into /workdir\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrytic%2Foptik","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcrytic%2Foptik","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcrytic%2Foptik/lists"}