{"id":13736275,"url":"https://github.com/cdump/evmole","last_synced_at":"2025-05-14T19:10:06.785Z","repository":{"id":209119188,"uuid":"723294223","full_name":"cdump/evmole","owner":"cdump","description":"Extracts function selectors, arguments, state mutability and storage layout from EVM bytecode, even for unverified contracts","archived":false,"fork":false,"pushed_at":"2025-04-29T06:43:16.000Z","size":853,"stargazers_count":381,"open_issues_count":3,"forks_count":25,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-04-29T07:41:12.630Z","etag":null,"topics":["bytecode","ethereum","evm","solidity","web3"],"latest_commit_sha":null,"homepage":"https://evmole.xyz","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cdump.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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,"zenodo":null}},"created_at":"2023-11-25T07:50:16.000Z","updated_at":"2025-04-29T06:43:19.000Z","dependencies_parsed_at":"2024-01-03T13:38:03.980Z","dependency_job_id":"86111841-4ee6-450e-a833-16d7a9c57fea","html_url":"https://github.com/cdump/evmole","commit_stats":null,"previous_names":["cdump/evmole"],"tags_count":24,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cdump%2Fevmole","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cdump%2Fevmole/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cdump%2Fevmole/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cdump%2Fevmole/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cdump","download_url":"https://codeload.github.com/cdump/evmole/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254209859,"owners_count":22032897,"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":["bytecode","ethereum","evm","solidity","web3"],"created_at":"2024-08-03T03:01:18.604Z","updated_at":"2025-05-14T19:10:04.336Z","avatar_url":"https://github.com/cdump.png","language":"Rust","readme":"# EVMole\n\n[![try it online](https://img.shields.io/badge/Try_It_Online-evmole.xyz-brightgreen)](https://evmole.xyz/)\n[![npm](https://img.shields.io/npm/v/evmole)](https://www.npmjs.com/package/evmole)\n[![Crates.io](https://img.shields.io/crates/v/evmole?color=e9b44f)](https://crates.io/crates/evmole)\n[![PyPI](https://img.shields.io/pypi/v/evmole?color=006dad)](https://pypi.org/project/evmole)\n\nEVMole is a powerful library that extracts information from Ethereum Virtual Machine (EVM) bytecode, including [function selectors](https://docs.soliditylang.org/en/latest/abi-spec.html#function-selector), arguments, [state mutability](https://docs.soliditylang.org/en/latest/contracts.html#state-mutability), and storage layout, even for unverified contracts.\n\n\n## Key Features\n\n- Multi-language support: Available as [JavaScript](#javascript), [Rust](#rust), and [Python](#python) libraries.\n- High accuracy and performance: [Outperforms](#benchmark) existing tools.\n- Broad compatibility: Tested with both Solidity and Vyper compiled contracts.\n- Lightweight: Clean codebase with minimal external dependencies.\n- Unverified contract analysis: Extracts information even from unverified bytecode.\n\n\n## Usage\n### JavaScript\n[API documentation](./javascript/#api) and [usage examples](./javascript#usage) (node, vite, webpack, parcel, esbuild)\n```sh\n$ npm i evmole\n```\n```javascript\nimport { contractInfo } from 'evmole'\n\nconst code = '0x6080604052348015600e575f80fd5b50600436106030575f3560e01c80632125b65b146034578063b69ef8a8146044575b5f80fd5b6044603f3660046046565b505050565b005b5f805f606084860312156057575f80fd5b833563ffffffff811681146069575f80fd5b925060208401356001600160a01b03811681146083575f80fd5b915060408401356001600160e01b0381168114609d575f80fd5b80915050925092509256'\n\nconsole.log( contractInfo(code, {selectors:true, arguments:true, stateMutability:true}) )\n// {\n//   functions: [\n//     {\n//       selector: '2125b65b',\n//       bytecodeOffset: 52,\n//       arguments: 'uint32,address,uint224',\n//       stateMutability: 'pure'\n//     },\n//     ...\n```\n\n### Rust\nDocumentation is available on [docs.rs](https://docs.rs/evmole/latest/evmole/)\n```rust\nlet code = hex::decode(\"6080604052348015600e575f80fd5b50600436106030575f3560e01c80632125b65b146034578063b69ef8a8146044575b5f80fd5b6044603f3660046046565b505050565b005b5f805f606084860312156057575f80fd5b833563ffffffff811681146069575f80fd5b925060208401356001600160a01b03811681146083575f80fd5b915060408401356001600160e01b0381168114609d575f80fd5b80915050925092509256\").unwrap();\n\nprintln!(\"{:?}\", evmole::contract_info(\n    evmole::ContractInfoArgs::new(\u0026code)\n        .with_selectors()\n        .with_arguments()\n        .with_state_mutability()\n    )\n);\n// Contract {\n//     functions: Some([\n//         Function {\n//             selector: [33, 37, 182, 91],\n//             bytecode_offset: 52,\n//             arguments: Some([Uint(32), Address, Uint(224)]),\n//             state_mutability: Some(Pure)\n//         },\n//         ...\n```\n\n### Python\n[API documentation](./python/#api)\n```sh\n$ pip install evmole --upgrade\n```\n```python\nfrom evmole import contract_info\n\ncode = '0x6080604052348015600e575f80fd5b50600436106030575f3560e01c80632125b65b146034578063b69ef8a8146044575b5f80fd5b6044603f3660046046565b505050565b005b5f805f606084860312156057575f80fd5b833563ffffffff811681146069575f80fd5b925060208401356001600160a01b03811681146083575f80fd5b915060408401356001600160e01b0381168114609d575f80fd5b80915050925092509256'\n\nprint( contract_info(code, selectors=True, arguments=True, state_mutability=True) )\n# Contract(\n#     functions=[\n#     Function(\n#             selector=2125b65b,\n#             bytecode_offset=52,\n#             arguments=uint32,address,uint224,\n#             state_mutability=pure),\n#     ...\n```\n\n### Foundry\n\u003ca href=\"https://getfoundry.sh/\"\u003eFoundy's cast\u003c/a\u003e uses the Rust implementation of EVMole\n```sh\n\n$ cast selectors $(cast code 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2)\n0x06fdde03                           view\n0x095ea7b3  address,uint256          nonpayable\n0x18160ddd                           view\n0x23b872dd  address,address,uint256  nonpayable\n...\n\n$ cast selectors --resolve $(cast code 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2)\n0x06fdde03                           view        name()\n0x095ea7b3  address,uint256          nonpayable  approve(address,uint256)\n0x18160ddd                           view        totalSupply()\n0x23b872dd  address,address,uint256  nonpayable  transferFrom(address,address,uint256)\n...\n```\n\n## Benchmark\n\n### function selectors\n\u003ci\u003eFP/FN\u003c/i\u003e - [False Positive/False Negative](https://en.wikipedia.org/wiki/False_positives_and_false_negatives) errors; \u003cb\u003esmaller is better\u003c/b\u003e\n\n\u003ctable\u003e\n \u003ctr\u003e\n  \u003ctd\u003eDataset\u003c/td\u003e\n  \u003ctd\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003cb\u003e\u003ci\u003eevmole\u003c/i\u003e\u003cb\u003e \u003ca href=\"benchmark/providers/evmole-rs/\"\u003e\u003cb\u003e\u003ci\u003ers\u003c/i\u003e\u003c/b\u003e\u003c/a\u003e · \u003ca href=\"benchmark/providers/evmole-js/\"\u003e\u003cb\u003e\u003ci\u003ejs\u003c/i\u003e\u003c/b\u003e\u003c/a\u003e · \u003ca href=\"benchmark/providers/evmole-py/\"\u003e\u003cb\u003e\u003ci\u003epy\u003c/i\u003e\u003c/b\u003e\u003c/a\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003ca href=\"benchmark/providers/whatsabi/\"\u003e\u003cb\u003e\u003ci\u003ewhatsabi\u003c/i\u003e\u003c/b\u003e\u003c/a\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003ca href=\"benchmark/providers/sevm/\"\u003e\u003cb\u003e\u003ci\u003esevm\u003c/i\u003e\u003c/b\u003e\u003c/a\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003ca href=\"benchmark/providers/evm-hound-rs/\"\u003e\u003cb\u003e\u003ci\u003eevmhound\u003c/i\u003e\u003c/b\u003e\u003c/a\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003ca href=\"benchmark/providers/heimdall-rs/\"\u003e\u003cb\u003e\u003ci\u003eheimdall\u003c/i\u003e\u003c/b\u003e\u003c/a\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003ca href=\"benchmark/providers/simple/\"\u003e\u003cb\u003e\u003ci\u003esmpl\u003c/i\u003e\u003c/b\u003e\u003c/a\u003e\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd rowspan=\"5\"\u003e\u003cb\u003elargest1k\u003c/b\u003e\u003cbr\u003e\u003csub\u003e1000\u003cbr\u003eaddresses\u003cbr\u003e\u003cbr\u003e24427\u003cbr\u003efunctions\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003ci\u003eFP \u003csub\u003eaddrs\u003c/sub\u003e\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e1 🥈\u003c/td\u003e\n  \u003ctd\u003e0 🥇\u003c/td\u003e\n  \u003ctd\u003e0 🥇\u003c/td\u003e\n  \u003ctd\u003e75\u003c/td\u003e\n  \u003ctd\u003e18\u003c/td\u003e\n  \u003ctd\u003e95\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\u003ci\u003eFN \u003csub\u003eaddrs\u003c/sub\u003e\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e0 🥇\u003c/td\u003e\n  \u003ctd\u003e0 🥇\u003c/td\u003e\n  \u003ctd\u003e0 🥇\u003c/td\u003e\n  \u003ctd\u003e40\u003c/td\u003e\n  \u003ctd\u003e103\u003c/td\u003e\n  \u003ctd\u003e9\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\u003ci\u003eFP \u003csub\u003efuncs\u003c/sub\u003e\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e192 🥈\u003c/td\u003e\n  \u003ctd\u003e0 🥇\u003c/td\u003e\n  \u003ctd\u003e0 🥇\u003c/td\u003e\n  \u003ctd\u003e720\u003c/td\u003e\n  \u003ctd\u003e600\u003c/td\u003e\n  \u003ctd\u003e749\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\u003ci\u003eFN \u003csub\u003efuncs\u003c/sub\u003e\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e0 🥇\u003c/td\u003e\n  \u003ctd\u003e0 🥇\u003c/td\u003e\n  \u003ctd\u003e0 🥇\u003c/td\u003e\n  \u003ctd\u003e191\u003c/td\u003e\n  \u003ctd\u003e114\u003c/td\u003e\n  \u003ctd\u003e12\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\u003ci\u003eTime\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e19ms · 0.3s · 25ms\u003c/td\u003e\n  \u003ctd\u003e2.3s\u003c/td\u003e\n  \u003ctd\u003e37s\u003csup\u003e(*)\u003c/sup\u003e\u003c/td\u003e\n  \u003ctd\u003e63ms\u003c/td\u003e\n  \u003ctd\u003e371s\u003csup\u003e(*)\u003c/sup\u003e\u003c/td\u003e\n  \u003ctd\u003e1ms\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\u003ctd colspan=\"8\"\u003e\u003c/td\u003e\u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd rowspan=\"5\"\u003e\u003cb\u003erandom50k\u003c/b\u003e\u003cbr\u003e\u003csub\u003e50000\u003cbr\u003eaddresses\u003cbr\u003e\u003cbr\u003e1171102\u003cbr\u003efunctions\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003ci\u003eFP \u003csub\u003eaddrs\u003c/sub\u003e\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e1 🥇\u003c/td\u003e\n  \u003ctd\u003e43\u003c/td\u003e\n  \u003ctd\u003e1\u003c/td\u003e\n  \u003ctd\u003e693\u003c/td\u003e\n  \u003ctd\u003e3\u003c/td\u003e\n  \u003ctd\u003e4136\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\u003ci\u003eFN \u003csub\u003eaddrs\u003c/sub\u003e\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e9 🥇\u003c/td\u003e\n  \u003ctd\u003e11\u003c/td\u003e\n  \u003ctd\u003e10\u003c/td\u003e\n  \u003ctd\u003e2903\u003c/td\u003e\n  \u003ctd\u003e4669\u003c/td\u003e\n  \u003ctd\u003e77\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\u003ci\u003eFP \u003csub\u003efuncs\u003c/sub\u003e\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e3 🥇\u003c/td\u003e\n  \u003ctd\u003e51\u003c/td\u003e\n  \u003ctd\u003e3\u003c/td\u003e\n  \u003ctd\u003e10798\u003c/td\u003e\n  \u003ctd\u003e29\u003c/td\u003e\n  \u003ctd\u003e14652\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\u003ci\u003eFN \u003csub\u003efuncs\u003c/sub\u003e\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e10 🥇\u003c/td\u003e\n  \u003ctd\u003e12\u003c/td\u003e\n  \u003ctd\u003e11\u003c/td\u003e\n  \u003ctd\u003e3538\u003c/td\u003e\n  \u003ctd\u003e4943\u003c/td\u003e\n  \u003ctd\u003e96\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\u003ci\u003eTime\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e0.5s · 4.7s · 0.8s\u003c/td\u003e\n  \u003ctd\u003e46s\u003c/td\u003e\n  \u003ctd\u003e2304s\u003csup\u003e(*)\u003c/sup\u003e\u003c/td\u003e\n  \u003ctd\u003e1.9s\u003c/td\u003e\n  \u003ctd\u003e8684s\u003csup\u003e(*)\u003c/sup\u003e\u003c/td\u003e\n  \u003ctd\u003e50ms\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\u003ctd colspan=\"8\"\u003e\u003c/td\u003e\u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd rowspan=\"5\"\u003e\u003cb\u003evyper\u003c/b\u003e\u003cbr\u003e\u003csub\u003e780\u003cbr\u003eaddresses\u003cbr\u003e\u003cbr\u003e21244\u003cbr\u003efunctions\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003ci\u003eFP \u003csub\u003eaddrs\u003c/sub\u003e\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e0 🥇\u003c/td\u003e\n  \u003ctd\u003e30\u003c/td\u003e\n  \u003ctd\u003e0\u003c/td\u003e\n  \u003ctd\u003e19\u003c/td\u003e\n  \u003ctd\u003e0\u003c/td\u003e\n  \u003ctd\u003e185\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\u003ci\u003eFN \u003csub\u003eaddrs\u003c/sub\u003e\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e0 🥇\u003c/td\u003e\n  \u003ctd\u003e780\u003c/td\u003e\n  \u003ctd\u003e0\u003c/td\u003e\n  \u003ctd\u003e300\u003c/td\u003e\n  \u003ctd\u003e780\u003c/td\u003e\n  \u003ctd\u003e480\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\u003ci\u003eFP \u003csub\u003efuncs\u003c/sub\u003e\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e0 🥇\u003c/td\u003e\n  \u003ctd\u003e30\u003c/td\u003e\n  \u003ctd\u003e0\u003c/td\u003e\n  \u003ctd\u003e19\u003c/td\u003e\n  \u003ctd\u003e0\u003c/td\u003e\n  \u003ctd\u003e197\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\u003ci\u003eFN \u003csub\u003efuncs\u003c/sub\u003e\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e0 🥇\u003c/td\u003e\n  \u003ctd\u003e21244\u003c/td\u003e\n  \u003ctd\u003e0\u003c/td\u003e\n  \u003ctd\u003e8273\u003c/td\u003e\n  \u003ctd\u003e21244\u003c/td\u003e\n  \u003ctd\u003e12971\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\u003ci\u003eTime\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e9ms · 0.1s · 13ms\u003c/td\u003e\n  \u003ctd\u003e1.6s\u003c/td\u003e\n  \u003ctd\u003e42s\u003csup\u003e(*)\u003c/sup\u003e\u003c/td\u003e\n  \u003ctd\u003e32ms\u003c/td\u003e\n  \u003ctd\u003e28s\u003csup\u003e(*)\u003c/sup\u003e\u003c/td\u003e\n  \u003ctd\u003e780µs\u003c/td\u003e\n \u003c/tr\u003e\n\u003c/table\u003e\n\n### function arguments\n\u003ci\u003eErrors\u003c/i\u003e - when at least 1 argument is incorrect: `(uint256,string)` ≠ `(uint256,bytes)`\n\n\u003ctable\u003e\n \u003ctr\u003e\n  \u003ctd\u003eDataset\u003c/td\u003e\n  \u003ctd\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003cb\u003e\u003ci\u003eevmole\u003c/i\u003e\u003cb\u003e \u003ca href=\"benchmark/providers/evmole-rs/\"\u003e\u003cb\u003e\u003ci\u003ers\u003c/i\u003e\u003c/b\u003e\u003c/a\u003e · \u003ca href=\"benchmark/providers/evmole-js/\"\u003e\u003cb\u003e\u003ci\u003ejs\u003c/i\u003e\u003c/b\u003e\u003c/a\u003e · \u003ca href=\"benchmark/providers/evmole-py/\"\u003e\u003cb\u003e\u003ci\u003epy\u003c/i\u003e\u003c/b\u003e\u003c/a\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003ca href=\"benchmark/providers/heimdall-rs/\"\u003e\u003cb\u003e\u003ci\u003eheimdall\u003c/i\u003e\u003c/b\u003e\u003c/a\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003ca href=\"benchmark/providers/simple/\"\u003e\u003cb\u003e\u003ci\u003esmpl\u003c/i\u003e\u003c/b\u003e\u003c/a\u003e\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd rowspan=\"2\"\u003e\u003cb\u003elargest1k\u003c/b\u003e\u003cbr\u003e\u003csub\u003e24427\u003cbr\u003efunctions\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003ci\u003eErrors\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e14.0% 🥇\u003cbr\u003e\u003csub\u003e3410\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e31.1%\u003cbr\u003e\u003csub\u003e7603\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e58.3%\u003cbr\u003e\u003csub\u003e14242\u003c/sub\u003e\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\u003ci\u003eTime\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e0.6s · 2.0s · 0.6s\u003c/td\u003e\n  \u003ctd\u003e370s\u003csup\u003e(*)\u003c/sup\u003e\u003c/td\u003e\n  \u003ctd\u003e1ms\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\u003ctd colspan=\"5\"\u003e\u003c/td\u003e\u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd rowspan=\"2\"\u003e\u003cb\u003erandom50k\u003c/b\u003e\u003cbr\u003e\u003csub\u003e1171102\u003cbr\u003efunctions\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003ci\u003eErrors\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e4.5% 🥇\u003cbr\u003e\u003csub\u003e52670\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e19.4%\u003cbr\u003e\u003csub\u003e227077\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e54.9%\u003cbr\u003e\u003csub\u003e643213\u003c/sub\u003e\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\u003ci\u003eTime\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e17s · 55s · 19s\u003c/td\u003e\n  \u003ctd\u003e8579s\u003csup\u003e(*)\u003c/sup\u003e\u003c/td\u003e\n  \u003ctd\u003e50ms\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\u003ctd colspan=\"5\"\u003e\u003c/td\u003e\u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd rowspan=\"2\"\u003e\u003cb\u003evyper\u003c/b\u003e\u003cbr\u003e\u003csub\u003e21244\u003cbr\u003efunctions\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003ci\u003eErrors\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e48.5% 🥇\u003cbr\u003e\u003csub\u003e10299\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e100.0%\u003cbr\u003e\u003csub\u003e21244\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e56.8%\u003cbr\u003e\u003csub\u003e12077\u003c/sub\u003e\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\u003ci\u003eTime\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e0.4s · 1.6s · 0.5s\u003c/td\u003e\n  \u003ctd\u003e29s\u003csup\u003e(*)\u003c/sup\u003e\u003c/td\u003e\n  \u003ctd\u003e780µs\u003c/td\u003e\n \u003c/tr\u003e\n\u003c/table\u003e\n\n### function state mutability\n\n\u003ci\u003eErrors\u003c/i\u003e - Results are not equal (treating `view` and `pure` as equivalent to `nonpayable`)\n\n\u003ci\u003eErrors strict\u003c/i\u003e - Results are strictly unequal (`nonpayable` ≠ `view`). Some ABIs mark `pure`/`view` functions as `nonpayable`, so not all strict errors indicate real issues.\n\n\u003ctable\u003e\n \u003ctr\u003e\n  \u003ctd\u003eDataset\u003c/td\u003e\n  \u003ctd\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003cb\u003e\u003ci\u003eevmole\u003c/i\u003e\u003cb\u003e \u003ca href=\"benchmark/providers/evmole-rs/\"\u003e\u003cb\u003e\u003ci\u003ers\u003c/i\u003e\u003c/b\u003e\u003c/a\u003e · \u003ca href=\"benchmark/providers/evmole-js/\"\u003e\u003cb\u003e\u003ci\u003ejs\u003c/i\u003e\u003c/b\u003e\u003c/a\u003e · \u003ca href=\"benchmark/providers/evmole-py/\"\u003e\u003cb\u003e\u003ci\u003epy\u003c/i\u003e\u003c/b\u003e\u003c/a\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003ca href=\"benchmark/providers/whatsabi/\"\u003e\u003cb\u003e\u003ci\u003ewhatsabi\u003c/i\u003e\u003c/b\u003e\u003c/a\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003ca href=\"benchmark/providers/sevm/\"\u003e\u003cb\u003e\u003ci\u003esevm\u003c/i\u003e\u003c/b\u003e\u003c/a\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003ca href=\"benchmark/providers/heimdall-rs/\"\u003e\u003cb\u003e\u003ci\u003eheimdall\u003c/i\u003e\u003c/b\u003e\u003c/a\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003ca href=\"benchmark/providers/simple/\"\u003e\u003cb\u003e\u003ci\u003esmpl\u003c/i\u003e\u003c/b\u003e\u003c/a\u003e\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd rowspan=\"3\"\u003e\u003cb\u003elargest1k\u003c/b\u003e\u003cbr\u003e\u003csub\u003e24427\u003cbr\u003efunctions\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003ci\u003eErrors\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e0.0% 🥇\u003cbr\u003e\u003csub\u003e0\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e68.1%\u003cbr\u003e\u003csub\u003e16623\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e2.1%\u003cbr\u003e\u003csub\u003e501\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e25.7%\u003cbr\u003e\u003csub\u003e6268\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e2.6%\u003cbr\u003e\u003csub\u003e643\u003c/sub\u003e\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\u003ci\u003eErrors strict\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e18.6% 🥇\u003cbr\u003e\u003csub\u003e4555\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e79.4%\u003cbr\u003e\u003csub\u003e19393\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e59.0%\u003cbr\u003e\u003csub\u003e14417\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e54.8%\u003cbr\u003e\u003csub\u003e13386\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e60.9%\u003cbr\u003e\u003csub\u003e14864\u003c/sub\u003e\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\u003ci\u003eTime\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e9.5s · 14s · 9.4s\u003c/td\u003e\n  \u003ctd\u003e3.0s\u003c/td\u003e\n  \u003ctd\u003e41s\u003csup\u003e(*)\u003c/sup\u003e\u003c/td\u003e\n  \u003ctd\u003e371s\u003csup\u003e(*)\u003c/sup\u003e\u003c/td\u003e\n  \u003ctd\u003e1ms\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\u003ctd colspan=\"6\"\u003e\u003c/td\u003e\u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd rowspan=\"3\"\u003e\u003cb\u003erandom50k\u003c/b\u003e\u003cbr\u003e\u003csub\u003e1160861\u003cbr\u003efunctions\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003ci\u003eErrors\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e0.0% 🥇\u003cbr\u003e\u003csub\u003e44\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e30.2%\u003cbr\u003e\u003csub\u003e351060\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e0.3%\u003cbr\u003e\u003csub\u003e3370\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e11.5%\u003cbr\u003e\u003csub\u003e133471\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e2.2%\u003cbr\u003e\u003csub\u003e24961\u003c/sub\u003e\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\u003ci\u003eErrors strict\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e6.8% 🥇\u003cbr\u003e\u003csub\u003e78923\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e58.2%\u003cbr\u003e\u003csub\u003e675111\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e55.7%\u003cbr\u003e\u003csub\u003e646831\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e27.6%\u003cbr\u003e\u003csub\u003e320264\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e57.7%\u003cbr\u003e\u003csub\u003e670318\u003c/sub\u003e\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\u003ci\u003eTime\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e183s · 276s · 187s\u003c/td\u003e\n  \u003ctd\u003e79s\u003c/td\u003e\n  \u003ctd\u003e2176s\u003csup\u003e(*)\u003c/sup\u003e\u003c/td\u003e\n  \u003ctd\u003e8334s\u003csup\u003e(*)\u003c/sup\u003e\u003c/td\u003e\n  \u003ctd\u003e50ms\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\u003ctd colspan=\"6\"\u003e\u003c/td\u003e\u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd rowspan=\"3\"\u003e\u003cb\u003evyper\u003c/b\u003e\u003cbr\u003e\u003csub\u003e21166\u003cbr\u003efunctions\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003ci\u003eErrors\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e0.5% 🥇\u003cbr\u003e\u003csub\u003e110\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e100.0%\u003cbr\u003e\u003csub\u003e21166\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e76.3%\u003cbr\u003e\u003csub\u003e16150\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e100.0%\u003cbr\u003e\u003csub\u003e21166\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e1.8%\u003cbr\u003e\u003csub\u003e390\u003c/sub\u003e\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\u003ci\u003eErrors strict\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e4.0% 🥇\u003cbr\u003e\u003csub\u003e854\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e100.0%\u003cbr\u003e\u003csub\u003e21166\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e90.2%\u003cbr\u003e\u003csub\u003e19092\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e100.0%\u003cbr\u003e\u003csub\u003e21166\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e59.6%\u003cbr\u003e\u003csub\u003e12610\u003c/sub\u003e\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\u003ci\u003eTime\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e9.8s · 12s · 9.6s\u003c/td\u003e\n  \u003ctd\u003e1.7s\u003c/td\u003e\n  \u003ctd\u003e38s\u003csup\u003e(*)\u003c/sup\u003e\u003c/td\u003e\n  \u003ctd\u003e29s\u003csup\u003e(*)\u003c/sup\u003e\u003c/td\u003e\n  \u003ctd\u003e780µs\u003c/td\u003e\n \u003c/tr\u003e\n\u003c/table\u003e\n\n### Control Flow Graph\n\n\u003ci\u003eFalse Negatives\u003c/i\u003e - Valid blocks possibly incorrectly marked unreachable by CFG analysis. Lower count usually indicates better precision.\n\n\u003ctable\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003ca href=\"benchmark/providers/evmole-rs\"\u003e\u003cb\u003e\u003ci\u003eevmole\u003c/i\u003e\u003c/b\u003e\u003c/a\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003ca href=\"benchmark/providers/ethersolve\"\u003e\u003cb\u003e\u003ci\u003eethersolve\u003c/i\u003e\u003c/b\u003e\u003c/a\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003ca href=\"benchmark/providers/evm-cfg\"\u003e\u003cb\u003e\u003ci\u003eevm-cfg\u003c/i\u003e\u003c/b\u003e\u003c/a\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003ca href=\"benchmark/providers/sevm\"\u003e\u003cb\u003e\u003ci\u003esevm\u003c/i\u003e\u003c/b\u003e\u003c/a\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003ca href=\"benchmark/providers/heimdall-rs\"\u003e\u003cb\u003e\u003ci\u003eheimdall-rs\u003c/i\u003e\u003c/b\u003e\u003c/a\u003e\u003c/td\u003e\n  \u003ctd\u003e\u003ca href=\"benchmark/providers/evm-cfg-builder\"\u003e\u003cb\u003e\u003ci\u003eevm-cfg-builder\u003c/i\u003e\u003c/b\u003e\u003c/a\u003e\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\u003ci\u003eBasic Blocks\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e97.0% 🥇\u003cbr\u003e\u003csub\u003e661959\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e93.7%\u003cbr\u003e\u003csub\u003e639175\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e63.0%\u003cbr\u003e\u003csub\u003e430011\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e41.4%\u003cbr\u003e\u003csub\u003e282599\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e31.9%\u003cbr\u003e\u003csub\u003e217924\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e21.7%\u003cbr\u003e\u003csub\u003e148166\u003c/sub\u003e\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\u003ci\u003eFalse Negatives\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e3.0% 🥇\u003cbr\u003e\u003csub\u003e20482\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e6.3%\u003cbr\u003e\u003csub\u003e43266\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e37.0%\u003cbr\u003e\u003csub\u003e252430\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e58.6%\u003cbr\u003e\u003csub\u003e399842\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e68.1%\u003cbr\u003e\u003csub\u003e464517\u003c/sub\u003e\u003c/td\u003e\n  \u003ctd\u003e78.3%\u003cbr\u003e\u003csub\u003e534275\u003c/sub\u003e\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n  \u003ctd\u003e\u003ci\u003eTime\u003c/i\u003e\u003c/td\u003e\n  \u003ctd\u003e34s\u003c/td\u003e\n  \u003ctd\u003e1202s\u003c/td\u003e\n  \u003ctd\u003e40s\u003c/td\u003e\n  \u003ctd\u003e42s\u003c/td\u003e\n  \u003ctd\u003e206s\u003c/td\u003e\n  \u003ctd\u003e308s\u003c/td\u003e\n \u003c/tr\u003e\n\u003c/table\u003e\n\ndataset largest1k, 1000 contracts, 682,441 blocks\n\n### notes\n\nSee [benchmark/README.md](./benchmark/) for the methodology and commands to reproduce these results\n\n\u003ci\u003eversions: evmole v0.7.2; \u003ca href=\"https://github.com/shazow/whatsabi\"\u003ewhatsabi\u003c/a\u003e v0.19.0; \u003ca href=\"https://github.com/acuarica/evm\"\u003esevm\u003c/a\u003e v0.7.4; \u003ca href=\"https://github.com/g00dv1n/evm-hound-rs\"\u003eevm-hound-rs\u003c/a\u003e v0.1.4; \u003ca href=\"https://github.com/Jon-Becker/heimdall-rs\"\u003eheimdall-rs\u003c/a\u003e v0.8.6\u003c/i\u003e\n\n\u003csup\u003e(*)\u003c/sup\u003e: \u003cb\u003esevm\u003c/b\u003e and \u003cb\u003eheimdall-rs\u003c/b\u003e are full decompilers, not limited to extracting function selectors\n\n## How it works\n\nShort: Executes code with a custom EVM and traces CALLDATA usage.\n\nLong: TODO\n\n## License\nMIT\n","funding_links":[],"categories":["Software Development","I - Tools List","Rust"],"sub_categories":["Risk Management"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcdump%2Fevmole","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcdump%2Fevmole","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcdump%2Fevmole/lists"}