Stop writing boilerplate
EVM chain config

One .env file. All frameworks — Hardhat, Foundry, viem, and ethers. 18+ chains auto-detected.

$ npm install evmchain-config

The problem

Every Solidity project has this boilerplate. It's fragile, repetitive, and error-prone.

// The old way — repeated for every project import * as dotenv from 'dotenv'; dotenv.config(); const config: HardhatUserConfig = { networks: { ethereum: { url: process.env.ETHEREUM_RPC_URL!, chainId: 1, accounts: [process.env.PRIVATE_KEY!] }, arbitrum: { url: process.env.ARBITRUM_RPC_URL!, chainId: 42161, accounts: [process.env.PRIVATE_KEY!] }, base: { url: process.env.BASE_RPC_URL!, chainId: 8453, accounts: [process.env.PRIVATE_KEY!] }, optimism: { url: process.env.OPTIMISM_RPC_URL!, chainId: 10, accounts: [process.env.PRIVATE_KEY!] }, // ... repeated 10 more times } };

The solution

One config loader. Works with every EVM framework.

HARDHAT

import { loadEvmChainsSync } from 'hardhat-evmchain'; export default { solidity: '0.8.24', ...loadEvmChainsSync(), };

VIEM

import { createMultichainClients } from 'viem-multichain'; const { getClient } = await createMultichainClients(); const eth = getClient('ethereum');

.ENV (ONE FILE FOR ALL FRAMEWORKS)

ETHEREUM_RPC_URL=https://eth-mainnet.g.alchemy.com/v2/YOUR_KEY ARBITRUM_RPC_URL=https://arb-mainnet.g.alchemy.com/v2/YOUR_KEY BASE_RPC_URL=https://base-mainnet.g.alchemy.com/v2/YOUR_KEY PRIVATE_KEY=0x...

Why it works

Auto-detection

Reads RPC URLs from env var names. ARBITRUM_RPC_URL → arbitrum chain. No manual mapping.

🔧

Framework adapters

Built-in adapters for Hardhat, viem, and ethers. Same config, all frameworks.

🛡️

Validation

Warns about public RPCs on mainnet, missing explorer keys, invalid key formats.

🗺️

18+ chains

Ethereum, Arbitrum, Base, Optimism, Polygon, zkSync, Linea, Scroll, Blast, and more.

Ecosystem

Install just what you need.