evm-explorers
EVM Explorers
Overview
Resolve the canonical default block explorer for any chain supported by the sablier npm package.
For every chain in sablier@3.11.2 the skill records:
- Chain key (the export name in
sablier.evm.chains) - Chain ID
- Display name
- Explorer name
- Explorer base URL
Use this when constructing links to addresses, transactions, blocks, or contracts on chains used by Sablier products.
Source of truth
The canonical data is the resolved blockExplorers.default field on each chain in sablier.evm.chains (a re-export of viem/chains, with Sablier overrides applied).
Reference table: references/explorers.md.
If the user explicitly asks the skill to refresh the data, reproduce it with:
mkdir -p /tmp/sablier-explorers && cd /tmp/sablier-explorers
[ -f package.json ] || npm init -y >/dev/null
npm install sablier@latest >/dev/null
node --input-type=module -e "
import { evm } from 'sablier';
const rows = Object.entries(evm.chains).map(([key, c]) => ({
key, id: c.id, name: c.name,
explorerName: c.blockExplorers?.default?.name,
explorerUrl: c.blockExplorers?.default?.url,
testnet: c.testnet === true,
}));
console.log(JSON.stringify(rows, null, 2));
"
Do not install sablier as part of normal skill execution — the table in references/explorers.md is authoritative. Only refresh when the user requests it.
Resolution rules
- Match by chain key first (e.g.
arbitrum,zksync,optimismSepolia). The keys are thesablier.evm.chainsexport names. - Fall back to chain ID (e.g.
42161→ arbitrum). Always prefer chain ID when the user provides one — it's unambiguous. - Match by display name as a last resort (case-insensitive). Be careful with overloaded names (e.g. "Optimism" vs "OP Mainnet").
- Sepolia variants are distinct chains.
arbitrum-sepoliaishttps://sepolia.arbiscan.io, nothttps://arbiscan.io. - If the chain is not in the table, stop. Do not invent an explorer URL. Tell the user the chain isn't supported by
sablierand ask them to confirm or fetch upstreamviem/chainsdata instead.
Building links
The default explorer URL is the base. Append the standard path segments:
| Resource | Path | Example |
|---|---|---|
| Address | /address/<addr> |
https://arbiscan.io/address/0xabc... |
| Transaction | /tx/<hash> |
https://etherscan.io/tx/0x123... |
| Block | /block/<number> |
https://basescan.org/block/12345678 |
| Token | /token/<addr> |
https://polygonscan.com/token/0xdef... |
Etherscan and explorers operated on the Etherscan stack — Arbiscan, Basescan, BscScan, Polygonscan, Optimism Etherscan, Lineascan, Snowscan, Blastscan, Scrollscan, Berascan, Uniscan, Gnosisscan, abscan.org — all follow this scheme. Most other explorers in the table (Blockscout-based, ZKsync's native explorer, phoenix.lightlink.io, seiscan.io, monadscan.com, sophscan.xyz, chiliscan.com) accept the same /address, /tx, /block segments, but they're operated independently and conventions can drift.
Ronin (app.roninchain.com) does not follow the Etherscan path scheme. Verify against the explorer UI before constructing a Ronin link.
getContractExplorerURL(explorerURL, contractAddress) is also exported by sablier if the caller already has a sablier dependency.
Output format
Default to a compact table when listing:
| Chain | Chain ID | Explorer | URL |
| ------------ | -------- | --------- | ---------------------------- |
| Arbitrum | 42161 | Arbiscan | https://arbiscan.io |
For a single chain, return one line: Arbitrum (42161) → Arbiscan: https://arbiscan.io.
Honor any explicit format the user requests (JSON, plain URL, etc.).
Reference files
references/explorers.md— full mapping of every chain insablier.evm.chainsto its default explorer.