Networks
The bundled per-network reference table — chain IDs, chain selectors, Router addresses
Several operations (router/getAddress, router/isChainSupported,
router/getFee, router/convertChainSelector, and optionally
lane/getSupportedLanes) take a network config key. The node resolves it against a
small, bundled static reference table rather than a live CCIP Directory API call:
| Network | Native Chain ID | CCIP Chain Selector | Router Address |
|---|---|---|---|
ethereum-mainnet |
1 |
5009297550715157269 |
0x80226fc0Ee2b096224EeAc085Bb9a8cba1146f7D |
arbitrum-mainnet |
42161 |
4949039107694359620 |
0x141fa059441E0ca23ce184B6A78bafD2A517DdE8 |
base-mainnet |
8453 |
15971525489660198786 |
0x881e3A65B4d4a04dD529061dd0071cf975F58bCD |
ethereum-mainnet's CCIP chain selector was independently confirmed against Chainlink's own
published CCIP Directory during this node's design review. Every other row — and every Router address,
including Ethereum mainnet's — is a representative placeholder pending a live CCIP Directory pull.
Router contract addresses are also per-CCIP-version and change whenever Chainlink upgrades the Router
contract. Reconcile this table against the live CCIP Directory before relying on it for production
traffic beyond simple connectivity testing. See Roadmap.
Why Chain Selectors Are Strings
Every chain selector and on-chain integer in this node's config and output contract is a
string, never a number. Ethereum mainnet's own CCIP chain selector,
5009297550715157269, already exceeds JavaScript's safe-integer boundary
(2^53 - 1 = 9,007,199,254,740,991) by roughly 500x. Encoding it as a JSON number anywhere in this
node's contract would risk silent precision loss the moment it round-trips through a JS-based consumer (Flow
Studio's canvas, a browser config editor) — the real CCIP API itself returns these fields as strings for
exactly this reason, and this node follows suit for chain selectors, token amounts, and fee amounts alike.
Native Chain ID vs. CCIP Chain Selector
A network has two different numbers that both look like a "chain ID," and they are not interchangeable:
- Native chain ID — the EVM chain ID used everywhere else (RPC calls, MetaMask, block explorers). Ethereum mainnet's is
1. - CCIP chain selector — a separate 64-bit identifier Chainlink defines specifically for CCIP. Ethereum mainnet's is
5009297550715157269.
Mixing these up is a common source of confusion when working with any multi-chain protocol (Wormhole has
its own third numbering scheme for the same chains). Use router/convertChainSelector
(see Router Operations) to convert between a network name, its native
chain ID, and its CCIP chain selector rather than hand-mapping them.
Which Operations Need an RPC URL
Only two operations make a real on-chain read and therefore require a configured
Chainlink:NetworkRpcUrls:{network} entry (see Configuration):
| Operation | Needs RPC? |
|---|---|
router/isChainSupported | ✓ Yes |
router/getFee | ✓ Yes |
| Every other operation | No |
Requesting isChainSupported or getFee for a network with no matching
NetworkRpcUrls entry throws a ChainlinkNetworkNotConfiguredException — see
Troubleshooting.