Networks
Ethereum mainnet, any EVM-compatible chain, and how to add your own
Chain-agnostic by design: this node isn't hardcoded to Ethereum mainnet — every network is a
named entry in appsettings pointing at a JSON-RPC endpoint plus a chain ID. Any EVM-compatible chain works:
Ethereum, Polygon, Arbitrum, Optimism, Base, a local Anvil/Hardhat instance, or a private/enterprise chain.
| Network Name (example) | Chain ID | Typical RPC Provider | Use For |
|---|---|---|---|
ethereum | 1 | Alchemy / Infura / QuickNode | Default network. Ethereum mainnet — real ETH, real gas fees on any write. |
polygon | 137 | Alchemy / Infura / QuickNode | Polygon PoS mainnet — same node code, different chain. |
sepolia | 11155111 | Alchemy / Infura | Ethereum's current public testnet — free faucet ETH, safe for development. |
arbitrum / optimism / base | 42161 / 10 / 8453 | Alchemy / Infura / QuickNode | Popular L2 rollups — add as additional Networks entries the same way. |
| local dev chain | 31337 (Anvil/Hardhat default) | none — RpcUrl: "http://localhost:8545" | Local development against Anvil, Hardhat, or Ganache. No API key needed. |
None of these names are special-cased in code — they're whatever keys you configure under
Ethereum:Networks. The names above are conventions, not requirements.
How Network Selection Works
- Each operation call may include a
networkconfig key. - If set, the node resolves that network's
RpcUrl(orRpcUrlCredentialId) fromEthereum:Networksand calls it. - If unset, the node uses whatever
Ethereum:DefaultNetworkpoints to. - If the resolved network name has no matching entry under
Ethereum:Networks, the node throwsEthereumNetworkNotConfiguredExceptionrather than silently falling back to another chain. EthereumConnectionProvidercaches a read-only NethereumWeb3client per network name (singleton) so repeated calls to the same network reuse the same client.
Adding a Custom Network
Add any additional entry under Ethereum:Networks — the key becomes the value workflows pass in
the network field:
"Ethereum": {
"DefaultNetwork": "ethereum",
"Networks": {
"ethereum": { "RpcUrl": "https://eth-mainnet.g.alchemy.com/v2/YOUR_KEY", "ChainId": 1, "BlockExplorer": "https://etherscan.io" },
"arbitrum": { "RpcUrl": "https://arb-mainnet.g.alchemy.com/v2/YOUR_KEY", "ChainId": 42161, "BlockExplorer": "https://arbiscan.io" },
"local-dev": { "RpcUrl": "http://localhost:8545", "ChainId": 31337 }
}
}
No code change or redeploy of the node itself is required — this is a pure configuration addition.
Protect provider API keys: never put an Alchemy/Infura/QuickNode URL with an embedded key
directly in
RpcUrl in a committed appsettings file. Use RpcUrlCredentialId instead —
a vault credential of type SERVICE_URL whose Service URL field holds the full key-bearing URL.
Only endpoints with no embedded secret (local dev chains, self-hosted nodes) belong in plain
RpcUrl. See Configuration.
Network-Specific Caveats
| Area | Caveat |
|---|---|
| ENS (ENS Operations) | The ENS Registry contract this node calls is deployed at the same address on Ethereum mainnet and several historical/current testnets (Sepolia included), but is not generally deployed on L2s like Polygon/Arbitrum/Optimism/Base under that address. Run ENS operations against network=ethereum (or a testnet where the registry exists) rather than an L2. |
| Gas fields (Gas Operations) | EIP-1559 fields (maxFeePerGas, maxPriorityFeePerGas, gas.priorityFee) assume a chain that supports the London fee market. Most modern EVM chains do; older/simpler chains may only support legacy gasPrice. |
| Rate limiting | EthereumRateLimitHandler retries HTTP 429 responses from the RPC provider automatically — heavier free-tier provider plans still apply their own hard caps. |