Portal Community
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 IDTypical RPC ProviderUse For
ethereum1Alchemy / Infura / QuickNodeDefault network. Ethereum mainnet — real ETH, real gas fees on any write.
polygon137Alchemy / Infura / QuickNodePolygon PoS mainnet — same node code, different chain.
sepolia11155111Alchemy / InfuraEthereum's current public testnet — free faucet ETH, safe for development.
arbitrum / optimism / base42161 / 10 / 8453Alchemy / Infura / QuickNodePopular L2 rollups — add as additional Networks entries the same way.
local dev chain31337 (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

  1. Each operation call may include a network config key.
  2. If set, the node resolves that network's RpcUrl (or RpcUrlCredentialId) from Ethereum:Networks and calls it.
  3. If unset, the node uses whatever Ethereum:DefaultNetwork points to.
  4. If the resolved network name has no matching entry under Ethereum:Networks, the node throws EthereumNetworkNotConfiguredException rather than silently falling back to another chain.
  5. EthereumConnectionProvider caches a read-only Nethereum Web3 client 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

AreaCaveat
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 limitingEthereumRateLimitHandler retries HTTP 429 responses from the RPC provider automatically — heavier free-tier provider plans still apply their own hard caps.