Latest commit

History

2,165 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Tevm Logo

Tevm

JavaScript-native Ethereum runtime for TypeScript apps, tests, and tools.

CI StatusNPM RC VersionTevm DownloadsMinzipped SizeTelegramAsk DeepWiki


Release Candidate

Tevm 1.0 is now available on the npm rc dist-tag.

npm install tevm@rc viem

The release candidate includes the new block, mining, receipt, txpool, JSON-RPC, tracing, and viem-compatible client work that replaces the older pre-1.0 README examples. The npm latest tag may still point at the older next series, so use tevm@rc when trying the current 1.0 release candidate.

What Is Tevm?

Tevm runs an Ethereum execution environment inside JavaScript. Use it as an in-memory devnet, a forked-chain simulator, an EIP-1193 provider, a viem-compatible client, or a lower-level EVM toolkit.

It runs in Node, Bun, browsers, serverless functions, edge runtimes, and desktop apps without Docker or a background chain process.

Why Use It?

  • Fork any EVM chain locally: run calls against mainnet, L2s, L3s, or appchains while overriding accounts, storage, and block context.
  • Use viem actions directly: createMemoryClient includes viem public, wallet, and Anvil-style test actions.
  • Control mining behavior: choose automatic, manual, or interval mining and decide when pending transactions become canonical blocks.
  • Inspect real execution: collect traces, receipts, logs, access lists, created addresses, and block-level results from local execution.
  • Import Solidity in TypeScript: use Tevm bundler plugins to import Solidity contracts with ABI, bytecode, and type-safe helpers.
  • Run in the browser: build local-first dapps, optimistic UIs, demos, and tests where a separate RPC node would be too heavy.
  • Extend the EVM: add custom precompiles, predeploys, decorators, and low-level runtime packages when you need direct control.

Quick Start

Create a local in-memory chain, add a transaction to the mempool, mine it, and read the receipt.

import{createMemoryClient,parseEther}from"tevm";constclient=createMemoryClient({miningConfig: {type: "manual"},});awaitclient.tevmReady();constalice="0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266";constbob="0x1111111111111111111111111111111111111111";awaitclient.tevmSetAccount({address: alice,balance: parseEther("1"),});const{ txHash }=awaitclient.tevmCall({from: alice,to: bob,value: parseEther("0.1"),addToMempool: true,});if(!txHash){thrownewError("Transaction was not added to the mempool");}awaitclient.tevmMine({blockCount: 1});constreceipt=awaitclient.getTransactionReceipt({hash: txHash});constbalance=awaitclient.getBalance({address: bob});console.log(receipt.status,balance);

Fork Mainnet Or An L2

Tevm can fork through any EIP-1193 or viem transport. Set common when you know the chain to avoid an extra chain-id lookup.

import{createMemoryClient,http,parseAbi}from"tevm";import{optimism}from"tevm/common";constclient=createMemoryClient({common: optimism,fork: {transport: http("https://mainnet.optimism.io"),blockTag: "latest",},miningConfig: {type: "manual"},});awaitclient.tevmReady();constabi=parseAbi(["function balanceOf(address) view returns (uint256)"]);constbalance=awaitclient.readContract({address: "0x4200000000000000000000000000000000000042",
abi,functionName: "balanceOf",args: ["0x0000000000000000000000000000000000000000"],});console.log(balance);

New In The 1.0 RC

  • Blocks and canonical chain state: Tevm now mines blocks instead of only mutating state snapshots. Calls that create transactions are pending until mined; cheat methods such as tevmSetAccount still update canonical state immediately.
  • Mining modes: configure miningConfig with manual, auto, or interval behavior. Use client.tevmMine() or viem's Anvil-compatible client.mine() to advance the chain.
  • Txpool and receipts: transactions can enter the mempool, be mined into blocks, and then be queried through viem actions or JSON-RPC methods such as eth_getTransactionReceipt.
  • Historical block tags: blockTag works for forked history and locally mined Tevm blocks.
  • State and block overrides: tevmCall, tevmContract, tevmDeploy, and eth_call can run with temporary account, storage, and block overrides.
  • Execution tracing: use createTrace on calls and traceConfig on debug APIs to inspect EVM execution for tests, debuggers, and profilers.
  • Synchronous client creation: createMemoryClient() and createTevmNode() return synchronously; client.tevmReady() and node.ready() are available when you want to eagerly wait for initialization.
  • EIP-1193 request support: request now follows the EIP-1193 shape. The previous low-level request helpers are available as send and sendBulk.
  • Stable decorators: extend TevmNode with tevmActions, ethActions, tevmSend, and requestEip1193.
  • Broader JSON-RPC compatibility: Tevm supports more Ethereum, Anvil, Ganache, and Hardhat-compatible RPC methods for viem test-client workflows.
  • State persistence: persist and hydrate in-memory client state with synchronous storage using createSyncStoragePersister.
  • Runtime packages: the monorepo now includes Tevm-native block, blockchain, tx, txpool, receipt-manager, state, VM, and utility packages.

API Surface

Memory Client

createMemoryClient is the easiest entry point. It returns a viem client with Tevm actions and Anvil-style test actions already installed.

import{createMemoryClient}from"tevm";constclient=createMemoryClient({miningConfig: {type: "auto"},});awaitclient.tevmReady();awaitclient.tevmSetAccount({address: "0x0000000000000000000000000000000000000001",balance: 1n});awaitclient.getBlockNumber();

Tevm Node

createTevmNode gives lower-level access to the runtime and decorator model.

import{createTevmNode}from"tevm";import{requestEip1193,tevmActions}from"tevm/decorators";constnode=createTevmNode({miningConfig: {type: "manual"}}).extend(tevmActions()).extend(requestEip1193());awaitnode.ready();constchainId=awaitnode.request({method: "eth_chainId"});

Solidity Imports

Tevm bundler plugins let TypeScript import Solidity modules directly.

import{createMemoryClient}from"tevm";import{ERC20}from"@openzeppelin/contracts/token/ERC20.sol";constclient=createMemoryClient();consttoken=ERC20.withAddress("0x0000000000000000000000000000000000000000");constbalance=awaitclient.tevmContract(token.read.balanceOf("0x0000000000000000000000000000000000000001"),);

tevm.json is optional in the RC series. Use package-specific bundler docs for Vite, Webpack, Bun, esbuild, rspack, and other integrations.

Packages

The tevm package re-exports the most common runtime APIs. Individual packages remain available when you want smaller imports or lower-level control.

PackagePurpose
tevmMain batteries-included package
@tevm/memory-clientviem-compatible in-memory Ethereum client
@tevm/nodeLow-level Tevm node and decorator runtime
@tevm/actionsTevm actions, JSON-RPC handlers, and debug APIs
@tevm/decoratorsClient extensions for actions, EIP-1193, and events
@tevm/block, @tevm/blockchain, @tevm/tx, @tevm/txpoolChain, block, transaction, and mempool internals
@tevm/receipt-managerReceipt storage and lookup
@tevm/state, @tevm/vm, @tevm/evmState manager and execution internals
@tevm/sync-storage-persisterSynchronous persistence for browser or embedded storage

Learn More

Community

Contributing

Contributions are welcome. See CONTRIBUTING.md for local setup, testing, and pull-request guidance.

License

Tevm is MIT licensed. See LICENSE for details.

About

An Ethereum Node built to run in Browser, Bun, Deno, and Node.js

Topics

Resources

Code of conduct

Contributing

Stars

446 stars

Watchers

