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.
IDblockscout02 / 19keyless
Provider

Blockscout

  • ethereum
  • base
  • arbitrum
  • optimism
  • polygon
  • gnosis
  • linea
  • scroll
  • zksync
  • avalanche
Chains
10
Auth
none
Operations
8 of 10
served 8 / 10

Operations

  • balancegetBalanceserved
  • historygetTxHistoryserved
  • tx detailgetTxDetailserved
  • utxosgetUtxosabsent
  • pubkeygetPubkeyabsent
  • contractgetContractInfoserved
  • tokensgetTokenBalancesserved
  • transfersgetTokenTransfersserved
  • gasgetGasDataserved
  • blockgetBlockInfoserved

Access

Createcreate("blockscout")
Import@agntn/explorers/providers/blockscout
Hosteth.blockscout.com
Statusproviders on the docs worker

Address it

ts
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-balances returns the complete holding array. A busy wallet makes that several megabytes, so this one read gets sixty seconds unless ProviderConfig.timeout overrides it.
  • It's the final fallback. resolveProvider() returns Blockscout for a chain nobody serves, and the answer is then an UnsupportedChainError naming the chain, which beats an unrelated provider's complaint.
  • Public instances rate limit generously but not infinitely. A 429 is a RateLimitError after the same backend has been retried; with an automatic selection the read then moves on once.

Where it lives

src/providers/blockscout.ts.