Providers
Blockscout
Keyless and complete on ten EVM chains with one host per chain. The backstop when nothing else serves a chain and the first stop when you have no keys.
Provider
Blockscout
- ethereum
- base
- arbitrum
- optimism
- polygon
- gnosis
- linea
- scroll
- zksync
- avalanche
- Chains
- 10
- Auth
- none
- Operations
- 8 of 10
served 8 / 10
Operations
- balance
getBalanceserved - history
getTxHistoryserved - tx detail
getTxDetailserved - utxos
getUtxosabsent - pubkey
getPubkeyabsent - contract
getContractInfoserved - tokens
getTokenBalancesserved - transfers
getTokenTransfersserved - gas
getGasDataserved - block
getBlockInfoserved
Access
- Create
create("blockscout") - Import
@agntn/explorers/providers/blockscout - Host
eth.blockscout.com - Statusproviders on the docs worker
Address it
const blockscout = await create("blockscout");
await blockscout.getTokenBalances("0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "ethereum", {
nonZeroOnly: true,
});
No key, no configuration. Each chain has its own Blockscout host, eth.blockscout.com, base.blockscout.com and so on, and the provider picks the host from the chain. Scroll and zkSync are here and not on Etherscan, Berachain and BSC the other way round.
What it reads
The REST v2 API under /api/v2: /addresses/:address for the balance, /addresses/:address/transactions for history, /transactions/:hash for one, /smart-contracts/:address for contract metadata, /addresses/:address/token-balances for holdings, /addresses/:address/token-transfers for transfers, /stats for gas and /blocks/:number for a block.
Gotchas
/api/v2/addresses/:address/token-balancesreturns the complete holding array. A busy wallet makes that several megabytes, so this one read gets sixty seconds unlessProviderConfig.timeoutoverrides it.- It's the final fallback.
resolveProvider()returns Blockscout for a chain nobody serves, and the answer is then anUnsupportedChainErrornaming the chain, which beats an unrelated provider's complaint. - Public instances rate limit generously but not infinitely. A 429 is a
RateLimitErrorafter the same backend has been retried; with an automatic selection the read then moves on once.
Where it lives
src/providers/blockscout.ts.