3 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

2,165 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Tevm Logo

Tevm

JavaScript-native Ethereum runtime for TypeScript apps, tests, and tools.

CI StatusNPM RC VersionTevm DownloadsMinzipped SizeTelegramAsk DeepWiki


Release Candidate

Tevm 1.0 is now available on the npm rc dist-tag.

npm install tevm@rc viem

The release candidate includes the new block, mining, receipt, txpool, JSON-RPC, tracing, and viem-compatible client work that replaces the older pre-1.0 README examples. The npm latest tag may still point at the older next series, so use tevm@rc when trying the current 1.0 release candidate.

What Is Tevm?

Tevm runs an Ethereum execution environment inside JavaScript. Use it as an in-memory devnet, a forked-chain simulator, an EIP-1193 provider, a viem-compatible client, or a lower-level EVM toolkit.

It runs in Node, Bun, browsers, serverless functions, edge runtimes, and desktop apps without Docker or a background chain process.

Why Use It?

  • Fork any EVM chain locally: run calls against mainnet, L2s, L3s, or appchains while overriding accounts, storage, and block context.
  • Use viem actions directly: createMemoryClient includes viem public, wallet, and Anvil-style test actions.
  • Control mining behavior: choose automatic, manual, or interval mining and decide when pending transactions become canonical blocks.
  • Inspect real execution: collect traces, receipts, logs, access lists, created addresses, and block-level results from local execution.
  • Import Solidity in TypeScript: use Tevm bundler plugins to import Solidity contracts with ABI, bytecode, and type-safe helpers.
  • Run in the browser: build local-first dapps, optimistic UIs, demos, and tests where a separate RPC node would be too heavy.
  • Extend the EVM: add custom precompiles, predeploys, decorators, and low-level runtime packages when you need direct control.

Quick Start

Create a local in-memory chain, add a transaction to the mempool, mine it, and read the receipt.

import{createMemoryClient,parseEther}from"tevm";constclient=createMemoryClient({miningConfig: {type: "manual"},});awaitclient.tevmReady();constalice="0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266";constbob="0x1111111111111111111111111111111111111111";awaitclient.tevmSetAccount({address: alice,balance: parseEther("1"),});const{ txHash }=awaitclient.tevmCall({from: alice,to: bob,value: parseEther("0.1"),addToMempool: true,});if(!txHash){thrownewError("Transaction was not added to the mempool");}awaitclient.tevmMine({blockCount: 1});constreceipt=awaitclient.getTransactionReceipt({hash: txHash});constbalance=awaitclient.getBalance({address: bob});console.log(receipt.status,balance);

Fork Mainnet Or An L2

Tevm can fork through any EIP-1193 or viem transport. Set common when you know the chain to avoid an extra chain-id lookup.

import{createMemoryClient,http,parseAbi}from"tevm";import{optimism}from"tevm/common";constclient=createMemoryClient({common: optimism,fork: {transport: http("https://mainnet.optimism.io"),blockTag: "latest",},miningConfig: {type: "manual"},});awaitclient.tevmReady();constabi=parseAbi(["function balanceOf(address) view returns (uint256)"]);constbalance=awaitclient.readContract({address: "0x4200000000000000000000000000000000000042",
abi,functionName: "balanceOf",args: ["0x0000000000000000000000000000000000000000"],});console.log(balance);

New In The 1.0 RC

  • Blocks and canonical chain state: Tevm now mines blocks instead of only mutating state snapshots. Calls that create transactions are pending until mined; cheat methods such as tevmSetAccount still update canonical state immediately.
  • Mining modes: configure miningConfig with manual, auto, or interval behavior. Use client.tevmMine() or viem's Anvil-compatible client.mine() to advance the chain.
  • Txpool and receipts: transactions can enter the mempool, be mined into blocks, and then be queried through viem actions or JSON-RPC methods such as eth_getTransactionReceipt.
  • Historical block tags: blockTag works for forked history and locally mined Tevm blocks.
  • State and block overrides: tevmCall, tevmContract, tevmDeploy, and eth_call can run with temporary account, storage, and block overrides.
  • Execution tracing: use createTrace on calls and traceConfig on debug APIs to inspect EVM execution for tests, debuggers, and profilers.
  • Synchronous client creation: createMemoryClient() and createTevmNode() return synchronously; client.tevmReady() and node.ready() are available when you want to eagerly wait for initialization.
  • EIP-1193 request support: request now follows the EIP-1193 shape. The previous low-level request helpers are available as send and sendBulk.
  • Stable decorators: extend TevmNode with tevmActions, ethActions, tevmSend, and requestEip1193.
  • Broader JSON-RPC compatibility: Tevm supports more Ethereum, Anvil, Ganache, and Hardhat-compatible RPC methods for viem test-client workflows.
  • State persistence: persist and hydrate in-memory client state with synchronous storage using createSyncStoragePersister.
  • Runtime packages: the monorepo now includes Tevm-native block, blockchain, tx, txpool, receipt-manager, state, VM, and utility packages.

API Surface

Memory Client

createMemoryClient is the easiest entry point. It returns a viem client with Tevm actions and Anvil-style test actions already installed.

import{createMemoryClient}from"tevm";constclient=createMemoryClient({miningConfig: {type: "auto"},});awaitclient.tevmReady();awaitclient.tevmSetAccount({address: "0x0000000000000000000000000000000000000001",balance: 1n});awaitclient.getBlockNumber();

Tevm Node

createTevmNode gives lower-level access to the runtime and decorator model.

import{createTevmNode}from"tevm";import{requestEip1193,tevmActions}from"tevm/decorators";constnode=createTevmNode({miningConfig: {type: "manual"}}).extend(tevmActions()).extend(requestEip1193());awaitnode.ready();constchainId=awaitnode.request({method: "eth_chainId"});

Solidity Imports

Tevm bundler plugins let TypeScript import Solidity modules directly.

import{createMemoryClient}from"tevm";import{ERC20}from"@openzeppelin/contracts/token/ERC20.sol";constclient=createMemoryClient();consttoken=ERC20.withAddress("0x0000000000000000000000000000000000000000");constbalance=awaitclient.tevmContract(token.read.balanceOf("0x0000000000000000000000000000000000000001"),);

tevm.json is optional in the RC series. Use package-specific bundler docs for Vite, Webpack, Bun, esbuild, rspack, and other integrations.

Packages

The tevm package re-exports the most common runtime APIs. Individual packages remain available when you want smaller imports or lower-level control.

PackagePurpose
tevmMain batteries-included package
@tevm/memory-clientviem-compatible in-memory Ethereum client
@tevm/nodeLow-level Tevm node and decorator runtime
@tevm/actionsTevm actions, JSON-RPC handlers, and debug APIs
@tevm/decoratorsClient extensions for actions, EIP-1193, and events
@tevm/block, @tevm/blockchain, @tevm/tx, @tevm/txpoolChain, block, transaction, and mempool internals
@tevm/receipt-managerReceipt storage and lookup
@tevm/state, @tevm/vm, @tevm/evmState manager and execution internals
@tevm/sync-storage-persisterSynchronous persistence for browser or embedded storage

Learn More

Community

Contributing

Contributions are welcome. See CONTRIBUTING.md for local setup, testing, and pull-request guidance.

License

Tevm is MIT licensed. See LICENSE for details.

About

An Ethereum Node built to run in Browser, Bun, Deno, and Node.js

Topics

Resources

Code of conduct

Contributing

Stars

446 stars

Watchers

3 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

