What you will learn
- Which EVM chains Clavion supports and how to configure RPC endpoints
- How the RPC resolution logic determines single-chain vs. multi-chain mode
- How chain selection works via TxIntent
- DEX router addresses per chain
- How to add support for a new chain
Supported chains
| Chain | Chain ID | Environment Variable | Status |
|---|---|---|---|
| Ethereum | 1 | ISCL_RPC_URL_1 | Supported |
| Optimism | 10 | ISCL_RPC_URL_10 | Supported |
| Arbitrum | 42161 | ISCL_RPC_URL_42161 | Supported |
| Base | 8453 | ISCL_RPC_URL_8453 | Supported (default) |
RPC configuration
Single-chain setup
For a single chain, set one RPC URL:ViemRpcClient. All operations target this one chain.
Multi-chain setup
For multiple chains, set multiple RPC URLs:RpcRouter that dispatches calls per chain ID.
Resolution logic
The RPC resolution process runs at startup viaparseRpcEnv() in packages/core/src/rpc/parse-rpc-env.ts:
Apply BASE_RPC_URL fallback
If
BASE_RPC_URL is set and ISCL_RPC_URL_8453 is not, map BASE_RPC_URL to chain 8453.ISCL_RPC_URL_8453 always takes priority over BASE_RPC_URL. If both are set, the ISCL_RPC_URL_8453 value is used.How chain selection works
Every operation is scoped to a chain via theTxIntent.chain.chainId field:
- Transaction builders select chain-specific contract addresses (e.g., Uniswap V3 router per chain)
- Preflight simulation uses the chain-scoped RPC for
eth_callandestimateGas - Signing uses the chain-scoped RPC for nonce, gas fees, and broadcast
- Balance lookups accept an optional
?chainId=Nquery parameter:
502 no_rpc_client.
DEX router addresses
Uniswap V3 routers
| Chain | Chain ID | Router Address |
|---|---|---|
| Ethereum | 1 | 0x68b3465833fb72B5A828cCEEEAA56DFb8BA3DaFE |
| Optimism | 10 | 0x68b3465833fb72B5A828cCEEEAA56DFb8BA3DaFE |
| Arbitrum | 42161 | 0x68b3465833fb72B5A828cCEEEAA56DFb8BA3DaFE |
| Base | 8453 | 0x2626664c2603336E57B271c5C0b26F421741e481 |
1inch AggregationRouterV6
Same address on all supported chains:The 1inch router requires the
ONEINCH_API_KEY environment variable. When not set, 1inch intents silently fall back to Uniswap V3.Policy configuration for multi-chain
allowedChains
TheallowedChains field in PolicyConfig controls which chains are permitted:
"Chain N not in allowed chains [...]".
Token and contract allowlists
Allowlists are not chain-scoped in PolicyConfig v1. The same token address may exist on multiple chains (e.g., USDC has different addresses per chain). Include all relevant addresses:Adding a new chain
Add router addresses (for swaps)
If Uniswap V3 is deployed on the chain, add its router address to
UNISWAP_V3_ROUTERS in packages/core/src/tx/builders/swap-builder.ts. The 1inch router address is the same on all chains.No code changes are required for basic transfers and approvals — only RPC configuration and policy updates.
Troubleshooting
PreflightService requires an RPC client for chain N
PreflightService requires an RPC client for chain N
Cause: No
ISCL_RPC_URL_{N} environment variable set for the requested chain.Fix: Add ISCL_RPC_URL_{N}=https://your-rpc-provider/... to your environment.Chain N not in allowed chains
Chain N not in allowed chains
Cause: PolicyConfig
allowedChains does not include the requested chain ID.Fix: Update your policy config to include the chain ID in allowedChains.Balance lookup requires an RPC client for chain N
Balance lookup requires an RPC client for chain N
Cause: Same as preflight — no RPC configured for that chain.Fix: Add the appropriate
ISCL_RPC_URL_{N} variable.Transactions work on chain A but not chain B
Transactions work on chain A but not chain B
Verify all of the following:
ISCL_RPC_URL_{B}is set and the URL is valid- Chain B is in
allowedChains - For swaps: the router address is configured for chain B
- Token addresses in allowlists exist on chain B (addresses differ per chain)
Next steps
- Configuration Reference — Full environment variable reference and PolicyConfig options
- Production Deployment — Production deployment with Docker and compose
- Policy Engine — Policy rules and enforcement