Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/mrluit/evm
An ethereum virtual machine (EVM) bytecode decompiler
https://github.com/mrluit/evm
bytecode decompiler ethereum evm solidity typescript
Last synced: 3 days ago
JSON representation
An ethereum virtual machine (EVM) bytecode decompiler
- Host: GitHub
- URL: https://github.com/mrluit/evm
- Owner: MrLuit
- License: mit
- Created: 2018-12-22T21:23:08.000Z (almost 6 years ago)
- Default Branch: master
- Last Pushed: 2023-01-14T00:13:32.000Z (almost 2 years ago)
- Last Synced: 2024-10-13T21:37:07.973Z (about 1 month ago)
- Topics: bytecode, decompiler, ethereum, evm, solidity, typescript
- Language: TypeScript
- Homepage: https://www.npmjs.com/package/evm
- Size: 3.9 MB
- Stars: 169
- Watchers: 7
- Forks: 43
- Open Issues: 31
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# EVM Bytecode Decompiler
[![](https://img.shields.io/travis/com/MrLuit/evm.svg?style=flat-square)](https://travis-ci.com/MrLuit/evm)
[![](https://img.shields.io/npm/v/evm.svg?style=flat-square)](https://www.npmjs.com/package/evm)
[![](https://img.shields.io/david/MrLuit/evm.svg?style=flat-square)](https://david-dm.org/MrLuit/evm)
[![](https://img.shields.io/github/license/MrLuit/evm.svg?style=flat-square)](https://github.com/MrLuit/evm/blob/master/LICENSE)
An [Ethereum Virtual Machine (EVM)](https://medium.com/@jeff.ethereum/optimising-the-ethereum-virtual-machine-58457e61ca15) 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](https://github.com/ethereum/wiki/wiki/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](https://github.com/ethereum/wiki/wiki/Swarm-Hash) (if any) for [contract metadata](https://solidity.readthedocs.io/en/v0.5.2/metadata.html)_
* **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](https://en.wikipedia.org/wiki/Solidity)-like pseudocode_## Examples
### Converting bytecode to opcodes
#### Node.js
```javascript
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
```javascript
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
```javascript
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
```javascript
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
```javascript
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
```javascript
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 */
});
```