Why Run Ethereum in JavaScript?
JavaScript has emerged as an ideal environment for running Ethereum, offering unique advantages for both developers and end-users. Here's why running an Ethereum node in JavaScript unlocks powerful new capabilities.
Performance & Efficiency
โก Zero Network Latency
Running the EVM locally eliminates round-trip delays to remote nodes, enabling near-instantaneous transaction simulations and gas estimations.
๐ Powerful JS interop
Simulate multiple transactions plugging directly into the evm with JS or even writing custom contracts in JS.
Real-World Performance Benefits
const gasEstimate0 = await provider.estimateGas({ ... }) // ~200ms as it fetches state
const gasEstimate0 = await provider.estimateGas({ ... }) // ~Instant on future estimations with cache saved
const gasEstimate0 = await provider.estimateGas({ ... }) // ~Instant on future estimations with cache saved
Enhanced User Experiences
JavaScript-based EVM execution enables entirely new categories of dApp features:
๐ฑ Offline Capabilities
Enable local-first applications that work without constant network connectivity.
โก Optimistic UI
Show users the likely outcome of transactions before they're mined on-chain.
๐ก๏ธ Improved Reliability
Reduce dependency on external infrastructure, making dApps more resilient.
๐งฎ Transaction Simulation
Simulate complex interactions and preview results before sending transactions.
๐ Enhanced Privacy
Process sensitive data locally without sending it to external services.
๐ Accelerated Development
Ship advanced UX faster and safer using Tevm bundler's typesafe Solidity imports, eliminating contract integration errors.
Developer Experience Advantages
Advanced Debugging ๐ฌ
Step through EVM execution opcode by opcode, inspect memory and stack, and see exactly what happens in your contracts.
// Use tevmContract for easy debugging with execution hooks
const result = await client.tevmContract({
to: contractAddress,
abi: contractAbi,
functionName: 'myFunction',
args: [param1, param2],
// Listen to every EVM instruction
onStep: (data, next) => {
console.log(
`${data.pc.toString().padStart(5)}:`,
`${data.opcode.name.padEnd(10)}`,
`gas: ${data.gasLeft.toString().padStart(8)}`,
`stack: ${data.stack.join(', ')}`
)
next()
}
})
Deterministic Testing ๐งช
Create fully reproducible environments for testing with complete control over blockchain state, time, and mining.
// Create a snapshot before test
const snapshotId = await client.tevmSnapshot()
// Run the test
await client.setBalance({ address: testAccount, value: parseEther("100") })
await client.sendTransaction({ ... })
await client.mine({ blocks: 1 })
const result = await client.call({ ... })
// Restore state after test
await client.tevmRevert({ snapshotId })
Portable Environment ๐ผ
The same Ethereum environment works across Node.js, browsers, serverless functions, and other JavaScript runtimes.
import { createMemoryClient } from 'tevm'
// Create an in-browser Ethereum node
const client = createMemoryClient()
document.querySelector('#button').addEventListener('click', async () => {
const balance = await client.getBalance({
address: '0x...'
})
console.log(`Balance: ${formatEther(balance)} ETH`)
})
import { createMemoryClient } from 'tevm'
// Create a Node.js Ethereum node
const client = createMemoryClient()
async function main() {
const balance = await client.getBalance({
address: '0x...'
})
console.log(`Balance: ${formatEther(balance)} ETH`)
}
main().catch(console.error)
import { createMemoryClient } from 'tevm'
export async function handler(event) {
// Create a serverless Ethereum node
const client = createMemoryClient()
const balance = await client.getBalance({
address: event.address
})
return {
statusCode: 200,
body: JSON.stringify({ balance: balance.toString() })
}
}
Solidity Imports
Tevm Bundler (optional feature) creates the best devx for working with solidity files in TypeScript
// Import solidity files directly into TS files
import { MyContract } from "./MyContract.sol";
The devx is optimized in following ways:
- Natspec on hover
- Typesafe contract
- TRPC like experience. You will see red underlines before you even save a solidity file
- No need to set up external build tools. Plugs directly into your existing js pipeline
JavaScript Ecosystem Integration
๐ค TypeScript
Type-safe contract interactions with full IntelliSense support
โ๏ธ UI Frameworks
React, Vue, Svelte and other frontend libraries
๐๏ธ Build Tools
Vite, Webpack, ESBuild and other bundlers
๐งช Testing
Vitest support via Vite
๐ Runtimes
Node.js, browsers, Electron, serverless functions
๐ฆ NPM Ecosystem
Access to millions of packages and libraries in the npm registry
๐ Web APIs
Integration with browser storage, WebSockets, service workers, and more