2,165 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Tevm Logo

Tevm

JavaScript-native Ethereum runtime for TypeScript apps, tests, and tools.

CI StatusNPM RC VersionTevm DownloadsMinzipped SizeTelegramAsk DeepWiki


Release Candidate

Tevm 1.0 is now available on the npm rc dist-tag.

npm install tevm@rc viem

The release candidate includes the new block, mining, receipt, txpool, JSON-RPC, tracing, and viem-compatible client work that replaces the older pre-1.0 README examples. The npm latest tag may still point at the older next series, so use tevm@rc when trying the current 1.0 release candidate.

What Is Tevm?

Tevm runs an Ethereum execution environment inside JavaScript. Use it as an in-memory devnet, a forked-chain simulator, an EIP-1193 provider, a viem-compatible client, or a lower-level EVM toolkit.

It runs in Node, Bun, browsers, serverless functions, edge runtimes, and desktop apps without Docker or a background chain process.

Why Use It?

  • Fork any EVM chain locally: run calls against mainnet, L2s, L3s, or appchains while overriding accounts, storage, and block context.
  • Use viem actions directly: createMemoryClient includes viem public, wallet, and Anvil-style test actions.
  • Control mining behavior: choose automatic, manual, or interval mining and decide when pending transactions become canonical blocks.
  • Inspect real execution: collect traces, receipts, logs, access lists, created addresses, and block-level results from local execution.
  • Import Solidity in TypeScript: use Tevm bundler plugins to import Solidity contracts with ABI, bytecode, and type-safe helpers.
  • Run in the browser: build local-first dapps, optimistic UIs, demos, and tests where a separate RPC node would be too heavy.
  • Extend the EVM: add custom precompiles, predeploys, decorators, and low-level runtime packages when you need direct control.

Quick Start

Create a local in-memory chain, add a transaction to the mempool, mine it, and read the receipt.

import{createMemoryClient,parseEther}from"tevm";constclient=createMemoryClient({miningConfig: {type: "manual"},});awaitclient.tevmReady();constalice="0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266";constbob="0x1111111111111111111111111111111111111111";awaitclient.tevmSetAccount({address: alice,balance: parseEther("1"),});const{ txHash }=awaitclient.tevmCall({from: alice,to: bob,value: parseEther("0.1"),addToMempool: true,});if(!txHash){thrownewError("Transaction was not added to the mempool");}awaitclient.tevmMine({blockCount: 1});constreceipt=awaitclient.getTransactionReceipt({hash: txHash});constbalance=awaitclient.getBalance({address: bob});console.log(receipt.status,balance);

Fork Mainnet Or An L2

Tevm can fork through any EIP-1193 or viem transport. Set common when you know the chain to avoid an extra chain-id lookup.

import{createMemoryClient,http,parseAbi}from"tevm";import{optimism}from"tevm/common";constclient=createMemoryClient({common: optimism,fork: {transport: http("https://mainnet.optimism.io"),blockTag: "latest",},miningConfig: {type: "manual"},});awaitclient.tevmReady();constabi=parseAbi(["function balanceOf(address) view returns (uint256)"]);constbalance=awaitclient.readContract({address: "0x4200000000000000000000000000000000000042",
abi,functionName: "balanceOf",args: ["0x0000000000000000000000000000000000000000"],});console.log(balance);

New In The 1.0 RC

  • Blocks and canonical chain state: Tevm now mines blocks instead of only mutating state snapshots. Calls that create transactions are pending until mined; cheat methods such as tevmSetAccount still update canonical state immediately.
  • Mining modes: configure miningConfig with manual, auto, or interval behavior. Use client.tevmMine() or viem's Anvil-compatible client.mine() to advance the chain.
  • Txpool and receipts: transactions can enter the mempool, be mined into blocks, and then be queried through viem actions or JSON-RPC methods such as eth_getTransactionReceipt.
  • Historical block tags: blockTag works for forked history and locally mined Tevm blocks.
  • State and block overrides: tevmCall, tevmContract, tevmDeploy, and eth_call can run with temporary account, storage, and block overrides.
  • Execution tracing: use createTrace on calls and traceConfig on debug APIs to inspect EVM execution for tests, debuggers, and profilers.
  • Synchronous client creation: createMemoryClient() and createTevmNode() return synchronously; client.tevmReady() and node.ready() are available when you want to eagerly wait for initialization.
  • EIP-1193 request support: request now follows the EIP-1193 shape. The previous low-level request helpers are available as send and sendBulk.
  • Stable decorators: extend TevmNode with tevmActions, ethActions, tevmSend, and requestEip1193.
  • Broader JSON-RPC compatibility: Tevm supports more Ethereum, Anvil, Ganache, and Hardhat-compatible RPC methods for viem test-client workflows.
  • State persistence: persist and hydrate in-memory client state with synchronous storage using createSyncStoragePersister.
  • Runtime packages: the monorepo now includes Tevm-native block, blockchain, tx, txpool, receipt-manager, state, VM, and utility packages.

API Surface

Memory Client

createMemoryClient is the easiest entry point. It returns a viem client with Tevm actions and Anvil-style test actions already installed.

import{createMemoryClient}from"tevm";constclient=createMemoryClient({miningConfig: {type: "auto"},});awaitclient.tevmReady();awaitclient.tevmSetAccount({address: "0x0000000000000000000000000000000000000001",balance: 1n});awaitclient.getBlockNumber();

Tevm Node

createTevmNode gives lower-level access to the runtime and decorator model.

import{createTevmNode}from"tevm";import{requestEip1193,tevmActions}from"tevm/decorators";constnode=createTevmNode({miningConfig: {type: "manual"}}).extend(tevmActions()).extend(requestEip1193());awaitnode.ready();constchainId=awaitnode.request({method: "eth_chainId"});

Solidity Imports

Tevm bundler plugins let TypeScript import Solidity modules directly.

import{createMemoryClient}from"tevm";import{ERC20}from"@openzeppelin/contracts/token/ERC20.sol";constclient=createMemoryClient();consttoken=ERC20.withAddress("0x0000000000000000000000000000000000000000");constbalance=awaitclient.tevmContract(token.read.balanceOf("0x0000000000000000000000000000000000000001"),);

tevm.json is optional in the RC series. Use package-specific bundler docs for Vite, Webpack, Bun, esbuild, rspack, and other integrations.

Packages

The tevm package re-exports the most common runtime APIs. Individual packages remain available when you want smaller imports or lower-level control.

PackagePurpose
tevmMain batteries-included package
@tevm/memory-clientviem-compatible in-memory Ethereum client
@tevm/nodeLow-level Tevm node and decorator runtime
@tevm/actionsTevm actions, JSON-RPC handlers, and debug APIs
@tevm/decoratorsClient extensions for actions, EIP-1193, and events
@tevm/block, @tevm/blockchain, @tevm/tx, @tevm/txpoolChain, block, transaction, and mempool internals
@tevm/receipt-managerReceipt storage and lookup
@tevm/state, @tevm/vm, @tevm/evmState manager and execution internals
@tevm/sync-storage-persisterSynchronous persistence for browser or embedded storage

Learn More

Community

Contributing

Contributions are welcome. See CONTRIBUTING.md for local setup, testing, and pull-request guidance.

License

Tevm is MIT licensed. See LICENSE for details.

About

An Ethereum Node built to run in Browser, Bun, Deno, and Node.js

Topics

Resources

Code of conduct

Contributing

Stars

446 stars

Watchers

3 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

