EVMole
This library extracts function selectors and arguments from Ethereum Virtual Machine (EVM) bytecode, even for unverified contracts.
- JavaScript, Rust and Python implementations
- Clean code with zero external dependencies (py & js)
- Faster and more accurate than other existing tools
- Tested on Solidity and Vyper compiled contracts
Usage
JavaScript
import from 'evmole'
// Also supported: const e = require('evmole'); e.functionSelectors();
const code = '0x6080604052348015600e575f80fd5b50600436106030575f3560e01c80632125b65b146034578063b69ef8a8146044575b5f80fd5b6044603f3660046046565b505050565b005b5f805f606084860312156057575f80fd5b833563ffffffff811681146069575f80fd5b925060208401356001600160a01b03811681146083575f80fd5b915060408401356001600160e01b0381168114609d575f80fd5b80915050925092509256fea2646970667358221220fbd308f142157eaf0fdc0374a3f95f796b293d35c337d2d9665b76dfc69501ea64736f6c63430008170033'
console.log
// Output(list): [ '2125b65b', 'b69ef8a8' ]
console.log
// Output(str): 'uint32,address,uint224'
Rust
Documentation available on docs.rs
let code = decode.unwrap;
println!;
// Output(Vec<[u8;4]>): [[21, 25, b6, 5b], [b6, 9e, f8, a8]]
println!;
// Output(String): uint32,address,uint224
Python
=
# Output(list): ['2125b65b', 'b69ef8a8']
# Output(str): 'uint32,address,uint224'
See examples for more
Benchmark
function selectors
FP/FN - False Positive/False Negative errors; smaller is better
function arguments
Errors - when at least 1 argument is incorrect: (uint256,string) != (uint256,bytes); smaller is better
See benchmark/README.md for the methodology and commands to reproduce these results
versions: evmole v0.3.0; whatsabi v0.9.1; evm-hound-rs v0.1.4; heimdall-rs v0.7.1
How it works
Short: Executes code with a custom EVM and traces CALLDATA usage.
Long: TODO
License
MIT