ethereumjs/ethereumjs-monorepo

Ethereum L1 Protocol Stack and EVM in TypeScript

TypeScript

2,758

7,627 commits

updated Oct 12, 2026

See the code

README

EthereumJS

EthereumJS package layers: execution, state, protocol, configuration, codec

EthereumJS Monorepo

Modular TypeScript libraries for Ethereum execution-layer protocol work.

Code Coverage Discord

Composable, spec-tested building blocks for the Ethereum execution layer: EVM execution, transactions, blocks, state, tries, and chain configuration. Use them in Node.js or the browser — tree-shakeable, Noble crypto by default, WASM-free unless you opt in.

  • Spec-tested execution — tracks mainnet hardforks (status ↓)
  • Composable primitives — mix tx, block, mpt, statemanager, and friends instead of pulling in a full client
  • Browser-ready — controlled dependency set; package READMEs cover bundler and KZG setup where needed

Maintained by former members of the Ethereum Foundation JavaScript team and the broader Ethereum community.

Hardfork status

ForkStatus
OsakaMainnet today — stable on npm
AmsterdamIn development - see status here

What do you want to do?

GoalStart herenpm package
Run a signed tx, replay a block, or build a blockpackages/vm@ethereumjs/vm
Execute bytecode, custom opcodes, or precompilespackages/evm@ethereumjs/evm
Create, sign, or parse transactionspackages/tx@ethereumjs/tx
Blocks, headers, withdrawalspackages/block@ethereumjs/block
Persistent chain storagepackages/blockchain@ethereumjs/blockchain
Merkle proofs and trie toolingpackages/mpt@ethereumjs/mpt
Chain config and hardfork parameterspackages/common@ethereumjs/common
flowchart TD
  start[What_are_you_building]
  start --> txRules[Tx_and_block_rules]
  start --> bytecode[Bytecode_only]
  start --> chainData[Chain_storage_or_types]

  txRules --> vmPkg["@ethereumjs/vm"]
  bytecode --> evmPkg["@ethereumjs/evm"]
  chainData --> blockPkg["@ethereumjs/block / blockchain"]

Quick start

Install the VM (includes EVM, tx, and state wiring):

npm install @ethereumjs/vm @ethereumjs/common @ethereumjs/tx @ethereumjs/util

Run a simple signed transfer against an in-memory state (adapted from packages/vm/examples/runTx.ts):

import { Common, Hardfork, Mainnet } from '@ethereumjs/common'
import { createLegacyTx } from '@ethereumjs/tx'
import {
  createAccount,
  createAddressFromPrivateKey,
  createZeroAddress,
  hexToBytes,
} from '@ethereumjs/util'
import { createVM, runTx } from '@ethereumjs/vm'

const common = new Common({ chain: Mainnet, hardfork: Hardfork.Prague })
const vm = await createVM({ common })

const senderKey = hexToBytes(`0x${'20'.repeat(32)}`)
const sender = createAddressFromPrivateKey(senderKey)
await vm.stateManager.putAccount(sender, createAccount({ nonce: 0n, balance: BigInt(1e18) }))

const tx = createLegacyTx({
  gasLimit: 21000n,
  gasPrice: 1_000_000_000n,
  value: 1n,
  to: createZeroAddress(),
}).sign(senderKey)

const res = await runTx(vm, { tx })
console.log(res.totalGasSpent) // 21000n

For bytecode-only execution use @ethereumjs/evm (examples). For blob (EIP-4844) transactions you need a separate KZG library — see KZG setup in the tx README.

Package map

Active packages (published in sync on v10; see scripts/release-npm.ts):

Codec and primitives

PackageRoleDocs
@ethereumjs/rlp npmRLP encode/decodeREADME
@ethereumjs/util npmBytes, accounts, addresses, signaturesREADME

Configuration

PackageRoleDocs
@ethereumjs/common npmChains, hardforks, EIP parametersREADME
@ethereumjs/genesis npmGenesis state for known chainsREADME

Protocol types

PackageRoleDocs
@ethereumjs/tx npmLegacy, 1559, 2930, 4844, 7702 transactionsREADME
@ethereumjs/block npmBlocks, headers, withdrawalsREADME

State

PackageRoleDocs
@ethereumjs/mpt npmMerkle Patricia Trie and proofsREADME
@ethereumjs/binarytree npmEIP-7864 binary treeREADME
@ethereumjs/statemanager npmMerkle, RPC, and binary-tree state backendsREADME

