Skip to main content

Extracts function selectors and arguments from EVM bytecode

Project description

EVMole

npm PyPI license

Extracts function selectors and arguments from EVM bytecode, even for unverified contracts.

  • Python & JavaScript implementations
  • Clean code with zero dependencies
  • Faster and more accurate than other tools
  • Tested on Solidity and Vyper compiled contracts

Try it online

Usage

JavaScript

$ npm i evmole
import {functionSelectors} from 'evmole'
// Also supported: const e = require('evmole'); e.functionSelectors();

const code = '0x6080604052348015600e575f80fd5b50600436106030575f3560e01c80632125b65b146034578063b69ef8a8146044575b5f80fd5b6044603f3660046046565b505050565b005b5f805f606084860312156057575f80fd5b833563ffffffff811681146069575f80fd5b925060208401356001600160a01b03811681146083575f80fd5b915060408401356001600160e01b0381168114609d575f80fd5b80915050925092509256fea2646970667358221220fbd308f142157eaf0fdc0374a3f95f796b293d35c337d2d9665b76dfc69501ea64736f6c63430008170033'
console.log( functionSelectors(code) )
// Output(list): [ '2125b65b', 'b69ef8a8' ]

console.log( functionArguments(code, '2125b65b') )
// Output(str): 'uint32,address,uint224'

Python

$ pip install evmole --upgrade
from evmole import function_arguments, function_selectors

code = '0x6080604052348015600e575f80fd5b50600436106030575f3560e01c80632125b65b146034578063b69ef8a8146044575b5f80fd5b6044603f3660046046565b505050565b005b5f805f606084860312156057575f80fd5b833563ffffffff811681146069575f80fd5b925060208401356001600160a01b03811681146083575f80fd5b915060408401356001600160e01b0381168114609d575f80fd5b80915050925092509256fea2646970667358221220fbd308f142157eaf0fdc0374a3f95f796b293d35c337d2d9665b76dfc69501ea64736f6c63430008170033'
print( function_selectors(code) )
# Output(list): ['2125b65b', 'b69ef8a8']

print( function_arguments(code, '2125b65b') )
# Output(str): 'uint32,address,uint224'

See examples for more

Benchmark

function selectors

FP/FN - False Positive/False Negative errors; smaller is better

Dataset evmole-js (py) whatsabi evm-hound-rs heimdall-rs simple
largest1k
1000
contracts

24427
functions
FP contracts 1 :1st_place_medal: 38 75 18 95
FN contracts 0 :1st_place_medal: 8 40 103 9
FP functions 192 :2nd_place_medal: 38 :1st_place_medal: 720 600 749
FN functions 0 :1st_place_medal: 8 :2nd_place_medal: 191 116 12
Time 1.8s (1.8s) 3.5s 1.1s 691.7s 1.8s
random50k
50000
contracts

1171102
functions
FP contracts 1 :1st_place_medal: 251 693 waiting fixes 4136
FN contracts 9 :1st_place_medal: 31 2903 77
FP functions 3 :1st_place_medal: 261 10798 14652
FN functions 10 :1st_place_medal: 32 3538 96
Time 17.6s (26.0s) 67.1s 11.9s 34.4s
vyper
780
contracts

21244
functions
FP contracts 0 :1st_place_medal: 178 19 0 185
FN contracts 0 :1st_place_medal: 780 300 780 480
FP functions 0 :1st_place_medal: 181 19 0 197
FN functions 0 :1st_place_medal: 21244 8273 21244 12971
Time 1.3s (1.5s) 2.4s 1.0s 9.9s 1.3s

function arguments

Errors - when at least 1 argument is incorrect: (uint256,string) != (uint256,bytes); smaller is better

Dataset evmole-js (py) heimdall-rs simple
largest1k
1000
contracts

24427
functions
Errors 15.0%, 3664 :1st_place_medal: 42.6%, 10407 58.3%, 14242
Time 6.3s (10.3s) 693.4s 1.2s
random50k
50000
contracts

1171102
functions
Errors 5.4%, 63124 :1st_place_medal: waiting fixes 54.9%, 643213
Time 176.0s (308.1s) 8.8s
vyper
780
contracts

21244
functions
Errors 52.4%, 11123 :1st_place_medal: 100.0%, 21244 56.8%, 12077
Time 7.4s (13.3s) 10.2s 1.0s

See benchmark/README.md for the methodology and commands to reproduce these results

versions: evmole master; 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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

evmole-0.2.2.tar.gz (11.1 kB view hashes)

Uploaded Source

Built Distribution

evmole-0.2.2-py3-none-any.whl (11.4 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page