2,165 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Tevm Logo

Tevm

JavaScript-native Ethereum runtime for TypeScript apps, tests, and tools.

CI StatusNPM RC VersionTevm DownloadsMinzipped SizeTelegramAsk DeepWiki


Release Candidate

Tevm 1.0 is now available on the npm rc dist-tag.

npm install tevm@rc viem

The release candidate includes the new block, mining, receipt, txpool, JSON-RPC, tracing, and viem-compatible client work that replaces the older pre-1.0 README examples. The npm latest tag may still point at the older next series, so use tevm@rc when trying the current 1.0 release candidate.

What Is Tevm?

Tevm runs an Ethereum execution environment inside JavaScript. Use it as an in-memory devnet, a forked-chain simulator, an EIP-1193 provider, a viem-compatible client, or a lower-level EVM toolkit.

It runs in Node, Bun, browsers, serverless functions, edge runtimes, and desktop apps without Docker or a background chain process.

Why Use It?

  • Fork any EVM chain locally: run calls against mainnet, L2s, L3s, or appchains while overriding accounts, storage, and block context.
  • Use viem actions directly: createMemoryClient includes viem public, wallet, and Anvil-style test actions.
  • Control mining behavior: choose automatic, manual, or interval mining and decide when pending transactions become canonical blocks.
  • Inspect real execution: collect traces, receipts, logs, access lists, created addresses, and block-level results from local execution.
  • Import Solidity in TypeScript: use Tevm bundler plugins to import Solidity contracts with ABI, bytecode, and type-safe helpers.
  • Run in the browser: build local-first dapps, optimistic UIs, demos, and tests where a separate RPC node would be too heavy.
  • Extend the EVM: add custom precompiles, predeploys, decorators, and low-level runtime packages when you need direct control.

Quick Start

Create a local in-memory chain, add a transaction to the mempool, mine it, and read the receipt.

import{createMemoryClient,parseEther}from"tevm";constclient=createMemoryClient({miningConfig: {type: "manual"},});awaitclient.tevmReady();constalice="0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266";constbob="0x1111111111111111111111111111111111111111";awaitclient.tevmSetAccount({address: alice,balance: parseEther("1"),});const{ txHash }=awaitclient.tevmCall({from: alice,to: bob,value: parseEther("0.1"),addToMempool: true,});if(!txHash){thrownewError("Transaction was not added to the mempool");}awaitclient.tevmMine({blockCount: 1});constreceipt=awaitclient.getTransactionReceipt({hash: txHash});constbalance=awaitclient.getBalance({address: bob});console.log(receipt.status,balance);

Fork Mainnet Or An L2

Tevm can fork through any EIP-1193 or viem transport. Set common when you know the chain to avoid an extra chain-id lookup.

import{createMemoryClient,http,parseAbi}from"tevm";import{optimism}from"tevm/common";constclient=createMemoryClient({common: optimism,fork: {transport: http("https://mainnet.optimism.io"),blockTag: "latest",},miningConfig: {type: "manual"},});awaitclient.tevmReady();constabi=parseAbi(["function balanceOf(address) view returns (uint256)"]);constbalance=awaitclient.readContract({address: "0x4200000000000000000000000000000000000042",
abi,functionName: "balanceOf",args: ["0x0000000000000000000000000000000000000000"],});console.log(balance);

New In The 1.0 RC

  • Blocks and canonical chain state: Tevm now mines blocks instead of only mutating state snapshots. Calls that create transactions are pending until mined; cheat methods such as tevmSetAccount still update canonical state immediately.
  • Mining modes: configure miningConfig with manual, auto, or interval behavior. Use client.tevmMine() or viem's Anvil-compatible client.mine() to advance the chain.
  • Txpool and receipts: transactions can enter the mempool, be mined into blocks, and then be queried through viem actions or JSON-RPC methods such as eth_getTransactionReceipt.
  • Historical block tags: blockTag works for forked history and locally mined Tevm blocks.
  • State and block overrides: tevmCall, tevmContract, tevmDeploy, and eth_call can run with temporary account, storage, and block overrides.
  • Execution tracing: use createTrace on calls and traceConfig on debug APIs to inspect EVM execution for tests, debuggers, and profilers.
  • Synchronous client creation: createMemoryClient() and createTevmNode() return synchronously; client.tevmReady() and node.ready() are available when you want to eagerly wait for initialization.
  • EIP-1193 request support: request now follows the EIP-1193 shape. The previous low-level request helpers are available as send and sendBulk.
  • Stable decorators: extend TevmNode with tevmActions, ethActions, tevmSend, and requestEip1193.
  • Broader JSON-RPC compatibility: Tevm supports more Ethereum, Anvil, Ganache, and Hardhat-compatible RPC methods for viem test-client workflows.
  • State persistence: persist and hydrate in-memory client state with synchronous storage using createSyncStoragePersister.
  • Runtime packages: the monorepo now includes Tevm-native block, blockchain, tx, txpool, receipt-manager, state, VM, and utility packages.

API Surface

Memory Client

createMemoryClient is the easiest entry point. It returns a viem client with Tevm actions and Anvil-style test actions already installed.

import{createMemoryClient}from"tevm";constclient=createMemoryClient({miningConfig: {type: "auto"},});awaitclient.tevmReady();awaitclient.tevmSetAccount({address: "0x0000000000000000000000000000000000000001",balance: 1n});awaitclient.getBlockNumber();

Tevm Node

createTevmNode gives lower-level access to the runtime and decorator model.

import{createTevmNode}from"tevm";import{requestEip1193,tevmActions}from"tevm/decorators";constnode=createTevmNode({miningConfig: {type: "manual"}}).extend(tevmActions()).extend(requestEip1193());awaitnode.ready();constchainId=awaitnode.request({method: "eth_chainId"});

Solidity Imports

Tevm bundler plugins let TypeScript import Solidity modules directly.

import{createMemoryClient}from"tevm";import{ERC20}from"@openzeppelin/contracts/token/ERC20.sol";constclient=createMemoryClient();consttoken=ERC20.withAddress("0x0000000000000000000000000000000000000000");constbalance=awaitclient.tevmContract(token.read.balanceOf("0x0000000000000000000000000000000000000001"),);

tevm.json is optional in the RC series. Use package-specific bundler docs for Vite, Webpack, Bun, esbuild, rspack, and other integrations.

Packages

The tevm package re-exports the most common runtime APIs. Individual packages remain available when you want smaller imports or lower-level control.

PackagePurpose
tevmMain batteries-included package
@tevm/memory-clientviem-compatible in-memory Ethereum client
@tevm/nodeLow-level Tevm node and decorator runtime
@tevm/actionsTevm actions, JSON-RPC handlers, and debug APIs
@tevm/decoratorsClient extensions for actions, EIP-1193, and events
@tevm/block, @tevm/blockchain, @tevm/tx, @tevm/txpoolChain, block, transaction, and mempool internals
@tevm/receipt-managerReceipt storage and lookup
@tevm/state, @tevm/vm, @tevm/evmState manager and execution internals
@tevm/sync-storage-persisterSynchronous persistence for browser or embedded storage

Learn More

Community

Contributing

Contributions are welcome. See CONTRIBUTING.md for local setup, testing, and pull-request guidance.

License

Tevm is MIT licensed. See LICENSE for details.

About

An Ethereum Node built to run in Browser, Bun, Deno, and Node.js

Topics

Resources

Code of conduct

Contributing

Stars

446 stars

Watchers

3 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

2,165 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Tevm Logo