Execution

PackageRoleDocs
@ethereumjs/evm npmEVM interpreter, opcodes, precompilesREADME
@ethereumjs/vm npmrunTx, runBlock, block buildingREADME

Chain storage

PackageRoleDocs
@ethereumjs/blockchain npmCanonical chain storage and validationREADME

Other packages

PackageRoleNotes
@ethereumjs/e2store npmEra / Era1 / E2HS archive formatsDeprecation under consideration
@ethereumjs/ethash npmEthash PoW verificationMaintained for deps; not in active release round

How packages fit together

flowchart BT
  rlp --> util --> common
  common --> tx & block & mpt & genesis
  mpt --> block & statemanager
  tx --> block --> vm
  statemanager --> evm --> vm
  block --> blockchain

Full responsibility matrix, execution flow (runBlock → runTx → evm), and release notes: ARCHITECTURE.md.

Contribute

Releases: active development on master (v10). Maintenance branches and breaking-release policy: DEVELOPER.md § Releases.

Clone and build:

git clone https://github.com/ethereumjs/ethereumjs-monorepo.git
cd ethereumjs-monorepo
git submodule update --init
npm install

Tooling, CI, conventions, and release process: DEVELOPER.md · CONTRIBUTING.md.

Deprecated packages (no longer updated)
PackageRole
@ethereumjs/clientFull execution client (deprecated)
@ethereumjs/devp2pdevp2p networking (deprecated)
@ethereumjs/walletKey management helpers (deprecated)

Still on npm for migration reference; do not start new projects on these packages.

Community

The EthereumJS GitHub organization is maintained by the former Ethereum Foundation JavaScript team and contributors. Join Discord for questions and follow the Code of Conduct.

Related: Lodestar — TypeScript consensus client and SSZ tooling for the Ethereum consensus layer.

License

Most packages are MPL-2.0 licensed; see each package folder for its license file.

bytecode
client
ethereum
ethereumjs
evm
javascript
monorepo
mpt
typescript
virtual-machine
vm

ethereumjs/ethereumjs-monorepo

Ethereum L1 Protocol Stack and EVM in TypeScript

TypeScript

2,758

7,627 commits

updated Oct 12, 2026

See the code

README

EthereumJS

EthereumJS package layers: execution, state, protocol, configuration, codec

EthereumJS Monorepo

Modular TypeScript libraries for Ethereum execution-layer protocol work.

Code Coverage Discord

Composable, spec-tested building blocks for the Ethereum execution layer: EVM execution, transactions, blocks, state, tries, and chain configuration. Use them in Node.js or the browser — tree-shakeable, Noble crypto by default, WASM-free unless you opt in.

  • Spec-tested execution — tracks mainnet hardforks (status ↓)
  • Composable primitives — mix tx, block, mpt, statemanager, and friends instead of pulling in a full client
  • Browser-ready — controlled dependency set; package READMEs cover bundler and KZG setup where needed

Maintained by former members of the Ethereum Foundation JavaScript team and the broader Ethereum community.

Hardfork status

ForkStatus
OsakaMainnet today — stable on npm
AmsterdamIn development - see status here

What do you want to do?

GoalStart herenpm package
Run a signed tx, replay a block, or build a blockpackages/vm@ethereumjs/vm
Execute bytecode, custom opcodes, or precompilespackages/evm@ethereumjs/evm
Create, sign, or parse transactionspackages/tx@ethereumjs/tx
Blocks, headers, withdrawalspackages/block@ethereumjs/block
Persistent chain storagepackages/blockchain@ethereumjs/blockchain
Merkle proofs and trie toolingpackages/mpt@ethereumjs/mpt
Chain config and hardfork parameterspackages/common@ethereumjs/common
flowchart TD
  start[What_are_you_building]
  start --> txRules[Tx_and_block_rules]
  start --> bytecode[Bytecode_only]
  start --> chainData[Chain_storage_or_types]

  txRules --> vmPkg["@ethereumjs/vm"]
  bytecode --> evmPkg["@ethereumjs/evm"]
  chainData --> blockPkg["@ethereumjs/block / blockchain"]

Quick start

Install the VM (includes EVM, tx, and state wiring):

npm install @ethereumjs/vm @ethereumjs/common @ethereumjs/tx @ethereumjs/util

Run a simple signed transfer against an in-memory state (adapted from packages/vm/examples/runTx.ts):

