An Ethereum Virtual Machine (EVM) interpreter and decompiler, along with several other utils for programmatically extracting information from bytecode.
npm i evm
- Converting bytecode to opcodes
- Reading information like events or functions from either bytecode or tx data
- Extracting the swarm hash (if any) from bytecode
- getBytecode() - Get raw bytecode (not really useful; same as input)
- getOpcodes() - Returns opcodes including pc and pushData (if included)
- getFunctions() - Parse functions from their signatures in bytecode
- getEvents() - Parse events from their signatures in bytecode
- getJumpDestinations() - Get array of program counters from JUMPDEST opcodes
- getSwarmHash() - Get Swarm hash (if any) for contract metadata
- reset() - Reset the EVM state (stack, memory, etc.)
- parse() - Interpret opcodes by looping over them, returns array of interpreted opcodes
- decompile() - Decompile bytecode into readable Solidity-like pseudocode
const { EVM } = require("evm"); const Web3 = require('web3'); const web3 = new Web3(new Web3.providers.HttpProvider("https://api.mycryptoapi.com/eth")); web3.eth.getCode("0x06012c8cf97BEaD5deAe237070F9587f8E7A266d").then(code => { /* CryptoKitties contract */ const evm = new EVM(code); console.log(evm.getOpcodes()); /* Get opcodes */ });
const { EVM } = window.EVM_Utils; const web3 = new Web3(window.web3.currentProvider); web3.eth.getCode("0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359", function(err,code) { /* DAI contract */ if(err) throw err; const evm = new EVM(code); console.log(evm.getOpcodes()); /* Get opcodes */ });
const { EVM } = require("evm"); const Web3 = require('web3'); const web3 = new Web3(new Web3.providers.HttpProvider("https://api.mycryptoapi.com/eth")); web3.eth.getCode("0x06012c8cf97BEaD5deAe237070F9587f8E7A266d").then(code => { /* CryptoKitties contract */ const evm = new EVM(code); console.log(evm.getFunctions()); /* Get functions */ console.log(evm.getEvents()); /* Get events */ console.log(evm.decompile()); /* Decompile bytecode */ });
const { EVM } = window.EVM; const web3 = new Web3(window.web3.currentProvider); web3.eth.getCode("0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359", function(err,code) { /* DAI contract */ if(err) throw err; const evm = new EVM(code); console.log(evm.getFunctions()); /* Get functions */ console.log(evm.getEvents()); /* Get events */ console.log(evm.decompile()); /* Decompile bytecode */ });
const { Transaction } = require("evm"); const Web3 = require('web3'); const web3 = new Web3(new Web3.providers.HttpProvider("https://api.mycryptoapi.com/eth")); web3.eth.getTransaction("0xd20a8d888a3f29471ea41ea77cc2d95ccd79ade1eaad059e83524e72b9adf962").then(transactionData => { const transaction = new Transaction(); transaction.setInput(transactionData.input); console.log(transaction.getFunction()); /* Get function */ });
const { Transaction } = window.EVM; const web3 = new Web3(window.web3.currentProvider); web3.eth.getTransaction("0xd20a8d888a3f29471ea41ea77cc2d95ccd79ade1eaad059e83524e72b9adf962", function(err,transactionData) { if(err) throw err; const transaction = new Transaction(); transaction.setInput(transactionData.input); console.log(transaction.getFunction()); /* Get function */ });