Tevm

JavaScript-native Ethereum runtime for TypeScript apps, tests, and tools.

CI StatusNPM RC VersionTevm DownloadsMinzipped SizeTelegramAsk DeepWiki


Release Candidate

Tevm 1.0 is now available on the npm rc dist-tag.

npm install tevm@rc viem

The release candidate includes the new block, mining, receipt, txpool, JSON-RPC, tracing, and viem-compatible client work that replaces the older pre-1.0 README examples. The npm latest tag may still point at the older next series, so use tevm@rc when trying the current 1.0 release candidate.

What Is Tevm?

Tevm runs an Ethereum execution environment inside JavaScript. Use it as an in-memory devnet, a forked-chain simulator, an EIP-1193 provider, a viem-compatible client, or a lower-level EVM toolkit.

It runs in Node, Bun, browsers, serverless functions, edge runtimes, and desktop apps without Docker or a background chain process.

Why Use It?

  • Fork any EVM chain locally: run calls against mainnet, L2s, L3s, or appchains while overriding accounts, storage, and block context.
  • Use viem actions directly: createMemoryClient includes viem public, wallet, and Anvil-style test actions.
  • Control mining behavior: choose automatic, manual, or interval mining and decide when pending transactions become canonical blocks.
  • Inspect real execution: collect traces, receipts, logs, access lists, created addresses, and block-level results from local execution.
  • Import Solidity in TypeScript: use Tevm bundler plugins to import Solidity contracts with ABI, bytecode, and type-safe helpers.
  • Run in the browser: build local-first dapps, optimistic UIs, demos, and tests where a separate RPC node would be too heavy.
  • Extend the EVM: add custom precompiles, predeploys, decorators, and low-level runtime packages when you need direct control.

Quick Start

Create a local in-memory chain, add a transaction to the mempool, mine it, and read the receipt.

import{createMemoryClient,parseEther}from"tevm";constclient=createMemoryClient({miningConfig: {type: "manual"},});awaitclient.tevmReady();constalice="0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266";constbob="0x1111111111111111111111111111111111111111";awaitclient.tevmSetAccount({address: alice,balance: parseEther("1"),});const{ txHash }=awaitclient.tevmCall({from: alice,to: bob,value: parseEther("0.1"),addToMempool: true,});if(!txHash){thrownewError("Transaction was not added to the mempool");}awaitclient.tevmMine({blockCount: 1});constreceipt=awaitclient.getTransactionReceipt({hash: txHash});constbalance=awaitclient.getBalance({address: bob});console.log(receipt.status,balance);

Fork Mainnet Or An L2

Tevm can fork through any EIP-1193 or viem transport. Set common when you know the chain to avoid an extra chain-id lookup.

import{createMemoryClient,http,parseAbi}from"tevm";import{optimism}from"tevm/common";constclient=createMemoryClient({common: optimism,fork: {transport: http("https://mainnet.optimism.io"),blockTag: "latest",},miningConfig: {type: "manual"},});awaitclient.tevmReady();constabi=parseAbi(["function balanceOf(address) view returns (uint256)"]);constbalance=awaitclient.readContract({address: "0x4200000000000000000000000000000000000042",
abi,functionName: "balanceOf",args: ["0x0000000000000000000000000000000000000000"],});console.log(balance);

New In The 1.0 RC

  • Blocks and canonical chain state: Tevm now mines blocks instead of only mutating state snapshots. Calls that create transactions are pending until mined; cheat methods such as tevmSetAccount still update canonical state immediately.
  • Mining modes: configure miningConfig with manual, auto, or interval behavior. Use client.tevmMine() or viem's Anvil-compatible client.mine() to advance the chain.
  • Txpool and receipts: transactions can enter the mempool, be mined into blocks, and then be queried through viem actions or JSON-RPC methods such as eth_getTransactionReceipt.
  • Historical block tags: blockTag works for forked history and locally mined Tevm blocks.
  • State and block overrides: tevmCall, tevmContract, tevmDeploy, and eth_call can run with temporary account, storage, and block overrides.
  • Execution tracing: use createTrace on calls and traceConfig on debug APIs to inspect EVM execution for tests, debuggers, and profilers.
  • Synchronous client creation: createMemoryClient() and createTevmNode() return synchronously; client.tevmReady() and node.ready() are available when you want to eagerly wait for initialization.
  • EIP-1193 request support: request now follows the EIP-1193 shape. The previous low-level request helpers are available as send and sendBulk.
  • Stable decorators: extend TevmNode with tevmActions, ethActions, tevmSend, and requestEip1193.
  • Broader JSON-RPC compatibility: Tevm supports more Ethereum, Anvil, Ganache, and Hardhat-compatible RPC methods for viem test-client workflows.
  • State persistence: persist and hydrate in-memory client state with synchronous storage using createSyncStoragePersister.
  • Runtime packages: the monorepo now includes Tevm-native block, blockchain, tx, txpool, receipt-manager, state, VM, and utility packages.

API Surface

Memory Client

createMemoryClient is the easiest entry point. It returns a viem client with Tevm actions and Anvil-style test actions already installed.

import{createMemoryClient}from"tevm";constclient=createMemoryClient({miningConfig: {type: "auto"},});awaitclient.tevmReady();awaitclient.tevmSetAccount({address: "0x0000000000000000000000000000000000000001",balance: 1n});awaitclient.getBlockNumber();

Tevm Node

createTevmNode gives lower-level access to the runtime and decorator model.

import{createTevmNode}from"tevm";import{requestEip1193,tevmActions}from"tevm/decorators";constnode=createTevmNode({miningConfig: {type: "manual"}}).extend(tevmActions()).extend(requestEip1193());awaitnode.ready();constchainId=awaitnode.request({method: "eth_chainId"});

Solidity Imports

Tevm bundler plugins let TypeScript import Solidity modules directly.

import{createMemoryClient}from"tevm";import{ERC20}from"@openzeppelin/contracts/token/ERC20.sol";constclient=createMemoryClient();consttoken=ERC20.withAddress("0x0000000000000000000000000000000000000000");constbalance=awaitclient.tevmContract(token.read.balanceOf("0x0000000000000000000000000000000000000001"),);

tevm.json is optional in the RC series. Use package-specific bundler docs for Vite, Webpack, Bun, esbuild, rspack, and other integrations.

Packages

The tevm package re-exports the most common runtime APIs. Individual packages remain available when you want smaller imports or lower-level control.

PackagePurpose
tevmMain batteries-included package
@tevm/memory-clientviem-compatible in-memory Ethereum client
@tevm/nodeLow-level Tevm node and decorator runtime
@tevm/actionsTevm actions, JSON-RPC handlers, and debug APIs
@tevm/decoratorsClient extensions for actions, EIP-1193, and events
@tevm/block, @tevm/blockchain, @tevm/tx, @tevm/txpoolChain, block, transaction, and mempool internals
@tevm/receipt-managerReceipt storage and lookup
@tevm/state, @tevm/vm, @tevm/evmState manager and execution internals
@tevm/sync-storage-persisterSynchronous persistence for browser or embedded storage

Learn More

Community

Contributing

Contributions are welcome. See CONTRIBUTING.md for local setup, testing, and pull-request guidance.

License

Tevm is MIT licensed. See LICENSE for details.

About

An Ethereum Node built to run in Browser, Bun, Deno, and Node.js

Topics

Resources

Code of conduct

Contributing

Stars

446 stars

Watchers

3 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

2,165 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Tevm Logo