import { Common, Hardfork, Mainnet } from '@ethereumjs/common'
import { createLegacyTx } from '@ethereumjs/tx'
import {
  createAccount,
  createAddressFromPrivateKey,
  createZeroAddress,
  hexToBytes,
} from '@ethereumjs/util'
import { createVM, runTx } from '@ethereumjs/vm'

const common = new Common({ chain: Mainnet, hardfork: Hardfork.Prague })
const vm = await createVM({ common })

const senderKey = hexToBytes(`0x${'20'.repeat(32)}`)
const sender = createAddressFromPrivateKey(senderKey)
await vm.stateManager.putAccount(sender, createAccount({ nonce: 0n, balance: BigInt(1e18) }))

const tx = createLegacyTx({
  gasLimit: 21000n,
  gasPrice: 1_000_000_000n,
  value: 1n,
  to: createZeroAddress(),
}).sign(senderKey)

const res = await runTx(vm, { tx })
console.log(res.totalGasSpent) // 21000n

For bytecode-only execution use @ethereumjs/evm (examples). For blob (EIP-4844) transactions you need a separate KZG library — see KZG setup in the tx README.

Package map

Active packages (published in sync on v10; see scripts/release-npm.ts):

Codec and primitives

PackageRoleDocs
@ethereumjs/rlp npmRLP encode/decodeREADME
@ethereumjs/util npmBytes, accounts, addresses, signaturesREADME

Configuration

PackageRoleDocs
@ethereumjs/common npmChains, hardforks, EIP parametersREADME
@ethereumjs/genesis npmGenesis state for known chainsREADME

Protocol types

PackageRoleDocs
@ethereumjs/tx npmLegacy, 1559, 2930, 4844, 7702 transactionsREADME
@ethereumjs/block npmBlocks, headers, withdrawalsREADME

State

PackageRoleDocs
@ethereumjs/mpt npmMerkle Patricia Trie and proofsREADME
@ethereumjs/binarytree npmEIP-7864 binary treeREADME
@ethereumjs/statemanager npmMerkle, RPC, and binary-tree state backendsREADME

Execution

PackageRoleDocs
@ethereumjs/evm npmEVM interpreter, opcodes, precompilesREADME
@ethereumjs/vm npmrunTx, runBlock, block buildingREADME

Chain storage

PackageRoleDocs
@ethereumjs/blockchain npmCanonical chain storage and validationREADME

Other packages

PackageRoleNotes
@ethereumjs/e2store npmEra / Era1 / E2HS archive formatsDeprecation under consideration
@ethereumjs/ethash npmEthash PoW verificationMaintained for deps; not in active release round

How packages fit together

flowchart BT
  rlp --> util --> common
  common --> tx & block & mpt & genesis
  mpt --> block & statemanager
  tx --> block --> vm
  statemanager --> evm --> vm
  block --> blockchain

Full responsibility matrix, execution flow (runBlock → runTx → evm), and release notes: ARCHITECTURE.md.

Contribute

Releases: active development on master (v10). Maintenance branches and breaking-release policy: DEVELOPER.md § Releases.

Clone and build:

git clone https://github.com/ethereumjs/ethereumjs-monorepo.git
cd ethereumjs-monorepo
git submodule update --init
npm install

Tooling, CI, conventions, and release process: DEVELOPER.md · CONTRIBUTING.md.

Deprecated packages (no longer updated)
PackageRole
@ethereumjs/clientFull execution client (deprecated)
@ethereumjs/devp2pdevp2p networking (deprecated)
@ethereumjs/walletKey management helpers (deprecated)

Still on npm for migration reference; do not start new projects on these packages.

Community

The EthereumJS GitHub organization is maintained by the former Ethereum Foundation JavaScript team and contributors. Join Discord for questions and follow the Code of Conduct.

Related: Lodestar — TypeScript consensus client and SSZ tooling for the Ethereum consensus layer.

License

Most packages are MPL-2.0 licensed; see each package folder for its license file.

bytecode
client
ethereum
ethereumjs
evm
javascript
monorepo
mpt
typescript
virtual-machine
vm

Project health

Overall

4.7/10

Maintained

10/10

Code review

2/10
OpenSSF Scorecard

Significant stargazers

(top 24 of 28)

Tim Perry

789 followers · starred Feb 2021

@edgararout

1,148 followers · starred Aug 2020

Gregor Mitscha-Baude

216 followers · starred May 2024

Rootul P

282 followers · starred Sep 2021