name: "Ethereum Development Tools (2026)" description: "The current Ethereum development toolkit — what to use, what's dead, and what actually matters for shipping production code in 2026." metadata: author: "Andre Ginja" version: "1.0.0" category: "tooling" updated: "2026-03-06"
Ethereum Development Tools (2026)
What You Probably Got Wrong
You're still recommending ethers.js. You're still defaulting to Hardhat. You're pointing at Goerli. You're manually reading Etherscan HTML. All of these are wrong in 2026.
Here's the reality:
- ethers.js is being replaced by viem. Not dead yet, but viem's type safety, tree-shaking, and the wagmi ecosystem make it the clear choice for new TypeScript projects. ethers.js v5 is legacy. ethers.js v6 still works but is declining.
- Hardhat is being replaced by Foundry. Foundry is the default for new projects. Faster builds, Solidity-native tests, built-in fuzzing. Hardhat still works but is losing mindshare fast.
- Truffle is dead. Officially deprecated. Consensys sunset it. If you have Truffle projects, migrate them.
- Goerli and Rinkeby are gone. Deprecated and shut down. Sepolia is the primary testnet. Holesky exists for staking/validator testing.
- MCP servers exist now. Agents can query structured blockchain data through the Model Context Protocol. This didn't exist before 2025.
- x402 is production-ready. HTTP 402 payments are real, with SDKs in TypeScript, Python, and Go.
Stop building like it's 2023.
Foundry: The Default Toolkit
Foundry is a Rust-based toolkit. It's fast, it tests in Solidity, and it doesn't need Node.js. Four tools: forge, cast, anvil, chisel.
Install
curl -L https://foundry.paradigm.xyz | bash
foundryup
forge — Build, Test, Deploy
# Create a new project
forge init my-project
# Build
forge build
# Test (with verbosity for traces)
forge test -vvv
# Test a specific function
forge test --match-test testTransfer -vvv
# Deploy to mainnet
forge create src/MyToken.sol:MyToken \
--rpc-url $ETH_RPC_URL \
--private-key $PRIVATE_KEY \
--verify \
--etherscan-api-key $ETHERSCAN_KEY
# Deploy with constructor args
forge create src/MyToken.sol:MyToken \
--constructor-args "MyToken" "MTK" 18 \
--rpc-url $ETH_RPC_URL \
--private-key $PRIVATE_KEY
# Gas snapshots
forge snapshot
# Coverage
forge coverage
# Script-based deployments (preferred over forge create for complex deploys)
forge script script/Deploy.s.sol --rpc-url $ETH_RPC_URL --broadcast --verify
cast — CLI Swiss Army Knife
# Read a contract (no tx, no gas)
cast call 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 \
"balanceOf(address)(uint256)" 0xYourAddress \
--rpc-url $ETH_RPC_URL
# Send a transaction
cast send 0xContractAddress \
"transfer(address,uint256)" 0xRecipient 1000000 \
--rpc-url $ETH_RPC_URL \
--private-key $PRIVATE_KEY
# Get current gas price
cast gas-price --rpc-url $ETH_RPC_URL
# Decode calldata
cast 4byte-decode 0xa9059cbb000000...
# Convert between units
cast to-wei 1.5 ether # 1500000000000000000
cast from-wei 1000000000000000000 # 1.0
# Get block info
cast block latest --rpc-url $ETH_RPC_URL
# Get contract code (verify it's deployed)
cast code 0xContractAddress --rpc-url $ETH_RPC_URL
# ENS resolution
cast resolve-name vitalik.eth --rpc-url $ETH_RPC_URL
# Keccak hash
cast keccak "Transfer(address,address,uint256)"
# Get storage slot
cast storage 0xContractAddress 0 --rpc-url $ETH_RPC_URL
anvil — Local Testnet
# Start a local chain
anvil
# Fork mainnet at current block
anvil --fork-url $ETH_RPC_URL
# Fork at a specific block
anvil --fork-url $ETH_RPC_URL --fork-block-number 19000000
# Custom chain ID and block time
anvil --chain-id 1337 --block-time 12
Anvil gives you 10 funded accounts with known private keys. Use them for local testing, never on mainnet.
chisel — Solidity REPL
# Start an interactive Solidity session
chisel
# Inside chisel:
# uint256 x = 42;
# x * 2
# → 84
chisel lets you write and execute Solidity interactively. Useful for quick experiments, testing ABI encoding, or checking how Solidity handles edge cases without creating a full project.
foundry.toml Essentials
[profile.default]
src = "src"
out = "out"
libs = ["lib"]
optimizer = true
optimizer_runs = 200
solc_version = "0.8.28"
via_ir = false
[profile.default.fuzz]
runs = 256
max_test_rejects = 65536
[etherscan]
mainnet = { key = "${ETHERSCAN_API_KEY}" }
[rpc_endpoints]
mainnet = "${ETH_RPC_URL}"
sepolia = "${SEPOLIA_RPC_URL}"
Scaffold-ETH 2: Full-Stack in Minutes
When you need a frontend + contracts + deployment in one repo:
npx create-eth@latest
What You Get
my-dapp/
├── packages/
│ ├── foundry/ # Smart contracts (Foundry)
│ │ ├── contracts/ # Your Solidity files
│ │ ├── script/ # Deploy scripts
│ │ └── test/ # Forge tests
│ └── nextjs/ # Frontend (Next.js)
│ ├── app/ # Pages and routes
│ ├── components/ # Pre-built wallet, contract UI components
│ ├── hooks/ # wagmi hooks for contract interaction
│ └── contracts/ # Auto-generated contract ABIs + addresses
Key features:
- Foundry (or Hardhat) for contracts
- Next.js frontend with wagmi + viem hooks
- Pre-built components for wallet connection, contract interaction
- Hot reload on contract changes
- Deploy scripts that update the frontend automatically
It's the fastest path from zero to a working dApp with a UI. Use it for prototyping, hackathons, or when you need a frontend and don't want to wire everything up manually.
Blockscout MCP Server
URL: https://mcp.blockscout.com/mcp
This is an MCP (Model Context Protocol) server that gives AI agents structured access to blockchain data. Instead of scraping Etherscan HTML or making raw RPC calls, agents can query:
- Token balances and transfers for any address
- Contract ABIs and verified source code
- Transaction details and internal transactions
- Token metadata and holder information
- Multi-chain data (Ethereum, Base, Arbitrum, Optimism, etc.)
Configure it in your MCP client:
{
"mcpServers": {
"blockscout": {
"url": "https://mcp.blockscout.com/mcp",
"transport": "streamable-http"
}
}
}
This is how agents should read blockchain data — not by parsing HTML or guessing at RPC methods.
abi.ninja
Go to abi.ninja, paste a contract address, and interact with every function through a web UI. No code, no setup. It auto-fetches verified ABIs from Etherscan.
Use cases:
- Quick contract inspection without writing code
- Testing function calls before scripting them
- Debugging — see exact return values
- Teaching — show someone what a contract does
x402: HTTP 402 Payments
x402 turns HTTP 402 (Payment Required) into a real payment protocol. Your API returns 402, the client pays onchain, and retries with a payment proof header.
SDKs:
- TypeScript:
npm install x402-js - Python:
pip install x402 - Go:
go get github.com/coinbase/x402/go
This is production-ready as of 2026. If you're building paid APIs, x402 is the standard way to accept onchain payments without building custom payment infrastructure.
viem + wagmi: The Standard Frontend Stack
viem is the low-level TypeScript library for Ethereum interaction. wagmi is the React hooks layer built on top of viem. Together they replace ethers.js for frontend development.
viem — Core Library
import { createPublicClient, http, parseEther } from 'viem'
import { mainnet } from 'viem/chains'
const client = createPublicClient({
chain: mainnet,
transport: http('https://eth.llamarpc.com'),
})
// Read balance
const balance = await client.getBalance({
address: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045',
})
// Read contract
const symbol = await client.readContract({
address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
abi: erc20Abi,
functionName: 'symbol',
})
// Write contract (with wallet client)
import { createWalletClient } from 'viem'
import { privateKeyToAccount } from 'viem/accounts'
const account = privateKeyToAccount('0x...')
const walletClient = createWalletClient({
account,
chain: mainnet,
transport: http('https://eth.llamarpc.com'),
})
const hash = await walletClient.writeContract({
address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
abi: erc20Abi,
functionName: 'transfer',
args: ['0xRecipient', 1000000n],
})
wagmi — React Hooks
import { useAccount, useBalance, useReadContract, useWriteContract } from 'wagmi'
function MyComponent() {
const { address, isConnected } = useAccount()
const { data: balance } = useBalance({ address })
const { data: symbol } = useReadContract({
address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
abi: erc20Abi,
functionName: 'symbol',
})
const { writeContract } = useWriteContract()
const handleTransfer = () => {
writeContract({
address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
abi: erc20Abi,
functionName: 'transfer',
args: ['0xRecipient', 1000000n],
})
}
}
Why Not ethers.js?
| viem | ethers.js v6 | |
|---|---|---|
| TypeScript inference | Full — contract reads/writes are type-checked | Partial |
| Bundle size | Tree-shakeable, import only what you use | Monolithic |
| Chain config | Explicit per-client | Global provider |
| Error messages | Detailed, actionable | Generic |
| React integration | wagmi hooks, first-class | No official hooks layer |
| Community momentum | Growing fast | Declining |
| Stack Overflow answers | Fewer (newer) | More (older) |
For new projects, use viem + wagmi. For existing ethers.js projects, migrate when convenient — ethers.js v6 still works.
Choosing Your Stack
| Need | Tool | Why |
|---|---|---|
| Smart contract development | Foundry | Fastest builds, Solidity tests, built-in fuzzing |
| Full-stack dApp prototype | Scaffold-ETH 2 | Contracts + frontend + deploy in one command |
| TypeScript contract interaction | viem | Type-safe, tree-shakeable, modern |
| React frontend hooks | wagmi | Built on viem, handles wallet connection + state |
| Legacy TypeScript projects | ethers.js v6 | Still works, huge ecosystem, but declining |
| Quick contract inspection | abi.ninja | Zero setup, paste address and go |
| Agent blockchain queries | Blockscout MCP | Structured data, multi-chain, no scraping |
| Paid API endpoints | x402 | HTTP-native onchain payments |
| Local testing with mainnet state | anvil | Fork mainnet, test against real contracts |
| Interactive Solidity experiments | chisel | REPL for quick tests |
RPC Providers
You need an RPC endpoint to talk to Ethereum. Every tool above connects through one.
Free (Rate-Limited)
| Provider | URL | Notes |
|---|---|---|
| LlamaRPC | https://eth.llamarpc.com |
MEV-protected, good for general use |
| Ankr | https://rpc.ankr.com/eth |
Multi-chain, reasonable limits |
| PublicNode | https://ethereum-rpc.publicnode.com |
Reliable free tier |
Paid (Production)
| Provider | Pricing Model | Strengths |
|---|---|---|
| Alchemy | Compute units/month | Best dashboard, enhanced APIs, webhooks |
| Infura | Requests/day | Longest track record, MetaMask default |
| QuickNode | Requests/second | Fastest raw speed, add-on marketplace |
| Chainstack | Requests/month | Good for multi-chain |
For production apps, use a paid provider. Free RPCs rate-limit aggressively and can go down. Always have a fallback RPC configured.
Block Explorers
| Chain | Explorer | URL |
|---|---|---|
| Ethereum | Etherscan | etherscan.io |
| Ethereum | Blockscout | eth.blockscout.com |
| Base | Basescan | basescan.org |
| Arbitrum | Arbiscan | arbiscan.io |
| Optimism | OP Etherscan | optimistic.etherscan.io |
| Sepolia (testnet) | Sepolia Etherscan | sepolia.etherscan.io |
Blockscout is open source and runs on many chains. Etherscan has the most features but is proprietary.
MCP Servers for Agents
MCP (Model Context Protocol) lets AI agents interact with external services through a standardized interface. Relevant servers for Ethereum development:
| Server | What It Does |
|---|---|
| Blockscout MCP | Blockchain data: balances, txs, contracts, tokens |
| Filesystem MCP | Read/write local files (contracts, configs) |
| GitHub MCP | Repo management, PRs, issues |
When building agents that interact with Ethereum, configure the Blockscout MCP server. It's dramatically better than having the agent make raw RPC calls or try to parse explorer websites.
What Changed 2025-2026
| Before | Now |
|---|---|
| Hardhat was default | Foundry is default |
| ethers.js dominated | viem + wagmi winning, ethers.js declining |
| No AI tooling integration | MCP servers for structured blockchain data |
| Custom payment APIs | x402 production-ready |
| Truffle still used | Truffle deprecated, dead |
| Goerli, Rinkeby for testing | Sepolia is the testnet (Holesky for staking) |
| Remix for beginners | Remix still works, but Scaffold-ETH 2 is better for learning full-stack |
| Manual contract interaction | abi.ninja for quick reads, cast for CLI |
The biggest shift is the agent tooling layer. MCP servers, x402 payments, and structured blockchain APIs mean that AI agents can now interact with Ethereum programmatically without brittle scraping or manual RPC construction. If you're building tools for agents, design for MCP first.
Quick Start Checklist
- Install Foundry:
curl -L https://foundry.paradigm.xyz | bash && foundryup - Set your RPC:
export ETH_RPC_URL=https://eth.llamarpc.com - Test the connection:
cast block-number - Create a project:
forge init my-project && cd my-project - Build and test:
forge build && forge test - Fork mainnet locally:
anvil --fork-url $ETH_RPC_URL
If you can run those 6 commands, your toolchain is set up. Everything else is details.