Tevm

JavaScript-native Ethereum runtime for TypeScript apps, tests, and tools.

CI StatusNPM RC VersionTevm DownloadsMinzipped SizeTelegramAsk DeepWiki


Release Candidate

Tevm 1.0 is now available on the npm rc dist-tag.

npm install tevm@rc viem

The release candidate includes the new block, mining, receipt, txpool, JSON-RPC, tracing, and viem-compatible client work that replaces the older pre-1.0 README examples. The npm latest tag may still point at the older next series, so use tevm@rc when trying the current 1.0 release candidate.

What Is Tevm?

Tevm runs an Ethereum execution environment inside JavaScript. Use it as an in-memory devnet, a forked-chain simulator, an EIP-1193 provider, a viem-compatible client, or a lower-level EVM toolkit.

It runs in Node, Bun, browsers, serverless functions, edge runtimes, and desktop apps without Docker or a background chain process.

Why Use It?

  • Fork any EVM chain locally: run calls against mainnet, L2s, L3s, or appchains while overriding accounts, storage, and block context.
  • Use viem actions directly: createMemoryClient includes viem public, wallet, and Anvil-style test actions.
  • Control mining behavior: choose automatic, manual, or interval mining and decide when pending transactions become canonical blocks.
  • Inspect real execution: collect traces, receipts, logs, access lists, created addresses, and block-level results from local execution.
  • Import Solidity in TypeScript: use Tevm bundler plugins to import Solidity contracts with ABI, bytecode, and type-safe helpers.
  • Run in the browser: build local-first dapps, optimistic UIs, demos, and tests where a separate RPC node would be too heavy.
  • Extend the EVM: add custom precompiles, predeploys, decorators, and low-level runtime packages when you need direct control.

Quick Start

Create a local in-memory chain, add a transaction to the mempool, mine it, and read the receipt.

import{createMemoryClient,parseEther}from"tevm";constclient=createMemoryClient({miningConfig: {type: "manual"},});awaitclient.tevmReady();constalice="0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266";constbob="0x1111111111111111111111111111111111111111";awaitclient.tevmSetAccount({address: alice,balance: parseEther("1"),});const{ txHash }=awaitclient.tevmCall({from: alice,to: bob,value: parseEther("0.1"),addToMempool: true,});if(!txHash){thrownewError("Transaction was not added to the mempool");}awaitclient.tevmMine({blockCount: 1});constreceipt=awaitclient.getTransactionReceipt({hash: txHash});constbalance=awaitclient.getBalance({address: bob});console.log(receipt.status,balance);

Fork Mainnet Or An L2

Tevm can fork through any EIP-1193 or viem transport. Set common when you know the chain to avoid an extra chain-id lookup.

import{createMemoryClient,http,parseAbi}from"tevm";import{optimism}from"tevm/common";constclient=createMemoryClient({common: optimism,fork: {transport: http("https://mainnet.optimism.io"),blockTag: "latest",},miningConfig: {type: "manual"},});awaitclient.tevmReady();constabi=parseAbi(["function balanceOf(address) view returns (uint256)"]);constbalance=awaitclient.readContract({address: "0x4200000000000000000000000000000000000042",
abi,functionName: "balanceOf",args: ["0x0000000000000000000000000000000000000000"],});console.log(balance);

New In The 1.0 RC

  • Blocks and canonical chain state: Tevm now mines blocks instead of only mutating state snapshots. Calls that create transactions are pending until mined; cheat methods such as tevmSetAccount still update canonical state immediately.
  • Mining modes: configure miningConfig with manual, auto, or interval behavior. Use client.tevmMine() or viem's Anvil-compatible client.mine() to advance the chain.
  • Txpool and receipts: transactions can enter the mempool, be mined into blocks, and then be queried through viem actions or JSON-RPC methods such as eth_getTransactionReceipt.
  • Historical block tags: blockTag works for forked history and locally mined Tevm blocks.
  • State and block overrides: tevmCall, tevmContract, tevmDeploy, and eth_call can run with temporary account, storage, and block overrides.
  • Execution tracing: use createTrace on calls and traceConfig on debug APIs to inspect EVM execution for tests, debuggers, and profilers.
  • Synchronous client creation: createMemoryClient() and createTevmNode() return synchronously; client.tevmReady() and node.ready() are available when you want to eagerly wait for initialization.
  • EIP-1193 request support: request now follows the EIP-1193 shape. The previous low-level request helpers are available as send and sendBulk.
  • Stable decorators: extend TevmNode with tevmActions, ethActions, tevmSend, and requestEip1193.
  • Broader JSON-RPC compatibility: Tevm supports more Ethereum, Anvil, Ganache, and Hardhat-compatible RPC methods for viem test-client workflows.
  • State persistence: persist and hydrate in-memory client state with synchronous storage using createSyncStoragePersister.
  • Runtime packages: the monorepo now includes Tevm-native block, blockchain, tx, txpool, receipt-manager, state, VM, and utility packages.

API Surface

Memory Client

createMemoryClient is the easiest entry point. It returns a viem client with Tevm actions and Anvil-style test actions already installed.

import{createMemoryClient}from"tevm";constclient=createMemoryClient({miningConfig: {type: "auto"},});awaitclient.tevmReady();awaitclient.tevmSetAccount({address: "0x0000000000000000000000000000000000000001",balance: 1n});awaitclient.getBlockNumber();

Tevm Node

createTevmNode gives lower-level access to the runtime and decorator model.

import{createTevmNode}from"tevm";import{requestEip1193,tevmActions}from"tevm/decorators";constnode=createTevmNode({miningConfig: {type: "manual"}}).extend(tevmActions()).extend(requestEip1193());awaitnode.ready();constchainId=awaitnode.request({method: "eth_chainId"});

Solidity Imports

Tevm bundler plugins let TypeScript import Solidity modules directly.

import{createMemoryClient}from"tevm";import{ERC20}from"@openzeppelin/contracts/token/ERC20.sol";constclient=createMemoryClient();consttoken=ERC20.withAddress("0x0000000000000000000000000000000000000000");constbalance=awaitclient.tevmContract(token.read.balanceOf("0x0000000000000000000000000000000000000001"),);

tevm.json is optional in the RC series. Use package-specific bundler docs for Vite, Webpack, Bun, esbuild, rspack, and other integrations.

Packages

The tevm package re-exports the most common runtime APIs. Individual packages remain available when you want smaller imports or lower-level control.

PackagePurpose
tevmMain batteries-included package
@tevm/memory-clientviem-compatible in-memory Ethereum client
@tevm/nodeLow-level Tevm node and decorator runtime
@tevm/actionsTevm actions, JSON-RPC handlers, and debug APIs
@tevm/decoratorsClient extensions for actions, EIP-1193, and events
@tevm/block, @tevm/blockchain, @tevm/tx, @tevm/txpoolChain, block, transaction, and mempool internals
@tevm/receipt-managerReceipt storage and lookup
@tevm/state, @tevm/vm, @tevm/evmState manager and execution internals
@tevm/sync-storage-persisterSynchronous persistence for browser or embedded storage

Learn More

Community

Contributing

Contributions are welcome. See CONTRIBUTING.md for local setup, testing, and pull-request guidance.

License

Tevm is MIT licensed. See LICENSE for details.

About

An Ethereum Node built to run in Browser, Bun, Deno, and Node.js

Topics

Resources

Code of conduct

Contributing

Stars

446 stars

Watchers

3 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

2,165 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Tevm Logo

Tevm

