Skip to content

Latest commit

 

History

History
116 lines (93 loc) · 4.41 KB

README.md

File metadata and controls

116 lines (93 loc) · 4.41 KB

EVM Bytecode Decompiler

An Ethereum Virtual Machine (EVM) interpreter and decompiler, along with several other utils for programmatically extracting information from bytecode.

Usage

npm i evm

Features

  • Converting bytecode to opcodes
  • Reading information like events or functions from either bytecode or tx data
  • Extracting the swarm hash (if any) from bytecode

API

Methods

  • 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

Examples

Converting bytecode to opcodes

Node.js

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 */
});

Browser

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 */
});

Decompiling a contract

Node.js

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 */
});

Browser

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 */
});

Extracting data from transaction

Node.js

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 */
});

Browser

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 */
});