JavaScript-native Ethereum runtime for TypeScript apps, tests, and tools.

CI StatusNPM RC VersionTevm DownloadsMinzipped SizeTelegramAsk DeepWiki


Release Candidate

Tevm 1.0 is now available on the npm rc dist-tag.

npm install tevm@rc viem

The release candidate includes the new block, mining, receipt, txpool, JSON-RPC, tracing, and viem-compatible client work that replaces the older pre-1.0 README examples. The npm latest tag may still point at the older next series, so use tevm@rc when trying the current 1.0 release candidate.

What Is Tevm?

Tevm runs an Ethereum execution environment inside JavaScript. Use it as an in-memory devnet, a forked-chain simulator, an EIP-1193 provider, a viem-compatible client, or a lower-level EVM toolkit.

It runs in Node, Bun, browsers, serverless functions, edge runtimes, and desktop apps without Docker or a background chain process.

Why Use It?

  • Fork any EVM chain locally: run calls against mainnet, L2s, L3s, or appchains while overriding accounts, storage, and block context.
  • Use viem actions directly: createMemoryClient includes viem public, wallet, and Anvil-style test actions.
  • Control mining behavior: choose automatic, manual, or interval mining and decide when pending transactions become canonical blocks.
  • Inspect real execution: collect traces, receipts, logs, access lists, created addresses, and block-level results from local execution.
  • Import Solidity in TypeScript: use Tevm bundler plugins to import Solidity contracts with ABI, bytecode, and type-safe helpers.
  • Run in the browser: build local-first dapps, optimistic UIs, demos, and tests where a separate RPC node would be too heavy.
  • Extend the EVM: add custom precompiles, predeploys, decorators, and low-level runtime packages when you need direct control.

Quick Start

Create a local in-memory chain, add a transaction to the mempool, mine it, and read the receipt.

import{createMemoryClient,parseEther}from"tevm";constclient=createMemoryClient({miningConfig: {type: "manual"},});awaitclient.tevmReady();constalice="0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266";constbob="0x1111111111111111111111111111111111111111";awaitclient.tevmSetAccount({address: alice,balance: parseEther("1"),});const{ txHash }=awaitclient.tevmCall({from: alice,to: bob,value: parseEther("0.1"),addToMempool: true,});if(!txHash){thrownewError("Transaction was not added to the mempool");}awaitclient.tevmMine({blockCount: 1});constreceipt=awaitclient.getTransactionReceipt({hash: txHash});constbalance=awaitclient.getBalance({address: bob});console.log(receipt.status,balance);

Fork Mainnet Or An L2

Tevm can fork through any EIP-1193 or viem transport. Set common when you know the chain to avoid an extra chain-id lookup.

import{createMemoryClient,http,parseAbi}from"tevm";import{optimism}from"tevm/common";constclient=createMemoryClient({common: optimism,fork: {transport: http("https://mainnet.optimism.io"),blockTag: "latest",},miningConfig: {type: "manual"},});awaitclient.tevmReady();constabi=parseAbi(["function balanceOf(address) view returns (uint256)"]);constbalance=awaitclient.readContract({address: "0x4200000000000000000000000000000000000042",
abi,functionName: "balanceOf",args: ["0x0000000000000000000000000000000000000000"],});console.log(balance);

New In The 1.0 RC

  • Blocks and canonical chain state: Tevm now mines blocks instead of only mutating state snapshots. Calls that create transactions are pending until mined; cheat methods such as tevmSetAccount still update canonical state immediately.
  • Mining modes: configure miningConfig with manual, auto, or interval behavior. Use client.tevmMine() or viem's Anvil-compatible client.mine() to advance the chain.
  • Txpool and receipts: transactions can enter the mempool, be mined into blocks, and then be queried through viem actions or JSON-RPC methods such as eth_getTransactionReceipt.
  • Historical block tags: blockTag works for forked history and locally mined Tevm blocks.
  • State and block overrides: tevmCall, tevmContract, tevmDeploy, and eth_call can run with temporary account, storage, and block overrides.
  • Execution tracing: use createTrace on calls and traceConfig on debug APIs to inspect EVM execution for tests, debuggers, and profilers.
  • Synchronous client creation: createMemoryClient() and createTevmNode() return synchronously; client.tevmReady() and node.ready() are available when you want to eagerly wait for initialization.
  • EIP-1193 request support: request now follows the EIP-1193 shape. The previous low-level request helpers are available as send and sendBulk.
  • Stable decorators: extend TevmNode with tevmActions, ethActions, tevmSend, and requestEip1193.
  • Broader JSON-RPC compatibility: Tevm supports more Ethereum, Anvil, Ganache, and Hardhat-compatible RPC methods for viem test-client workflows.
  • State persistence: persist and hydrate in-memory client state with synchronous storage using createSyncStoragePersister.
  • Runtime packages: the monorepo now includes Tevm-native block, blockchain, tx, txpool, receipt-manager, state, VM, and utility packages.

API Surface

Memory Client

createMemoryClient is the easiest entry point. It returns a viem client with Tevm actions and Anvil-style test actions already installed.

import{createMemoryClient}from"tevm";constclient=createMemoryClient({miningConfig: {type: "auto"},});awaitclient.tevmReady();awaitclient.tevmSetAccount({address: "0x0000000000000000000000000000000000000001",balance: 1n});awaitclient.getBlockNumber();

Tevm Node

createTevmNode gives lower-level access to the runtime and decorator model.

import{createTevmNode}from"tevm";import{requestEip1193,tevmActions}from"tevm/decorators";constnode=createTevmNode({miningConfig: {type: "manual"}}).extend(tevmActions()).extend(requestEip1193());awaitnode.ready();constchainId=awaitnode.request({method: "eth_chainId"});

Solidity Imports

Tevm bundler plugins let TypeScript import Solidity modules directly.

import{createMemoryClient}from"tevm";import{ERC20}from"@openzeppelin/contracts/token/ERC20.sol";constclient=createMemoryClient();consttoken=ERC20.withAddress("0x0000000000000000000000000000000000000000");constbalance=awaitclient.tevmContract(token.read.balanceOf("0x0000000000000000000000000000000000000001"),);

tevm.json is optional in the RC series. Use package-specific bundler docs for Vite, Webpack, Bun, esbuild, rspack, and other integrations.

Packages

The tevm package re-exports the most common runtime APIs. Individual packages remain available when you want smaller imports or lower-level control.

PackagePurpose
tevmMain batteries-included package
@tevm/memory-clientviem-compatible in-memory Ethereum client
@tevm/nodeLow-level Tevm node and decorator runtime
@tevm/actionsTevm actions, JSON-RPC handlers, and debug APIs
@tevm/decoratorsClient extensions for actions, EIP-1193, and events
@tevm/block, @tevm/blockchain, @tevm/tx, @tevm/txpoolChain, block, transaction, and mempool internals
@tevm/receipt-managerReceipt storage and lookup
@tevm/state, @tevm/vm, @tevm/evmState manager and execution internals
@tevm/sync-storage-persisterSynchronous persistence for browser or embedded storage

Learn More

Community

Contributing

Contributions are welcome. See CONTRIBUTING.md for local setup, testing, and pull-request guidance.

License

Tevm is MIT licensed. See LICENSE for details.

About

An Ethereum Node built to run in Browser, Bun, Deno, and Node.js

Topics

Resources

Code of conduct

Contributing

Stars

446 stars

Watchers

3 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

2,165 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Tevm Logo

Tevm

JavaScript-native Ethereum runtime for TypeScript apps, tests, and tools.

CI StatusNPM RC VersionTevm DownloadsMinzipped SizeTelegramAsk DeepWiki


Release Candidate

Tevm 1.0 is now available on the npm rc dist-tag.

npm install tevm@rc viem

The release candidate includes the new block, mining, receipt, txpool, JSON-RPC, tracing, and viem-compatible client work that replaces the older pre-1.0 README examples. The npm latest tag may still point at the older next series, so use tevm@rc when trying the current 1.0 release candidate.

What Is Tevm?

Tevm runs an Ethereum execution environment inside JavaScript. Use it as an in-memory devnet, a forked-chain simulator, an EIP-1193 provider, a viem-compatible client, or a lower-level EVM toolkit.

It runs in Node, Bun, browsers, serverless functions, edge runtimes, and desktop apps without Docker or a background chain process.

Why Use It?

  • Fork any EVM chain locally: run calls against mainnet, L2s, L3s, or appchains while overriding accounts, storage, and block context.
  • Use viem actions directly: createMemoryClient includes viem public, wallet, and Anvil-style test actions.
  • Control mining behavior: choose automatic, manual, or interval mining and decide when pending transactions become canonical blocks.
  • Inspect real execution: collect traces, receipts, logs, access lists, created addresses, and block-level results from local execution.
  • Import Solidity in TypeScript: use Tevm bundler plugins to import Solidity contracts with ABI, bytecode, and type-safe helpers.
  • Run in the browser: build local-first dapps, optimistic UIs, demos, and tests where a separate RPC node would be too heavy.
  • Extend the EVM: add custom precompiles, predeploys, decorators, and low-level runtime packages when you need direct control.

Quick Start

Create a local in-memory chain, add a transaction to the mempool, mine it, and read the receipt.

import{createMemoryClient,parseEther}from"tevm";constclient=createMemoryClient({miningConfig: {type: "manual"},});awaitclient.tevmReady();constalice="0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266";constbob="0x1111111111111111111111111111111111111111";awaitclient.tevmSetAccount({address: alice,balance: parseEther("1"),});const{ txHash }=awaitclient.tevmCall({from: alice,to: bob,value: parseEther("0.1"),addToMempool: true,});if(!txHash){thrownewError("Transaction was not added to the mempool");}awaitclient.tevmMine({blockCount: 1});constreceipt=awaitclient.getTransactionReceipt({hash: txHash});constbalance=awaitclient.getBalance({address: bob});console.log(receipt.status,balance);

Fork Mainnet Or An L2

Tevm can fork through any EIP-1193 or viem transport. Set common when you know the chain to avoid an extra chain-id lookup.

import{createMemoryClient,http,parseAbi}from"tevm";import{optimism}from"tevm/common";constclient=createMemoryClient({common: optimism,fork: {transport: http("https://mainnet.optimism.io"),blockTag: "latest",},miningConfig: {type: "manual"},});awaitclient.tevmReady();constabi=parseAbi(["function balanceOf(address) view returns (uint256)"]);constbalance=awaitclient.readContract({address: "0x4200000000000000000000000000000000000042",
abi,functionName: "balanceOf",args: ["0x0000000000000000000000000000000000000000"],});console.log(balance);

New In The 1.0 RC

  • Blocks and canonical chain state: Tevm now mines blocks instead of only mutating state snapshots. Calls that create transactions are pending until mined; cheat methods such as tevmSetAccount still update canonical state immediately.
  • Mining modes: configure miningConfig with manual, auto, or interval behavior. Use client.tevmMine() or viem's Anvil-compatible client.mine() to advance the chain.
  • Txpool and receipts: transactions can enter the mempool, be mined into blocks, and then be queried through viem actions or JSON-RPC methods such as eth_getTransactionReceipt.
  • Historical block tags: blockTag works for forked history and locally mined Tevm blocks.
  • State and block overrides: tevmCall, tevmContract, tevmDeploy, and eth_call can run with temporary account, storage, and block overrides.
  • Execution tracing: use createTrace on calls and traceConfig on debug APIs to inspect EVM execution for tests, debuggers, and profilers.
  • Synchronous client creation: createMemoryClient() and createTevmNode() return synchronously; client.tevmReady() and node.ready() are available when you want to eagerly wait for initialization.
  • EIP-1193 request support: request now follows the EIP-1193 shape. The previous low-level request helpers are available as send and sendBulk.
  • Stable decorators: extend TevmNode with tevmActions, ethActions, tevmSend, and requestEip1193.
  • Broader JSON-RPC compatibility: Tevm supports more Ethereum, Anvil, Ganache, and Hardhat-compatible RPC methods for viem test-client workflows.
  • State persistence: persist and hydrate in-memory client state with synchronous storage using createSyncStoragePersister.
  • Runtime packages: the monorepo now includes Tevm-native block, blockchain, tx, txpool, receipt-manager, state, VM, and utility packages.

API Surface

Memory Client

createMemoryClient is the easiest entry point. It returns a viem client with Tevm actions and Anvil-style test actions already installed.

import{createMemoryClient}from"tevm";constclient=createMemoryClient({miningConfig: {type: "auto"},});awaitclient.tevmReady();awaitclient.tevmSetAccount({address: "0x0000000000000000000000000000000000000001",balance: 1n});awaitclient.getBlockNumber();

Tevm Node

createTevmNode gives lower-level access to the runtime and decorator model.

import{createTevmNode}from"tevm";import{requestEip1193,tevmActions}from"tevm/decorators";constnode=createTevmNode({miningConfig: {type: "manual"}}).extend(tevmActions()).extend(requestEip1193());awaitnode.ready();constchainId=awaitnode.request({method: "eth_chainId"});

Solidity Imports

Tevm bundler plugins let TypeScript import Solidity modules directly.

import{createMemoryClient}from"tevm";import{ERC20}from"@openzeppelin/contracts/token/ERC20.sol";constclient=createMemoryClient();consttoken=ERC20.withAddress("0x0000000000000000000000000000000000000000");constbalance=awaitclient.tevmContract(token.read.balanceOf("0x0000000000000000000000000000000000000001"),);

tevm.json is optional in the RC series. Use package-specific bundler docs for Vite, Webpack, Bun, esbuild, rspack, and other integrations.

Packages

The tevm package re-exports the most common runtime APIs. Individual packages remain available when you want smaller imports or lower-level control.

PackagePurpose
tevmMain batteries-included package
@tevm/memory-clientviem-compatible in-memory Ethereum client
@tevm/nodeLow-level Tevm node and decorator runtime
@tevm/actionsTevm actions, JSON-RPC handlers, and debug APIs
@tevm/decoratorsClient extensions for actions, EIP-1193, and events
@tevm/block, @tevm/blockchain, @tevm/tx, @tevm/txpoolChain, block, transaction, and mempool internals
@tevm/receipt-managerReceipt storage and lookup
@tevm/state, @tevm/vm, @tevm/evmState manager and execution internals
@tevm/sync-storage-persisterSynchronous persistence for browser or embedded storage

Learn More

Community

Contributing

Contributions are welcome. See CONTRIBUTING.md for local setup, testing, and pull-request guidance.

License

Tevm is MIT licensed. See LICENSE for details.

About

An Ethereum Node built to run in Browser, Bun, Deno, and Node.js

Topics

Resources

Code of conduct

Contributing

Stars

446 stars

Watchers

3 watching

Forks

Releases

Sponsor this project

Used by

Contributors

Languages