# News Highlights
Source: https://docs.blockscout.com/about/announcements
Blockscout news highlights, media coverage, press releases, funding announcements, and conference talks from the open-source block explorer team.
## Seed Funding Announcement
Blockscout open-source explorer
## OurNetwork Blockscout Feature
OurNetwork is a leading crypto publication providing data-driven insights on blockchain industry trends. This deep dive on Blockscout features coverage about Blockscout Network Health, User Trends, Explorer-as-a-Service, and the DAppscout Marketplace.
OurNetwork
## Dappcon 2024 Blockscout Presentation
Head of research Kirill Fedoseev presented on network resilience and the need for reliable, transparent, and available explorers in a multi-chain world (starts at 7:50:00).
## EthCC 2023 Blockscout Presentation
Head of Product Ulyana Skladchikova presented on the future of block explorers at ETHCC 2023 in Paris.
## The Evolution & Future of Infrastructure at Optimism's On-Chain Summit
## Base + Blockscout mainnet launch announcement
Blockscout open-source explorer
## Base + Blockscout original press release
pdf
# Newsletter & Blog
Source: https://docs.blockscout.com/about/announcements/newsletter-and-blog
Subscribe to the bi-monthly Blockscout newsletter and blog for explorer updates, new chain integrations, product releases, and ecosystem news.
The Blockscout Newsletter is sent out bi-monthly. It includes information on updates, new chains, integrations and other related information. If you use the My Account feature on Blockscout, an email newsletter subscription is automatically enabled when you sign up. Unsubscribe at any time by clicking the unsubscribe link at the bottom of the email.
You can also [subscribe to receive the newsletter](https://www.blog.blockscout.com/).
Past newsletters are available on the [Blockscout Blog](https://www.blog.blockscout.com/).
# Chains Using Blockscout
Source: https://docs.blockscout.com/about/chains
Browse the searchable Chainscout directory of 1000+ EVM networks, rollups, and testnets that use Blockscout as their open-source block explorer.
**The new searchable projects page is located at [https://chains.blockscout.com/](https://chains.blockscout.com/)**
**Please [Submit a PR](https://github.com/blockscout/chainscout) to add your chain.**
# Features
Source: https://docs.blockscout.com/about/features
Overview of Blockscout features: deep search, contract verification, read/write interaction, APIs, token support, and multi-chain EVM coverage.
π [Autoscout is now available](/using-blockscout/autoscout), providing a simple one-click explorer deployment with Blockscout's optimized hosting infrastructure. Use it for early testing, modifications, and launching a full production-grade explorer. **[Get Started Now](/using-blockscout/autoscout) and have your explorer up-and-running in minutes.**
### What can I do with Blockscout?
* **Deep Search**: Find all the information you need on [Blocks](/using-blockscout/overviews/blocks), Transactions, Addresses, Tags and more through the integrated search box.
* **Interact with Contracts**: [Read and write to contracts](/devs/verification/interacting-with-smart-contracts) directly from the Blockscout UI.
* **Verify Contracts:** Use [Hardhat](/devs/verification/hardhat-verification-plugin), [Sourcify](/devs/verification/contracts-verification-via-sourcify), and other tools to quickly verify contracts.
* **Make API Calls**: Make requests to a [robust API](/devs/apis) using standard and customized endpoints.
* **Customize Views**: Use the [My Account](/using-blockscout/my-account) features to add tags, watchlists and other features.
* **Interact with Apps**: Chains with the [Apps Marketplace](/using-blockscout/blockscout-apps) enabled include a portal for discovery and interaction with applications deployed on-chain.
### Key Features
* **Open source development**: The code is community driven and available for anyone to use, explore, and improve.
* **Broad multi-chain ecosystem support**: Blockscout supports Ethereum mainnet, EVM forks like Ethereum Classic & Gnosis Chain, the Superchain Ecosystem, Polkadot Parachains, Cosmos ecosystem, and many additional public and private EVM networks. [See the list](/about/chains)
* **Smart contract interaction**: Users can read and verify Solidity & Vyper smart contracts and access pre-existing contracts to fast-track development.
* **Token support**: Support for ERC20, ERC721 and ERC1155 tokens.
* **Decoded views:** Contract method calls and logs are decoded to provide additional information within the UI.
* **Full-featured API:** GraphQL provides the opportunity to test API calls directly from a web interface, and REST and JSON RPC methods are well documented.
* **User customization**: Users can easily deploy on a network and customize the Bootstrap-based interface.
* **Modular and extendible**: We're building next generation modularity into Blockscout with Rust-designed microservices.
# Funding
Source: https://docs.blockscout.com/about/funding
Blockscout funding sources including the 1kx-led seed round, grants from Ethereum Foundation, GnosisDAO, Optimism RetroPGF, and community support.
Blockscout [raised their first seed round](https://www.blog.blockscout.com/blockscout-raises-3m-seed-round-led-by-1kx/) in 2024 to help bring open-source exploration to more blockchain users.
We would like to thank projects, individuals, and agencies who have helped support Blockscout open-source explorer growth either through direct giving or grants to support instances.
We are open to additional grant opportunities and [welcome queries](https://discord.gg/XmNatGKbPS) from projects in need of a new open-source explorer instance or maintenance of their current instances.
Funding grants include:
* Seed Grant from the [Ethprize Foundation](http://ethprize.io/) (2018)
* [Gitcoin Grants](https://explorer.gitcoin.co/#/round/424/0x222ea76664ed77d18d4416d2b2e77937b76f0a35/0x222ea76664ed77d18d4416d2b2e77937b76f0a35-22) rounds (ongoing)
* [Community governance funding from Astar](https://forum.astar.network/t/blockscout-builders-program-application/1735) to support Blockscout instances for their networks (2021)
* [GnosisDAO funding](https://forum.gnosis.io/t/gip-54-should-gnosisdao-support-hosting-and-feature-updates-for-blockscout-explorer/5378/4) to support Gnosis Chain Blockscout instances (ongoing)
* [Optimism RetroPGF2](https://optimism.mirror.xyz/Upn_LtV2-3SviXgX_PE_LyA7YI00jQyoM1yf55ltvvI) & [RetroPGF3](https://optimism.mirror.xyz/37Bgum6MfTJWDuE41CH9RXSH5KBm_RCL5zsSFeRZl4E) (2023)
* [ETC Grants DAO](https://etccooperative.org/posts/2023-08-09-presenting-first-round-etc-grants-dao-winner-blockscout-en) (2023)
* Grant support from the [Ethereum Foundation](https://ethereum.foundation/) (2023 & 2025)
# Partners & Integrations
Source: https://docs.blockscout.com/about/partners-and-integrations
Blockscout partners and integrations including Sourcify, Tenderly, SolidityScan, CoinGecko, DeFiLlama, RaaS providers, and linked explorers.
Blockscout features many 3rd party integrations. Additional services are also integrating Blockscout, including many [Rollup-as-a-Service (RaaS) providers](/about/partners-and-integrations/raas-providers).
## Blockscout Partners
Partners provide vital data, infrastructure, and contract support to Blockscout.
| | |
| - | - |
| | [**Metasuites**](https://blocksec.com/metasuites) by Blocksec provides a browser extension that enhances Blockscout with address labelling, transaction explanations, and compliance scores for addresses based on behavior. |
| | [**Sourcify**](https://sourcify.dev/) gives developers the option to verify contracts via the Sourcify API with Blockscout. Contracts verified through Sourcify will display this information on the verified contracts page. [Learn more](/devs/verification/contracts-verification-via-sourcify). |
| | [**DRPC**](https://drpc.org/) is a decentralized Web3 infrastructure provider with a focus on resilience and latency. DRPC provides RPC services for a number of Blockscout hosted instances. |
## Tools and Utilities
Blockscout provides links to relevant, useful tools related to specific transactions and contracts for easy enhanced inspection.
| | |
| - | - |
| | [**Tenderly**](https://tenderly.co/) is an all-in-one Web3 development platform. It is extremely useful for transaction simulation and smart contract development. Blockscout provides a link to transactions for viewing additional detailed information on the Tenderly platform. |
| | [**Sentio**](https://www.sentio.xyz/) is a monitoring, alerting, log management and debugging service for blockchains. Blockscout provides a link to the Sentio explorer for users who need to find advanced analytics about a particular transaction or contract, and read/search/write/fix code faster! |
| | [**SolidityScan**](https://solidityscan.com) is an AI-driven tool specifically tailored for Smart Contract Vulnerability Detection within the web3 ecosystem. With the Blockscout integration, users can access a real-time security score for verified contracts on supported chains. |
## Linked Explorers
Blockscout includes links to additional blockchain explorers for verification and transparency on hosted instances. Self-hosted instances can choose which additional explorers to link with using [front-end ENVs](https://github.com/blockscout/frontend/blob/main/docs/ENVS.md) during deployment.
| | |
| - | - |
| | [**Blockchair**](https://blockchair.com/) block explorer indexes data for 18 blockchains. When available, Blockscout provides a link to Blockchair for transactions, addresses, and more so users can verify and double-check data accuracy. |
| | [**Etherscan**](https://etherscan.io/) explorer is available for large chains and provides a comprehensive data source. When available, Blockscout provides a link to Etherscan so users may double check and verify transactions on multiple explorers. |
| | [**0xPPL**](https://0xppl.com/) offers social search as well as transaction information, providing a connection between on and off chain data. When available, Blockscout provides a link to 0xPPL for transactions, addresses, and more so users can verify and find additional information. |
| | [**3xpl**](https://3xpl.com/) is a fast, universal explorer for most popular public blockchains. When available, Blockscout provides a link to 3xpl for data verification. |
## Contract Verification
Contract verification integrations make it easier to verify contracts from a variety of development environments and bring in additional verified contract information.
| | |
| - | - |
| | [**Hardhat**](https://hardhat.org/) is a popular Ethereum development environment. Contracts can be deployed and verified on Blockscout using the verification plugin. [Learn more](/devs/verification/hardhat-verification-plugin). |
| | [**Foundry**](https://github.com/foundry-rs/foundry/) is a smart contract development toolchain and Forge is a command-line tool that ships with Foundry that supports contract verification with Blockscout. [Learn More](/devs/verification/foundry-verification). |
| | [**Remix**](https://remix-project.org/) is a popular IDE for developing smart contracts. You can use the built-in verification plugin to verify contracts in Blockscout. [Learn More](/devs/verification/remix-verification). |
| | [**Sourcify**](https://sourcify.dev/) is an open-source platform for verifying contracts. You can use the Sourcify API to verify contracts in Blockscout. [Learn more](/devs/verification/contracts-verification-via-sourcify). |
## Tokens and TVL
Feeds can be sourced from several options to provide the latest up-to-date token information. These options are set through [application ENVs](/setup/env-variables) during deployment.
| | |
| - | - |
| | [**CoinGecko**](https://www.coingecko.com/) is a source for token prices and market cap information using the CoinGecko API. CoinGecko is a leading application which provides price tracking, volume and market capitalisation, community growth, and open-source code development. |
| | [**CoinMarketCap**](https://coinmarketcap.com/) is a source for token prices and market cap information using the CoinMarketCap API. CoinMarketCap is a popular price-tracking website for crypto assets. |
| | [**Cryptorank**](https://cryptorank.io/) provides data aggregation and analytics services. The application tracks crypto assets, prices, and detailed information about cryptocurrencies. |
| | [**Mobula**](https://mobula.io/) is a crypto data aggregator that provides curated blockchain data and industry-leading coverage. |
| | [**CoinCompare**](https://coincompare.eu/) is a source for token prices using the CoinCompare API. CoinCompare is a real-time crypto price tracker and comparator. |
| | [**Trust Wallet**](https://trustwallet.com/) is a source for token icon information. Trust Wallet is a leading self-custody multi-chain platform, we support millions of assets across 100+ blockchains. |
| | [**DeFiLlama**](https://defillama.com/) is a source for TVL information through the API integration. DeFiLlama is a DeFi TVL aggregator providing accurate and transparent data. |
## Ad Providers
Ad providers can be selected to bring relevant, web3 based ads based on the network where Blockscout is deployed. Ad options are set using [front-end ENVs](https://github.com/blockscout/frontend/blob/main/docs/ENVS.md) during deployment.
| | |
| - | - |
| | [**Slise**](https://www.slise.xyz/) specializes in web3 ads for users featuring transparent data usage and no tracking. It is the default ad network for hosted chains. |
| | [**Coinzilla**](https://coinzilla.com/) is a large ad network for crypto-relevant content and is well-established in the blockchain space. |
| | [**Adbutler**](https://www.adbutler.com/) provides ads for many different types of industries and users, and can be a good option for instances that serve diverse user bases. |
# RaaS Providers
Source: https://docs.blockscout.com/about/partners-and-integrations/raas-providers
Rollup-as-a-Service providers deploying Blockscout as the default explorer, including Conduit, Caldera, Alchemy, and Altlayer.
Many Rollup-as-a-Service providers are using Blockscout as the default explorer for their instances. Once deployed, Blockscout can provide explorer support services when rollups want to customize or augment their explorers.
Each RaaS has their own processes and specializations including zkRollups or opRollups optimized for different environments. If you have questions about which RaaS to choose, or need customizations for your RaaS Blockscout instance, [please contact us and we can direct you to the best option for your chain.](https://eaas.blockscout.com/?utm_source=multichain-search\&utm_medium=header#contact)
A proven web3 infrastructure provider offering best-in-class RaaS services for L2s and L3s.
Scale applications quickly using production-grade OP Stack or Arbitrum Orbit rollups.
Low-code, scalable, enterprise-grade infrastructure for ZK Rollups and OP Stack Rollups.
Launch high-performance, customizable, application-specific Arbitrum Orbit and OP Stack rollups.
Aurora Virtual Chains are EVM compatible blockchains inheriting the full security, scalability, and infrastructure of Near Protocol.
An easy-to-use, universal launchbase for creating a zk-rollup with several configuration options. [Learn more](https://www.blog.blockscout.com/lumoz-and-blockscout-collaborate-to-elevate-the-zk-raas-experience/).
zk-Validium and zk-Rollups with instant deployment and a full toolset. Settle on Eth or Gnosis Chain. [Learn more](https://www.blog.blockscout.com/blockscout-presto-raas/).
A versatile rollup stack including Arbitrum Orbit, OP Stack, Polygon zkEVM, and StarkWare, with support for DA layers like EigenLayer and Celestia.
Infrastructure services including rollup deployment.
App-chains called RollApps, designed for application-specific speed and efficiency.
# Vera: Verifier Alliance
Source: https://docs.blockscout.com/about/partners-and-integrations/vera-verifier-alliance
The Verifier Alliance (Vera) is an ecosystem collective providing open, unified access to verified EVM smart contract source code across chains.
The [Verifier Alliance](https://verifieralliance.org/) is an ecosystem collective aiming for easy, unified, and open access to the source-code of EVM smart contracts. It is made up of projects across the ecosystem dedicated to making source code verification information freely available for all. Blockscout is a founding member of the collective and major contributor to the Vera Database.
* [Blockscout Vera app](https://vera.blockscout.com/): Verify and Publish contracts to supported networks.
* [Add your network to the Vera DB](/about/partners-and-integrations/vera-verifier-alliance/adding-your-chain-to-the-vera-database)
* [Verify contracts programmatically via the API](/about/partners-and-integrations/vera-verifier-alliance/programmatic-verification-via-the-api)
# Roadmap
Source: https://docs.blockscout.com/about/roadmap
Blockscout roadmap covering Autoscout, AI integrations, MCP server, PRO API, universal bridge indexer, analytics, and NFT explorer features.
# Roadmap
The Blockscout roadmap is a high-level strategic plan designed to guide research and development. **Target dates and details are reviewed by the team and subject to move, adjust and change as the project evolves**. Note that only completed items (β Status: Complete) are considered achieved project milestones.
[*Last update: SEP 2025 | Changelog*](/about/roadmap#change-log)
## π¦ Q3-4 2025
We've updated our roadmap for the remainder of 2025 with a focus on our flagship auto-launch platform Autoscout.
**2025**
* **Plugin system:** Create basic plugin system for self-deployed chains
* **User ops plugin**: First plugin launched for user ops
* **Recurring payments**: Build out recurring payments system for regular users
**2026**
***Q 1-2***
* New Plugins:
* **Admin panel**: Instance can access admin functionality
* **Account Features**: Instances can add MyAccount to provide user-centric features such as tags and API key generation
* **BENS (ens resolution)**: Instances can add support for ENS names.
* **Automatic scaling**: Will provide real-time scaling as needed to support large spikes or decreases in usage.
* **DDoS protection**: Improve security and reduce potential slowing from DDoS attacks
* **Setup wizard** (get setting from RPC URL): Simple setup for new instances
* **Background RPC validation**: Will improve monitoring and alerts
* **Password protection**: Instances can protect new instances before they go public.
* MCP server integrations, improve MCP service and expand usage
* Explore basic chat integration with instances
* Chat integration with DeFi products such as Swap
* Index cross-chain bridge transactions
* Create UI interface for exploration
* Targeting Gnosis Chain as the first live instance
* PRO API service with higher limits and additional endpoints
* Create self-service module
* Design integrated interface and move current standalone Blockscout DeFi apps (Swap, Revoke) to Essential Dapps within the explorer
* Add Multisender app to Essential Dapps
* Continued development for customized instances
* Based on client needs on a chain-by-chain basis
* Support new and upcoming features on hosted chains
* Create data service with wide instance coverage.
* Custom data delivery for a wide range of real-time and historical data.
* Contract and protocol deployment tracking and ecosystem analysis
* Cross-chain liquidity movement and large asset flow monitoring
* Public address labeling and protocol identification
* Dapp interaction and dapp usage reports
Smart Contract Analytics
* Provide detailed analytics for smart contract usage and performance
Advanced EOA (Externally Owned Account) Analytics
* Offer in-depth analysis of regular user accounts
Market Data Integration
* Incorporate relevant market data into the explorer
Protocol-specific Stats
* Provide statistics broken down by different protocols
* Display top NFTs
* Show latest trades, transfers, and mints
* Integrate with NFT marketplaces and platforms
## π¦ Q1-2 2025
We accomplished many important updates in the first half of 2025. Any items not completed have been either restructured or moved to Q3-4.
### β Account Abstraction
**Target Date:** Q2 2025
* Support for AA transaction actions: Improved handling of AA-specific transactions
* Public tags for Bundlers, Paymasters, Factories: Better identification of AA-related accounts
### β Advanced Features
**Target Date:** Q2 2025
Includes:
* Multi-chain Search: Allows users to search across multiple blockchain networks simultaneously
* Advanced Filters: Enables more detailed and customizable data filtering options
* Export Filter Results to CSV: Allows users to download filtered data in CSV format for further analysis
* Validators Page: Displays information about validators for Proof-of-Stake chains
* Simplified Account Creation: Integration with WalletConnect for easier account setup
### β Analytics and Statistics
**Target Date:** Q1 2025
* Customizable Time Views: Daily, weekly, monthly, and yearly data views
### β Defi Integrations
**Target Date:** Q2 2025
* Swap: Token exchange functionality
* Revoke approvals: Manage token approvals
### β Data Availability
**Target Date:** Q2 2025
* Celestia DA for rollups
### β Enhanced Name Service Support
**Target Date:** Q2 2025
* Extend ENS support to Ethereum L2 explorers
* Enable multiple name services on a single chain
### β Token Information Service
**Target Date:** Q2 2025
* Integrate CEX/DEX data: Information from centralized and decentralized exchanges
* Display liquidity pairs data
* Capture token prices from multiple sources for accuracy
## β Previously Completed
###
### β Basic ENS Support
**Target Date:** Q2 2024
**Status**: β Completed
* β Resolving ENS names for addresses and listing names for the address
* β Enabling search by ENS name
* β Search by ENS name
### β Visualizer Service
**Target Date:** Q2 2024
**Status**: β Completed
Visualizer service offering various visualization schemes, such as Sol2UML and transaction graphs for complex blockchain data analysis.
### β Ongoing L2 support
**Target Date:** Q2 2024
**Status**: β Completed
* zkSync Era and zkSync Sepolia Testnet
* Arbitrum
### β Gas Tracker
**Target Date:** Q2 2024
**Status**: β Completed
Users can monitor gas prices and trends to help them make informed decisions about transaction fees and timing.
### β Human Readable Transactions v1
**Target Date:** Q1 2024
**Status**: β Completed
Display complex transactions in an easily understandable format for non-technical users. This includes the ability to automatically decode transaction data, including tokens, contracts, and events.
### β Universal Smart Contract front-end
**Target Date:** Q3 2023
**Status**: β Completed
Improve and simplify the Smart Contract deployment & verification process. Integrate React components to abstract away common on-chain operations.
### β Improved Indexer Performance
**Target Date:** Q2 2023
**Status**: β Completed
Load speed, database optimization & caching, data parsing features to maintain optimal performance. These efforts will continue as additional features are added to BlockScout.
### β Advanced Filter and Sort
**Target Date:** Q2 2023
**Status**: β Completed
Enhance filter and sort options so users can view transaction data in various formats including transaction types, assets & time ranges. Explore ability to save and share custom filter configurations.
### β My Account Improvements
**Target Date:** Q2 2023
**Status**: β Completed
My Account beta is active and will be rolled out on a case-by-case basis, with hosted instances receiving priority. Includes adding the following features:
* Watchlists: Users can create watchlists for specific addresses or contracts, and view all transactions from the watchlists on the main page.
* Enhanced CSV export features
* Smart contract ownership verification
* Airdrop eligibility tool
### β Admin Dashboard
**Target Date:** Q2 2023
**Status**: β Completed
Rust microservice which will provide a comprehensive dashboard for blockchain administrators. Available for hosted versions first.
* Token info
* Public tags
* Real-time network monitoring, chain statistics, user analytics
### β Landing Page
**Target Date:** Q3 2022
**Status**: β Completed
A new landing page is in development for Blockscout to assist new users and developers understand the Blockscout feature set and find information quickly.
### β UI Redesign
**Target Date:** Q3-Q4 2022
**Status**: β v1 Completed see [https://eth-goerli.blockscout.com/](https://eth-goerli.blockscout.com/)
A new UI interface is under development to improve data exploration, optimize views, and provide overall better UX for Blockscout users. The UI is being built from the ground up. It will overhaul all aspects of Blockscout engagement, creating a complete all-in-one interface for chain exploration. In addition to a modern design, the upgrade will also include improvements to features such as:
* **Search**: Prominent search, mobile upgrades, improved dropdown, full-page results, search control
* **Data Sort/Filtering**: Ability to sort data (ascending & descending by column). Improved pagination and filtering abilities.
* **My Account**: See below for features related to My Account functionality.
### β DApp Marketplace v1
**Target Date:** Q4 2022
**Status**: β v1 Completed
Chain users will be able to access applications and modules directly from Blockscout, vastly improving the overall chain experience. Interoperability, swaps, transactions, and 3rd party project-based apps will be accessible and integrated with the modular interface.
Blockscout will also develop native applications for this marketplace. Several are in active development.
* **Blockscout Swap**: Swap feature using an aggregator under the hood for simple swaps without leaving Blockscout.
* **Blockscout Revoke**: Find contracts/apps you have granted allowances to (the ability to spend tokens on your behalf) and revoke these permissions.
* More TBD
### β My Account Functionality v1
**Target Date:** Q3 2022
**Status**: β Instance deployed on Gnosis Chain. Undergoing improvements.
We will explore adding account features for users looking for explorer personalizations, including alerts and notifications, the ability to watch specific addresses, name and customize data within the dashboard, and other advanced features.
### β Blockscout Rust Microservices v1
**Target Date:** Q3 2022
**Status**: β v1 completed - Smart Contract Verification microservice
New Rust-developed microservices will be enabled on Blockscout to extend functionality and modularity. We are revamping smart contract verification to use a Rust module and working on a smart contract uml visualization module to start.
### β Deployment Improvements
**Target Date:** Q3 2022
**Status**: β Completed, Documentation in progress
BlockScout deployment can be complicated for new users. Deployment improvements within a Docker environment will enable a fast path for easy setup and deployment.
### β Ethereum Mainnet BlockScout Instance
**Target Date:** Q2 2022
**Status**: β Instance deployed, optimizations ongoing.
BlockScout offered prior support for the Ethereum mainnet. This instance was discontinued; however a new instance is now planned to further increase explorer diversity on Ethereum and provide additional transparency for Ethereum users.
### β ERC721 Metadata
**Target Date:** Q4 2019
**Status:** β Complete, ERC721 Metadata storage and display ([Release 2.1.0](https://forum.poa.network/t/blockscout-2-1-0-release/3128)) and verification checks ([Release 2.1.1](https://forum.poa.network/t/blockscout-2-1-1-release/3172)) are implemented.
[ERC-721](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md) non-fungible tokens represent ownership of digital or physical assets. Each token is unique, and may include images and other data which identifies the asset and provides additional information. This might include registration information (for example land, property or art registration), identifying numbers or other data unique to that token. As ERC-721 tokens continue to proliferate, it is important to display the relevant information related to each owned token.
### β Staking DApp Integration
**Target Date:** Q3 2020
**Status:** β Complete Q4 2020
BlockScout will support the new POSDAO staking consensus mechanism through an on-board UI. The initial implementation will support the [xDai Stable Chain](https://xdaichain.com). This will allow users to place stake directly from the interface, monitor validator activity, and participate in consensus on the xDai Chain.
### β Smart Contract Write Functionality
**Target Date:** Q2 - Q3 2020
**Status**: β Complete, Write contract/ write proxy functionalities are implemented ([Release 3.3.0](https://forum.poa.network/t/blockscout-v3-3-0-beta/3558)).
Users can currently verify and read contracts on BlockScout. The next smart contract development phase will allow users to interact with contracts directly through the interface. Verified contract methods will be accessible and users can connect through a web3 wallet (such as MetaMask) to access and execute contract functions.
### β ERC1155 Support
**Target Date:** Q2 2021
**Status**: β Basic Functionality added for xDai chain, additional support in process.
ERC-1155 tokens are increasing in popularity as a way to manage multiple-token types including fungible and non-fungible tokens within a single instance. This feature provides parsing and display of tokens contained within an ERC-1155. Additional functionality such as metadata display is in process.
### β Rollup Support
**Target Date:** Q4 2021
**Status**: β Instances for Optimism and Arbitrum on Gnosis Chain
BlockScout availability and support is available for Optimism and Arbitrum on the Gnosis Chain. Includes tracking for gas price on L1 and the L2 implementations. Currently Optimism is the favored deployment.
* Optimism: [https://blockscout.com/xdai/optimism](https://blockscout.com/xdai/optimism)
* Arbitrum: [https://blockscout.com/xdai/aox/](https://blockscout.com/xdai/aox/)
### β EIP-1559 Support
**Target Date:** Q3-Q4 2021
**Status**: β Complete
The Gnosis Chain explorer supports EIP-1559 functionality with a stated transaction type (2 for EIP-1559) and includes data reporting of Max Fee per Gas, Max Priority Fee per Gas and Priority Fee / Tip paid for a transaction.
### β Multi-file Contract Source Code Verification
**Target Date:** Q4 2021
**Status:** β Complete
BlockScout supports verification for contracts via multiple methods including Hardhat and the Hardhat and Sourcify plugins. [More information is available here](/devs/verification).
## Change Log
Update
Items
30.09.2025
Updated 2025 with remaining items and moved items from Q1/Q2 to completed or Q3-4 2025 based on status.
Moved to Q3/Q4
Analytics and Statistics
NFT explorer enhancements
Completed Items
Account Abstraction
Advanced Features
Analytics and Statistics
DeFi Integrations
Data Availability (Celestia Support)
Enhanced ENS Support
Token Info Services
19.08.2024
Major update to restructure roadmap for the rest of 2024. Moved completed items from Q1-2 into completed section and adjusted remaining items to fit into targeted areas for the remainder of 2024.\
\
Removed from Roadmap:
New Microservices (folded into existing categories)
CEX/DEX views (deprioritized)
Ongoing Improvements (moved to existing categories)
Moved to Completed:
L2 Support
Visualizer Service
29.05.2024
Minor update: Will be adding a major overhaul in June for Q3-Q4 and will reconfigure, add new items and remove others.\
\
**Completed:**
Gas Tracker
Basic ENS support
**Removed:**
AWS template
Multisender native dapp
03.01.2024
Update milestones for Q1 2024.\
Completed:
Universal smart contract front-end
Human readable transactions v1
07.11.2023
Updated milestones to reflect current quarterly work. A more extensive update with many reworked milestones will be added for 2024.
10.08.2023
Updated Q3 milestones to account for completed items.\
Completed:
Improved indexer performance
Advanced filter and search
My Account improvements
Admin Account
17.04.2023
Revamp roadmap for 2023 milestones by Q.
Moved all In-research items to appropriate Q.
Added:
Q2,Q3,Q4 2023 items
Completed:
Landing Page
React UI v1
Rust Microservices v1
DApp Marketplace v1
My Account v1
27.07.2022
Updated marketplace to include Blockscout native DApps
Added Blockscout Microservices
Added Multi-chain search
Added personal asset management features
Added Blockscout ID
Combined several elements into UI category
Deployment improvements (Docker image) moved to completed
Update Research Phase items to 2023
06.07.2022
Added:
Analytics Dashboards
UI Overhaul
Modular Plug-and-Play Library
Completed:
Ethereum Mainnet Instance
11.04.2022
Rearranged into Completed and Ongoing Categories
Updated Ongoing Item dates
Added UI enhancements
Marked as Completed
EIP-1559 Support
Rollup Support
Multi-file Contract Source Code Verification
# Get a bundler by address hash
Source: https://docs.blockscout.com/api-reference/account-abstraction/get-a-bundler-by-address-hash
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/proxy/account-abstraction/bundlers/{address_hash_param}
Retrieves a bundler by its address hash.
# Get a factory by address hash
Source: https://docs.blockscout.com/api-reference/account-abstraction/get-a-factory-by-address-hash
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/proxy/account-abstraction/factories/{address_hash_param}
Retrieves a factory by its address hash.
# Get a human-readable, LLM-based user operation summary
Source: https://docs.blockscout.com/api-reference/account-abstraction/get-a-human-readable-llm-based-user-operation-summary
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/proxy/account-abstraction/operations/{operation_hash_param}/summary
Retrieves a human-readable summary of what a user operation did, presented in natural language.
# Get a paymaster by address hash
Source: https://docs.blockscout.com/api-reference/account-abstraction/get-a-paymaster-by-address-hash
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/proxy/account-abstraction/paymasters/{address_hash_param}
Retrieves a paymaster by its address hash.
# Get a user operation by hash
Source: https://docs.blockscout.com/api-reference/account-abstraction/get-a-user-operation-by-hash
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/proxy/account-abstraction/operations/{operation_hash_param}
Retrieves a user operation by its hash.
# Get an account abstraction wallet by address hash
Source: https://docs.blockscout.com/api-reference/account-abstraction/get-an-account-abstraction-wallet-by-address-hash
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/proxy/account-abstraction/accounts/{address_hash_param}
Retrieves an account abstraction wallet by its address hash.
# Get the status of the account abstraction microservice
Source: https://docs.blockscout.com/api-reference/account-abstraction/get-the-status-of-the-account-abstraction-microservice
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/proxy/account-abstraction/status
Retrieves the status of the account abstraction microservice.
# List of account abstraction wallets
Source: https://docs.blockscout.com/api-reference/account-abstraction/list-of-account-abstraction-wallets
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/proxy/account-abstraction/accounts
Retrieves a list of account abstraction wallets.
# List of recent bundles
Source: https://docs.blockscout.com/api-reference/account-abstraction/list-of-recent-bundles
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/proxy/account-abstraction/bundles
Retrieves a list of recent bundles.
# List of recent user operations
Source: https://docs.blockscout.com/api-reference/account-abstraction/list-of-recent-user-operations
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/proxy/account-abstraction/operations
Retrieves a list of recent user operations.
# List of top bundlers
Source: https://docs.blockscout.com/api-reference/account-abstraction/list-of-top-bundlers
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/proxy/account-abstraction/bundlers
Retrieves a list of top bundlers.
# List of top paymasters
Source: https://docs.blockscout.com/api-reference/account-abstraction/list-of-top-paymasters
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/proxy/account-abstraction/paymasters
Retrieves a list of top paymasters.
# List of top wallet factories
Source: https://docs.blockscout.com/api-reference/account-abstraction/list-of-top-wallet-factories
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/proxy/account-abstraction/factories
Retrieves a list of top wallet factories.
# Get a List of Internal Transactions
Source: https://docs.blockscout.com/api-reference/account/get-a-list-of-internal-transactions
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=account&action=txlistinternal
Returns up to a maximum of 10,000 internal transactions.
Also available through a GraphQL 'transaction' query.
# Get a List of Transactions by Address
Source: https://docs.blockscout.com/api-reference/account/get-a-list-of-transactions-by-address
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=account&action=txlist
Returns up to a maximum of 10,000 transactions for a given address.
Also available through a GraphQL 'address' query.
# Get Balance for Multiple Addresses in a Single Call
Source: https://docs.blockscout.com/api-reference/account/get-balance-for-multiple-addresses-in-a-single-call
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=account&action=balancemulti
Returns the balance of multiple accounts from a list of addresses (max 20 addresses)
# Get ERC-1155 Token Transfer Events by Address
Source: https://docs.blockscout.com/api-reference/account/get-erc-1155-token-transfer-events-by-address
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=account&action=token1155tx
Returns ERC-1155 (multi-token) transfer events
# Get ERC-20 Token Balance for a Single Address
Source: https://docs.blockscout.com/api-reference/account/get-erc-20-token-balance-for-a-single-address
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=account&action=tokenbalance
Returns the token balance for a specific token contract and address
# Get ERC-20 Token Transfer Events by Address
Source: https://docs.blockscout.com/api-reference/account/get-erc-20-token-transfer-events-by-address
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=account&action=tokentx
Returns up to a maximum of 10,000 ERC-20 token transfer events.
Also available through the GraphQL token_transfers query.
# Get ERC-404 Token Transfer Events by Address
Source: https://docs.blockscout.com/api-reference/account/get-erc-404-token-transfer-events-by-address
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=account&action=token404tx
Returns ERC-404 (hybrid fungible/non-fungible) transfer events
# Get ERC-721 Token Transfer Events by Address
Source: https://docs.blockscout.com/api-reference/account/get-erc-721-token-transfer-events-by-address
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=account&action=tokennfttx
Returns ERC-721 (NFT) token transfer events
# Get ETH Balance (JSON-RPC Format)
Source: https://docs.blockscout.com/api-reference/account/get-eth-balance-json-rpc-format
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=account&action=eth_get_balance
Mimics Ethereum JSON RPC's eth_getBalance
# Get List of Blocks Mined by Address
Source: https://docs.blockscout.com/api-reference/account/get-list-of-blocks-mined-by-address
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=account&action=getminedblocks
Returns list of blocks mined by a given address.
# Get Native Token Balance for a Single Address
Source: https://docs.blockscout.com/api-reference/account/get-native-token-balance-for-a-single-address
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=account&action=balance
Returns the native token balance of a given address. Results are returned in wei.
Many chains use their own native tokens (e.g., ETH on Ethereum, xDai on Gnosis).
# Get Pending Transactions for an Address
Source: https://docs.blockscout.com/api-reference/account/get-pending-transactions-for-an-address
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=account&action=pendingtxlist
Returns pending transactions for a given address
# List Accounts and Native Balances
Source: https://docs.blockscout.com/api-reference/account/list-accounts-and-native-balances
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=account&action=listaccounts
Lists accounts and native balances, sorted ascending by the time they were first seen
# Export Celo election rewards as CSV
Source: https://docs.blockscout.com/api-reference/addresses/export-celo-election-rewards-as-csv
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/addresses/{address_hash_param}/celo/election-rewards/csv
Exports Celo election rewards for a specific address as a CSV file.
# Export internal transactions as CSV
Source: https://docs.blockscout.com/api-reference/addresses/export-internal-transactions-as-csv
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/addresses/{address_hash_param}/internal-transactions/csv
Exports internal transactions for a specific address as a CSV file.
# Export logs as CSV
Source: https://docs.blockscout.com/api-reference/addresses/export-logs-as-csv
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/addresses/{address_hash_param}/logs/csv
Exports logs for a specific address as a CSV file.
# Export token transfers as CSV
Source: https://docs.blockscout.com/api-reference/addresses/export-token-transfers-as-csv
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/addresses/{address_hash_param}/token-transfers/csv
Exports token transfers for a specific address as a CSV file.
# Export transactions as CSV
Source: https://docs.blockscout.com/api-reference/addresses/export-transactions-as-csv
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/addresses/{address_hash_param}/transactions/csv
Exports transactions for a specific address as a CSV file.
# Get activity count stats for a specific address
Source: https://docs.blockscout.com/api-reference/addresses/get-activity-count-stats-for-a-specific-address
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/addresses/{address_hash_param}/counters
Retrieves count statistics for an address, including transactions, token transfers, gas usage, and validations.
# Get counters for address tabs
Source: https://docs.blockscout.com/api-reference/addresses/get-counters-for-address-tabs
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/addresses/{address_hash_param}/tabs-counters
Retrieves counters for various address-related entities (max counter value is 51).
# Get daily native coin balance snapshots for an address from previous 10 days
Source: https://docs.blockscout.com/api-reference/addresses/get-daily-native-coin-balance-snapshots-for-an-address-from-previous-10-days
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/addresses/{address_hash_param}/coin-balance-history-by-day
Retrieves daily snapshots of native coin balance for a specific address. Useful for generating balance-over-time charts.
# Get native coin balance history for an address showing all balance changes
Source: https://docs.blockscout.com/api-reference/addresses/get-native-coin-balance-history-for-an-address-showing-all-balance-changes
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/addresses/{address_hash_param}/coin-balance-history
Retrieves historical native coin balance changes for a specific address, tracking how an address's balance has changed over time.
# List addresses holding native coins sorted by balance - top accounts
Source: https://docs.blockscout.com/api-reference/addresses/list-addresses-holding-native-coins-sorted-by-balance--top-accounts
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/addresses
Retrieves a paginated list of addresses holding the native coin, sorted by balance.
# List all internal transactions involving a specific address
Source: https://docs.blockscout.com/api-reference/addresses/list-all-internal-transactions-involving-a-specific-address
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/addresses/{address_hash_param}/internal-transactions
Retrieves all internal transactions involving a specific address, with optional filtering for internal transactions sent from or to the address.
# List all token balances held by a specific address
Source: https://docs.blockscout.com/api-reference/addresses/list-all-token-balances-held-by-a-specific-address
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/addresses/{address_hash_param}/token-balances
Retrieves all token balances held by a specific address, including ERC-20, ERC-721, ERC-1155, and ERC-404 tokens.
# List Beacon Deposits for a specific address
Source: https://docs.blockscout.com/api-reference/addresses/list-beacon-deposits-for-a-specific-address
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/addresses/{address_hash_param}/beacon/deposits
Retrieves Beacon deposits for a specific address.
# List blocks validated (mined) by a specific validator/miner address
Source: https://docs.blockscout.com/api-reference/addresses/list-blocks-validated-mined-by-a-specific-validatorminer-address
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/addresses/{address_hash_param}/blocks-validated
Retrieves blocks that were validated (mined) by a specific address. Useful for tracking validator/miner performance.
# List Celo election rewards for a specific address
Source: https://docs.blockscout.com/api-reference/addresses/list-celo-election-rewards-for-a-specific-address
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/addresses/{address_hash_param}/celo/election-rewards
Retrieves Celo election rewards for a specific address.
# List event logs emitted by or involving a specific address
Source: https://docs.blockscout.com/api-reference/addresses/list-event-logs-emitted-by-or-involving-a-specific-address
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/addresses/{address_hash_param}/logs
Retrieves event logs emitted by or involving a specific address.
# List NFTs owned by a specific address with optional type filtering
Source: https://docs.blockscout.com/api-reference/addresses/list-nfts-owned-by-a-specific-address-with-optional-type-filtering
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/addresses/{address_hash_param}/nft
Retrieves a list of NFTs (non-fungible tokens) owned by a specific address, with optional filtering by token type.
# List NFTs owned by an address grouped by collection/project
Source: https://docs.blockscout.com/api-reference/addresses/list-nfts-owned-by-an-address-grouped-by-collectionproject
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/addresses/{address_hash_param}/nft/collections
Retrieves NFTs owned by a specific address, organized by collection. Useful for displaying an address's NFT portfolio grouped by project.
# List token balances for an address with pagination and type filtering
Source: https://docs.blockscout.com/api-reference/addresses/list-token-balances-for-an-address-with-pagination-and-type-filtering
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/addresses/{address_hash_param}/tokens
Retrieves token balances for a specific address with pagination and filtering by token type. Useful for displaying large token portfolios.
# List token transfers involving a specific address with filtering options
Source: https://docs.blockscout.com/api-reference/addresses/list-token-transfers-involving-a-specific-address-with-filtering-options
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/addresses/{address_hash_param}/token-transfers
Retrieves token transfers involving a specific address, with optional filtering by token type, direction, and specific token.
# List transactions involving a specific address with to-from filtering
Source: https://docs.blockscout.com/api-reference/addresses/list-transactions-involving-a-specific-address-with-to-from-filtering
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/addresses/{address_hash_param}/transactions
Retrieves transactions involving a specific address, with optional filtering for transactions sent from or to the address.
# List validator withdrawals involving a specific address
Source: https://docs.blockscout.com/api-reference/addresses/list-validator-withdrawals-involving-a-specific-address
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/addresses/{address_hash_param}/withdrawals
Retrieves withdrawals involving a specific address, typically for proof-of-stake networks supporting validator withdrawals.
# Retrieve detailed information about a specific address or contract
Source: https://docs.blockscout.com/api-reference/addresses/retrieve-detailed-information-about-a-specific-address-or-contract
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/addresses/{address_hash_param}
Retrieves detailed information for a specific address, including balance, transaction count, and metadata.
# Export advanced-filter results as CSV
Source: https://docs.blockscout.com/api-reference/advanced-filters/export-advanced-filter-results-as-csv
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/advanced-filters/csv
Streams the items matching the advanced filter criteria as a CSV file. When asynchronous CSV export is enabled on the deployment, returns `202 Accepted` with a `request_id` that can be polled via `/api/v2/csv-exports/{request_id}`; otherwise the CSV body is streamed inline.
# List known contract methods
Source: https://docs.blockscout.com/api-reference/advanced-filters/list-known-contract-methods
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/advanced-filters/methods
Returns a list of known contract methods. When the `q` parameter is provided, searches for a single method by its 4-byte selector or name. Without `q`, returns the default list of popular methods.
# List transactions, internal transactions and token transfers matching the advanced filter criteria
Source: https://docs.blockscout.com/api-reference/advanced-filters/list-transactions-internal-transactions-and-token-transfers-matching-the-advanced-filter-criteria
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/advanced-filters
Returns a paginated, mixed list of activity β native value transfers, internal transactions and token transfers β filtered by transaction type, contract method, time window, address relations, value range and/or token contract. The response also echoes the resolved human-readable names of the methods and tokens referenced in the request filters.
# Get batch by AnyTrust data hash.
Source: https://docs.blockscout.com/api-reference/arbitrum/get-batch-by-anytrust-data-hash
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/arbitrum/batches/da/anytrust/{data_hash}
Retrieves an Arbitrum batch associated with the given AnyTrust data hash. By default, returns the most recently associated batch. When `type=all`, returns a paginated list of all batches referencing this data hash.
# Get batch by Celestia blob reference.
Source: https://docs.blockscout.com/api-reference/arbitrum/get-batch-by-celestia-blob-reference
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/arbitrum/batches/da/celestia/{height}/{transaction_commitment}
Retrieves an Arbitrum batch whose data availability blob is identified by the given Celestia block height and transaction commitment hash.
# Get batch by EigenDA data hash.
Source: https://docs.blockscout.com/api-reference/arbitrum/get-batch-by-eigenda-data-hash
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/arbitrum/batches/da/eigenda/{data_hash}
Retrieves an Arbitrum batch associated with the given EigenDA data hash. By default, returns the most recently associated batch. When `type=all`, returns a paginated list of all batches referencing this data hash.
# Get batch by number.
Source: https://docs.blockscout.com/api-reference/arbitrum/get-batch-by-number
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/arbitrum/batches/{batch_number}
Retrieves detailed information about an Arbitrum batch by its number.
# Get batches count.
Source: https://docs.blockscout.com/api-reference/arbitrum/get-batches-count
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/arbitrum/batches/count
Retrieves the total count of Arbitrum batches committed to the Parent chain.
# Get claim data for a withdrawal.
Source: https://docs.blockscout.com/api-reference/arbitrum/get-claim-data-for-a-withdrawal
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/arbitrum/messages/claim/{message_id}
Returns the ABI-encoded calldata and outbox contract address required to execute a Rollup withdrawal on the Parent chain.
# Get cross-chain messages count.
Source: https://docs.blockscout.com/api-reference/arbitrum/get-cross-chain-messages-count
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/arbitrum/messages/{direction}/count
Retrieves the total count of Arbitrum cross-chain messages for the specified direction.
# Get the latest batch number.
Source: https://docs.blockscout.com/api-reference/arbitrum/get-the-latest-batch-number
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/main-page/arbitrum/batches/latest-number
Retrieves the number of the most recent Arbitrum batch submitted to the Parent chain. Returns 0 if no batches exist.
# Get withdrawal messages for a transaction.
Source: https://docs.blockscout.com/api-reference/arbitrum/get-withdrawal-messages-for-a-transaction
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/arbitrum/messages/withdrawals/{transaction_hash}
Returns the list of Rollup withdrawal messages (L2ToL1Tx events) emitted by the given transaction.
# List batches.
Source: https://docs.blockscout.com/api-reference/arbitrum/list-batches
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/arbitrum/batches
Retrieves a paginated list of Arbitrum batches committed to the Parent chain.
# List committed batches on the main page.
Source: https://docs.blockscout.com/api-reference/arbitrum/list-committed-batches-on-the-main-page
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/main-page/arbitrum/batches/committed
Retrieves a list of Arbitrum batches that have been committed to the Parent chain, displayed on the main page.
# List cross-chain messages.
Source: https://docs.blockscout.com/api-reference/arbitrum/list-cross-chain-messages
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/arbitrum/messages/{direction}
Retrieves a paginated list of Arbitrum cross-chain messages filtered by the specified direction.
# List recent Parent chain to Rollup messages on the main page.
Source: https://docs.blockscout.com/api-reference/arbitrum/list-recent-parent-chain-to-rollup-messages-on-the-main-page
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/main-page/arbitrum/messages/to-rollup
Retrieves the most recent relayed messages from Parent chain to Rollup, displayed on the main page.
# Gets total count of beacon deposits
Source: https://docs.blockscout.com/api-reference/beacon_deposits/gets-total-count-of-beacon-deposits
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/beacon/deposits/count
Retrieves the total count of beacon deposits.
# Lists all beacon deposits
Source: https://docs.blockscout.com/api-reference/beacon_deposits/lists-all-beacon-deposits
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/beacon/deposits
Retrieves a paginated list of all beacon deposits.
# Get Block Number by Timestamp
Source: https://docs.blockscout.com/api-reference/block/get-block-number-by-timestamp
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=block&action=getblocknobytime
Returns the block number that was mined at a certain timestamp
# Get Block Reward by Block Number
Source: https://docs.blockscout.com/api-reference/block/get-block-reward-by-block-number
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=block&action=getblockreward
Returns the block reward and uncle block rewards when applicable
# Get Estimated Block Countdown Time by Block Number
Source: https://docs.blockscout.com/api-reference/block/get-estimated-block-countdown-time-by-block-number
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=block&action=getblockcountdown
Returns the estimated time remaining, in seconds, until a certain block is mined
`blockno` must be a block that has not been mined yet. A block that already exists returns an error.
# Get Latest Block Number (JSON-RPC Format)
Source: https://docs.blockscout.com/api-reference/block/get-latest-block-number-json-rpc-format
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=block&action=eth_block_number
Mimics Ethereum JSON RPC's eth_blockNumber
# Get countdown information for a target block number
Source: https://docs.blockscout.com/api-reference/blocks/get-countdown-information-for-a-target-block-number
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/blocks/{block_number_param}/countdown
Calculates the estimated time remaining until a specified block number is reached based on current block and average block time.
# List beacon deposits in a specific block
Source: https://docs.blockscout.com/api-reference/blocks/list-beacon-deposits-in-a-specific-block
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/blocks/{block_hash_or_number_param}/beacon/deposits
Retrieves beacon deposits included in a specific block with pagination support.
# List blocks with optional filtering by block type
Source: https://docs.blockscout.com/api-reference/blocks/list-blocks-with-optional-filtering-by-block-type
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/blocks
Retrieves a paginated list of blocks ordered by descending block number.
When the `type` query parameter is omitted, only main-chain consensus blocks
(equivalent to `type=block`) are returned. Use `type=uncle` to list ommer
blocks (valid but not in the main chain) and `type=reorg` to list blocks
that lost consensus during a chain reorganization.
Pagination is cursor-based: the response contains `next_page_params` with
`block_number` β pass these back as query parameters on
the next request to fetch the following page.
# List internal transactions in a specific block
Source: https://docs.blockscout.com/api-reference/blocks/list-internal-transactions-in-a-specific-block
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/blocks/{block_hash_or_number_param}/internal-transactions
Retrieves internal transactions included in a specific block with optional filtering by type and call type.
# List L2 blocks in a Scroll batch
Source: https://docs.blockscout.com/api-reference/blocks/list-l2-blocks-in-a-scroll-batch
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/blocks/scroll-batch/{batch_number_param}
Retrieves L2 blocks that are bound to a specific Scroll batch number.
# List L2 blocks in an Arbitrum batch
Source: https://docs.blockscout.com/api-reference/blocks/list-l2-blocks-in-an-arbitrum-batch
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/blocks/arbitrum-batch/{batch_number_param}
Retrieves L2 blocks that are bound to a specific Arbitrum batch number.
# List L2 blocks in an Optimism batch
Source: https://docs.blockscout.com/api-reference/blocks/list-l2-blocks-in-an-optimism-batch
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/blocks/optimism-batch/{batch_number_param}
Retrieves L2 blocks that are bound to a specific Optimism batch number.
# List transactions and tx details included in a specific block
Source: https://docs.blockscout.com/api-reference/blocks/list-transactions-and-tx-details-included-in-a-specific-block
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/blocks/{block_hash_or_number_param}/transactions
Retrieves transactions included in a specific block, ordered by transaction index.
# List validator withdrawals including amounts, index and receiver details processed in a specific block
Source: https://docs.blockscout.com/api-reference/blocks/list-validator-withdrawals-including-amounts-index-and-receiver-details-processed-in-a-specific-block
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/blocks/{block_hash_or_number_param}/withdrawals
Retrieves withdrawals processed in a specific block (typically for proof-of-stake networks).
# Retrieves detailed information for a specific block identified by its number or hash.
Source: https://docs.blockscout.com/api-reference/blocks/retrieves-detailed-information-for-a-specific-block-identified-by-its-number-or-hash
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/blocks/{block_hash_or_number_param}
Retrieves detailed information for a specific block, including transactions, internal transactions, and metadata.
# Get Celo epoch details.
Source: https://docs.blockscout.com/api-reference/celo/get-celo-epoch-details
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/celo/epochs/{number}
Retrieves detailed information about a Celo epoch.
# List Celo epoch election rewards.
Source: https://docs.blockscout.com/api-reference/celo/list-celo-epoch-election-rewards
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/celo/epochs/{number}/election-rewards/{type}
Retrieves a paginated list of election rewards for a Celo epoch and reward type.
# List Celo epochs.
Source: https://docs.blockscout.com/api-reference/celo/list-celo-epochs
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/celo/epochs
Retrieves a paginated list of Celo epochs.
# Full-text search for addresses by query string; optional chain filter and pagination.
Source: https://docs.blockscout.com/api-reference/clusterexplorerservice/full-text-search-for-addresses-by-query-string;-optional-chain-filter-and-pagination
/openapi-specs/Master-pro-api.json get /services/multichain/api/v1/clusters/{cluster_id}/search/addresses
# Full-text search for block numbers (returns chain + block number); optional chain filter and pagination.
Source: https://docs.blockscout.com/api-reference/clusterexplorerservice/full-text-search-for-block-numbers-returns-chain-+-block-number;-optional-chain-filter-and-pagination
/openapi-specs/Master-pro-api.json get /services/multichain/api/v1/clusters/{cluster_id}/search/block-numbers
# Full-text search for blocks (returns block hashes); optional chain filter and pagination.
Source: https://docs.blockscout.com/api-reference/clusterexplorerservice/full-text-search-for-blocks-returns-block-hashes;-optional-chain-filter-and-pagination
/openapi-specs/Master-pro-api.json get /services/multichain/api/v1/clusters/{cluster_id}/search/blocks
# Full-text search for domains; optional chain filter and pagination.
Source: https://docs.blockscout.com/api-reference/clusterexplorerservice/full-text-search-for-domains;-optional-chain-filter-and-pagination
/openapi-specs/Master-pro-api.json get /services/multichain/api/v1/clusters/{cluster_id}/search/domains
# Full-text search for NFTs by query string; optional chain filter and pagination.
Source: https://docs.blockscout.com/api-reference/clusterexplorerservice/full-text-search-for-nfts-by-query-string;-optional-chain-filter-and-pagination
/openapi-specs/Master-pro-api.json get /services/multichain/api/v1/clusters/{cluster_id}/search/nfts
# Full-text search for tokens; optional chain filter and pagination.
Source: https://docs.blockscout.com/api-reference/clusterexplorerservice/full-text-search-for-tokens;-optional-chain-filter-and-pagination
/openapi-specs/Master-pro-api.json get /services/multichain/api/v1/clusters/{cluster_id}/search/tokens
# Full-text search for transactions (returns transaction hashes); optional chain filter and pagination.
Source: https://docs.blockscout.com/api-reference/clusterexplorerservice/full-text-search-for-transactions-returns-transaction-hashes;-optional-chain-filter-and-pagination
/openapi-specs/Master-pro-api.json get /services/multichain/api/v1/clusters/{cluster_id}/search/transactions
# Lists all chains in the cluster, optionally sorted by a metric (e.g. active_accounts, tps).
Source: https://docs.blockscout.com/api-reference/clusterexplorerservice/lists-all-chains-in-the-cluster-optionally-sorted-by-a-metric-eg-active_accounts-tps
/openapi-specs/Master-pro-api.json get /services/multichain/api/v1/clusters/{cluster_id}/chains
# Unified quick search across addresses, blocks, transactions, block numbers, dapps, tokens, NFTs, and domains; supports unlimited results per chain.
Source: https://docs.blockscout.com/api-reference/clusterexplorerservice/unified-quick-search-across-addresses-blocks-transactions-block-numbers-dapps-tokens-nfts-and-domains;-supports-unlimited-results-per-chain
/openapi-specs/Master-pro-api.json get /services/multichain/api/v1/clusters/{cluster_id}/search:quick
# Check Proxy Verification Status
Source: https://docs.blockscout.com/api-reference/contract/check-proxy-verification-status
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=contract&action=checkproxyverification
Returns status of a proxy contract verification attempt.
# Check Verification Status
Source: https://docs.blockscout.com/api-reference/contract/check-verification-status
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=contract&action=checkverifystatus
Returns status of a verification attempt. guid is received from verify or verifysourcecode methods.
# Get Contract ABI for Verified Contract
Source: https://docs.blockscout.com/api-reference/contract/get-contract-abi-for-verified-contract
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=contract&action=getabi
Returns the Contract Application Binary Interface (ABI) of a verified smart contract.
Also available through a GraphQL 'addresses' query.
# Get Contract Creator and Creation Transaction Hash
Source: https://docs.blockscout.com/api-reference/contract/get-contract-creator-and-creation-transaction-hash
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=contract&action=getcontractcreation
Returns contract creator address and transaction hash (up to 10 contracts per request)
# Get Contract Source Code for Verified Contract
Source: https://docs.blockscout.com/api-reference/contract/get-contract-source-code-for-verified-contract
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=contract&action=getsourcecode
Returns the Solidity source code of a verified smart contract.
Also available through a GraphQL 'addresses' query.
# Get List of Contracts
Source: https://docs.blockscout.com/api-reference/contract/get-list-of-contracts
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=contract&action=listcontracts
Returns list of contracts sorted by creation time. Can filter by verification status.
# Verify Contract via Sourcify
Source: https://docs.blockscout.com/api-reference/contract/verify-contract-via-sourcify
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=contract&action=verify_via_sourcify
Verify a contract through Sourcify. If already verified on Sourcify fetches from repo.
# Verify Contract with Source Code
Source: https://docs.blockscout.com/api-reference/contract/verify-contract-with-source-code
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=contract&action=verify
Verify a contract with its source code and compilation information. Returns a guid for checking verification status.
# Verify Contract with Standard JSON Input
Source: https://docs.blockscout.com/api-reference/contract/verify-contract-with-standard-json-input
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=contract&action=verifysourcecode
Verify a contract using Standard JSON Input or flattened source code.
# Verify Proxy Contract
Source: https://docs.blockscout.com/api-reference/contract/verify-proxy-contract
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=contract&action=verifyproxycontract
Verify that a contract is a proxy contract pointing to an implementation.
# Verify Vyper Contract
Source: https://docs.blockscout.com/api-reference/contract/verify-vyper-contract
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=contract&action=verify_vyper_contract
Verify a Vyper contract with its source code and compilation information.
# Get CSV export
Source: https://docs.blockscout.com/api-reference/csv-export/get-csv-export
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/csv-exports/{uuid_param}
Gets a CSV export by UUID
# Get basic info about address for ens-lookup and blockscout quick-search. Sorted by `registration_date`
Source: https://docs.blockscout.com/api-reference/domainsextractor/get-basic-info-about-address-for-ens-lookup-and-blockscout-quick-search-sorted-by-`registration_date`
/openapi-specs/Master-pro-api.json get /services/bens/api/v1/{chain_id}/addresses:lookup
# Get basic info about domain for ens-lookup and blockscout quick-search. Sorted by `registration_date`
Source: https://docs.blockscout.com/api-reference/domainsextractor/get-basic-info-about-domain-for-ens-lookup-and-blockscout-quick-search-sorted-by-`registration_date`
/openapi-specs/Master-pro-api.json get /services/bens/api/v1/{chain_id}/domains:lookup
# Get detailed information about domain for Detailed domain page
Source: https://docs.blockscout.com/api-reference/domainsextractor/get-detailed-information-about-domain-for-detailed-domain-page
/openapi-specs/Master-pro-api.json get /services/bens/api/v1/{chain_id}/domains/{name}
# Get detailed information about main domain of requested address
Source: https://docs.blockscout.com/api-reference/domainsextractor/get-detailed-information-about-main-domain-of-requested-address
/openapi-specs/Master-pro-api.json get /services/bens/api/v1/{chain_id}/addresses/{address}
# Get list of events of domain for Detailed domain page
Source: https://docs.blockscout.com/api-reference/domainsextractor/get-list-of-events-of-domain-for-detailed-domain-page
/openapi-specs/Master-pro-api.json get /services/bens/api/v1/{chain_id}/domains/{name}/events
# Get list of supported protocols
Source: https://docs.blockscout.com/api-reference/domainsextractor/get-list-of-supported-protocols
/openapi-specs/Master-pro-api.json get /services/bens/api/v1/{chain_id}/protocols
# Perform batch resolving of list of address for blockscout backend requests
Source: https://docs.blockscout.com/api-reference/domainsextractor/perform-batch-resolving-of-list-of-address-for-blockscout-backend-requests
/openapi-specs/Master-pro-api.json post /services/bens/api/v1/{chain_id}/addresses:batch-resolve-names
# Ethereum JSON-RPC endpoint
Source: https://docs.blockscout.com/api-reference/eth-rpc/ethereum-json-rpc-endpoint
/openapi-specs/pro-rpc-api-universal.json post /{chain_id}/json-rpc
Single endpoint for all standard Ethereum JSON-RPC 2.0 methods. Send a POST request with a JSON body specifying the `method` and `params`.
**Supported methods:** `eth_blockNumber`, `eth_getBalance`, `eth_getLogs`, `eth_gasPrice`, `eth_getTransactionByHash`, `eth_getTransactionReceipt`, `eth_chainId`, `eth_maxPriorityFeePerGas`, `eth_getTransactionCount`, `eth_getCode`, `eth_getStorageAt`, `eth_estimateGas`, `eth_getBlockByNumber`, `eth_getBlockByHash`, `eth_sendRawTransaction`, `eth_call`
**Example:**
```
curl -H "content-type: application/json" -H "Authorization: Bearer YOUR_KEY" -X POST \
--data '{"id":0,"jsonrpc":"2.0","method":"eth_blockNumber","params":[]}' \
https://api.blockscout.com/1/json-rpc
```
# List internal transactions generated during smart contract execution
Source: https://docs.blockscout.com/api-reference/internal-transactions/list-internal-transactions-generated-during-smart-contract-execution
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/internal-transactions
Retrieves a paginated list of internal transactions. Internal transactions are generated during contract execution and not directly recorded on the blockchain.
# Get block number by time stamp
Source: https://docs.blockscout.com/api-reference/legacy/get-block-number-by-time-stamp
/openapi-specs/Master-pro-api.json get /{chain_id}/api/legacy/block/get-block-number-by-time
Returns the block number created closest to a provided timestamp.
Required:
- `timestamp`
- `closest`
# Get Event Logs by Address/Topics/Block Range
Source: https://docs.blockscout.com/api-reference/logs/get-event-logs-by-addresstopicsblock-range
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=logs&action=getLogs
Returns event logs for an address and topic combination.
Up to a maximum of 1,000 event logs.
Use topic operators (and/or) to specify topic retrieval options.
At least one of `address` or `topic0` is required.
# Check if indexing is finished with indexing ratio
Source: https://docs.blockscout.com/api-reference/main-page/check-if-indexing-is-finished-with-indexing-ratio
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/main-page/indexing-status
Retrieves the current status of blockchain data indexing by the BlockScout instance.
# Last 6 transactions from the current user's watchlist
Source: https://docs.blockscout.com/api-reference/main-page/last-6-transactions-from-the-current-users-watchlist
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/main-page/transactions/watchlist
Retrieves a list of last 6 transactions from the current user's watchlist.
# Retrieve recent blocks as displayed on Blockscout homepage
Source: https://docs.blockscout.com/api-reference/main-page/retrieve-recent-blocks-as-displayed-on-blockscout-homepage
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/main-page/blocks
Retrieves a limited set of recent blocks for display on the main page or dashboard.
# Retrieve recent transactions as displayed on Blockscout homepage
Source: https://docs.blockscout.com/api-reference/main-page/retrieve-recent-transactions-as-displayed-on-blockscout-homepage
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/main-page/transactions
Retrieves a limited set of recent transactions displayed on the home page.
# Get servicesmetadataapiv1addresses
Source: https://docs.blockscout.com/api-reference/metadata/get-servicesmetadataapiv1addresses
/openapi-specs/Master-pro-api.json get /services/metadata/api/v1/addresses
# Get servicesmetadataapiv1metadata
Source: https://docs.blockscout.com/api-reference/metadata/get-servicesmetadataapiv1metadata
/openapi-specs/Master-pro-api.json get /services/metadata/api/v1/metadata
# Get servicesmetadataapiv1public tag types
Source: https://docs.blockscout.com/api-reference/metadata/get-servicesmetadataapiv1public-tag-types
/openapi-specs/Master-pro-api.json get /services/metadata/api/v1/public-tag-types
# Get servicesmetadataapiv1reputation
Source: https://docs.blockscout.com/api-reference/metadata/get-servicesmetadataapiv1reputation
/openapi-specs/Master-pro-api.json get /services/metadata/api/v1/reputation
# Get servicesmetadataapiv1tags:search
Source: https://docs.blockscout.com/api-reference/metadata/get-servicesmetadataapiv1tags:search
/openapi-specs/Master-pro-api.json get /services/metadata/api/v1/tags:search
# Post servicesmetadataapiv1addresses:submit
Source: https://docs.blockscout.com/api-reference/metadata/post-servicesmetadataapiv1addresses:submit
/openapi-specs/Master-pro-api.json post /services/metadata/api/v1/addresses:submit
# Unified quick search across addresses, blocks, transactions, block numbers, dapps, tokens, NFTs, and domains; supports unlimited results per chain.
Source: https://docs.blockscout.com/api-reference/multichainaggregatorservice/unified-quick-search-across-addresses-blocks-transactions-block-numbers-dapps-tokens-nfts-and-domains;-supports-unlimited-results-per-chain
/openapi-specs/Master-pro-api.json get /services/multichain/api/v1/search:quick
# Get basic info about address for ens-lookup and blockscout quick-search. Sorted by `registration_date`
Source: https://docs.blockscout.com/api-reference/multichaindomains/get-basic-info-about-address-for-ens-lookup-and-blockscout-quick-search-sorted-by-`registration_date`
/openapi-specs/Master-pro-api.json get /services/bens/api/v1/addresses:lookup
# Get basic info about name for ens-lookup and blockscout quick-search. Sorted by `registration_date`
Source: https://docs.blockscout.com/api-reference/multichaindomains/get-basic-info-about-name-for-ens-lookup-and-blockscout-quick-search-sorted-by-`registration_date`
/openapi-specs/Master-pro-api.json get /services/bens/api/v1/domains:lookup
# Get detailed information about main address of requested name
Source: https://docs.blockscout.com/api-reference/multichaindomains/get-detailed-information-about-main-address-of-requested-name
/openapi-specs/Master-pro-api.json get /services/bens/api/v1/addresses/{address}
# Get detailed information about name for Detailed name page
Source: https://docs.blockscout.com/api-reference/multichaindomains/get-detailed-information-about-name-for-detailed-name-page
/openapi-specs/Master-pro-api.json get /services/bens/api/v1/domains/{name}
# Get list of events of domain for Detailed domain page
Source: https://docs.blockscout.com/api-reference/multichaindomains/get-list-of-events-of-domain-for-detailed-domain-page
/openapi-specs/Master-pro-api.json get /services/bens/api/v1/domains/{name}/events
# Get list of supported protocols
Source: https://docs.blockscout.com/api-reference/multichaindomains/get-list-of-supported-protocols
/openapi-specs/Master-pro-api.json get /services/bens/api/v1/protocols
# Perform batch resolving of list of addresses to names for blockscout backend requests
Source: https://docs.blockscout.com/api-reference/multichaindomains/perform-batch-resolving-of-list-of-addresses-to-names-for-blockscout-backend-requests
/openapi-specs/Master-pro-api.json post /services/bens/api/v1/addresses:batch-resolve
# Batch by celestia blob.
Source: https://docs.blockscout.com/api-reference/optimism/batch-by-celestia-blob
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/optimism/batches/da/celestia/{height}/{commitment}
Retrieves batch detailed info by the given celestia blob metadata (height and commitment).
# Batch by its number.
Source: https://docs.blockscout.com/api-reference/optimism/batch-by-its-number
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/optimism/batches/{number}
Retrieves batch detailed info by the given number.
# List batches.
Source: https://docs.blockscout.com/api-reference/optimism/list-batches
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/optimism/batches
Retrieves a paginated list of batches.
# List deposits.
Source: https://docs.blockscout.com/api-reference/optimism/list-deposits
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/optimism/deposits
Retrieves a paginated list of deposits.
# List deposits on the main page.
Source: https://docs.blockscout.com/api-reference/optimism/list-deposits-on-the-main-page
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/main-page/optimism-deposits
Retrieves a list of deposits for the main page.
# List games.
Source: https://docs.blockscout.com/api-reference/optimism/list-games
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/optimism/games
Retrieves a paginated list of games.
# List output roots.
Source: https://docs.blockscout.com/api-reference/optimism/list-output-roots
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/optimism/output-roots
Retrieves a paginated list of output roots.
# List withdrawals.
Source: https://docs.blockscout.com/api-reference/optimism/list-withdrawals
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/optimism/withdrawals
Retrieves a paginated list of withdrawals.
# Number of batches in the list.
Source: https://docs.blockscout.com/api-reference/optimism/number-of-batches-in-the-list
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/optimism/batches/count
Retrieves a size of the batch list.
# Number of deposits in the list.
Source: https://docs.blockscout.com/api-reference/optimism/number-of-deposits-in-the-list
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/optimism/deposits/count
Retrieves a size of the deposits list.
# Number of games in the list.
Source: https://docs.blockscout.com/api-reference/optimism/number-of-games-in-the-list
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/optimism/games/count
Retrieves a size of the games list.
# Number of output roots in the list.
Source: https://docs.blockscout.com/api-reference/optimism/number-of-output-roots-in-the-list
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/optimism/output-roots/count
Retrieves a size of the output roots list.
# Number of withdrawals in the list.
Source: https://docs.blockscout.com/api-reference/optimism/number-of-withdrawals-in-the-list
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/optimism/withdrawals/count
Retrieves a size of the withdrawals list.
# Delete adminapiv1offers secrets
Source: https://docs.blockscout.com/api-reference/pointsadminservice/delete-adminapiv1offers-secrets
/openapi-specs/merits-admin-service.yaml delete /admin/api/v1/offers/{offer_id}/secrets/{secret_id}
# Get adminapiv1codes
Source: https://docs.blockscout.com/api-reference/pointsadminservice/get-adminapiv1codes
/openapi-specs/merits-admin-service.yaml get /admin/api/v1/codes
# Get adminapiv1distributions
Source: https://docs.blockscout.com/api-reference/pointsadminservice/get-adminapiv1distributions
/openapi-specs/merits-admin-service.yaml get /admin/api/v1/distributions/{distribution_id}
# Get adminapiv1networks
Source: https://docs.blockscout.com/api-reference/pointsadminservice/get-adminapiv1networks
/openapi-specs/merits-admin-service.yaml get /admin/api/v1/networks
# Get adminapiv1networks 1
Source: https://docs.blockscout.com/api-reference/pointsadminservice/get-adminapiv1networks-1
/openapi-specs/merits-admin-service.yaml get /admin/api/v1/networks/{chain_id}
# Get adminapiv1offers redemptions
Source: https://docs.blockscout.com/api-reference/pointsadminservice/get-adminapiv1offers-redemptions
/openapi-specs/merits-admin-service.yaml get /admin/api/v1/offers/{offer_id}/redemptions
# Get adminapiv1offers secrets
Source: https://docs.blockscout.com/api-reference/pointsadminservice/get-adminapiv1offers-secrets
/openapi-specs/merits-admin-service.yaml get /admin/api/v1/offers/{offer_id}/secrets
# Get adminapiv1users
Source: https://docs.blockscout.com/api-reference/pointsadminservice/get-adminapiv1users
/openapi-specs/merits-admin-service.yaml get /admin/api/v1/users
# Get adminapiv1users 1
Source: https://docs.blockscout.com/api-reference/pointsadminservice/get-adminapiv1users-1
/openapi-specs/merits-admin-service.yaml get /admin/api/v1/users/{address_or_code}
# Patch adminapiv1codes
Source: https://docs.blockscout.com/api-reference/pointsadminservice/patch-adminapiv1codes
/openapi-specs/merits-admin-service.yaml patch /admin/api/v1/codes
# Patch adminapiv1networks
Source: https://docs.blockscout.com/api-reference/pointsadminservice/patch-adminapiv1networks
/openapi-specs/merits-admin-service.yaml patch /admin/api/v1/networks/{chain_id}
# Patch adminapiv1offers
Source: https://docs.blockscout.com/api-reference/pointsadminservice/patch-adminapiv1offers
/openapi-specs/merits-admin-service.yaml patch /admin/api/v1/offers/{offer_id}
# Post adminapiv1codes
Source: https://docs.blockscout.com/api-reference/pointsadminservice/post-adminapiv1codes
/openapi-specs/merits-admin-service.yaml post /admin/api/v1/codes
# Post adminapiv1distribute
Source: https://docs.blockscout.com/api-reference/pointsadminservice/post-adminapiv1distribute
/openapi-specs/merits-admin-service.yaml post /admin/api/v1/distribute
# Post adminapiv1networks
Source: https://docs.blockscout.com/api-reference/pointsadminservice/post-adminapiv1networks
/openapi-specs/merits-admin-service.yaml post /admin/api/v1/networks/{chain_id}
# Post adminapiv1offers
Source: https://docs.blockscout.com/api-reference/pointsadminservice/post-adminapiv1offers
/openapi-specs/merits-admin-service.yaml post /admin/api/v1/offers/{offer_id}
# Post adminapiv1offers secrets
Source: https://docs.blockscout.com/api-reference/pointsadminservice/post-adminapiv1offers-secrets
/openapi-specs/merits-admin-service.yaml post /admin/api/v1/offers/{offer_id}/secrets
# Post adminapiv1users code
Source: https://docs.blockscout.com/api-reference/pointsadminservice/post-adminapiv1users-code
/openapi-specs/merits-admin-service.yaml post /admin/api/v1/users/{address}/code
# Batch by its number.
Source: https://docs.blockscout.com/api-reference/scroll/batch-by-its-number
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/scroll/batches/{number}
Retrieves batch info by the given number.
# List batches.
Source: https://docs.blockscout.com/api-reference/scroll/list-batches
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/scroll/batches
Retrieves a paginated list of batches.
# List deposits.
Source: https://docs.blockscout.com/api-reference/scroll/list-deposits
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/scroll/deposits
Retrieves a paginated list of deposits.
# List withdrawals.
Source: https://docs.blockscout.com/api-reference/scroll/list-withdrawals
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/scroll/withdrawals
Retrieves a paginated list of withdrawals.
# Number of batches in the list.
Source: https://docs.blockscout.com/api-reference/scroll/number-of-batches-in-the-list
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/scroll/batches/count
Retrieves a size of the batch list.
# Number of deposits in the list.
Source: https://docs.blockscout.com/api-reference/scroll/number-of-deposits-in-the-list
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/scroll/deposits/count
Retrieves a size of the deposits list.
# Number of withdrawals in the list.
Source: https://docs.blockscout.com/api-reference/scroll/number-of-withdrawals-in-the-list
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/scroll/withdrawals/count
Retrieves a size of the withdrawals list.
# Check if search query should redirect to a specific entity page
Source: https://docs.blockscout.com/api-reference/search/check-if-search-query-should-redirect-to-a-specific-entity-page
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/search/check-redirect
Checks if a search query redirects to a specific entity page rather than showing search results.
# Quick (unpaginated) search
Source: https://docs.blockscout.com/api-reference/search/quick-unpaginated-search
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/search/quick
Performs a quick, unpaginated search for short queries.
# Search for tokens, addresses, contracts, blocks, or transactions by identifier
Source: https://docs.blockscout.com/api-reference/search/search-for-tokens-addresses-contracts-blocks-or-transactions-by-identifier
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v1/search
Performs a unified search across multiple blockchain entity types including tokens, addresses, contracts, blocks, transactions and other resources.
# Search for tokens, addresses, contracts, blocks, or transactions by identifier
Source: https://docs.blockscout.com/api-reference/search/search-for-tokens-addresses-contracts-blocks-or-transactions-by-identifier-1
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/search
Performs a unified search across multiple blockchain entity types including tokens, addresses, contracts, blocks, transactions and other resources.
# List Shibarium deposits.
Source: https://docs.blockscout.com/api-reference/shibarium/list-shibarium-deposits
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/shibarium/deposits
Retrieves a paginated list of completed Shibarium deposits ordered by parent chain block number descending.
A deposit is "completed" when both the parent-chain and Shibarium sides of the bridge have been observed.
# List Shibarium withdrawals.
Source: https://docs.blockscout.com/api-reference/shibarium/list-shibarium-withdrawals
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/shibarium/withdrawals
Retrieves a paginated list of completed Shibarium withdrawals ordered by Shibarium block number descending.
A withdrawal is "completed" when both the Shibarium and parent-chain sides of the bridge have been observed.
# Number of Shibarium deposits.
Source: https://docs.blockscout.com/api-reference/shibarium/number-of-shibarium-deposits
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/shibarium/deposits/count
Retrieves the total count of completed Shibarium deposits.
# Number of Shibarium withdrawals.
Source: https://docs.blockscout.com/api-reference/shibarium/number-of-shibarium-withdrawals
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/shibarium/withdrawals/count
Retrieves the total count of completed Shibarium withdrawals.
# Audit reports list
Source: https://docs.blockscout.com/api-reference/smart-contracts/audit-reports-list
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/smart-contracts/{address_hash_param}/audit-reports
Returns audit reports for a given smart contract address.
# Get count statistics (new & newly verified) for deployed smart contracts
Source: https://docs.blockscout.com/api-reference/smart-contracts/get-count-statistics-new-&-newly-verified-for-deployed-smart-contracts
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/smart-contracts/counters
Retrieves count statistics for smart contracts, including total contracts, verified contracts, and new contracts in the last 24 hours.
# List verified smart contracts with optional filtering options
Source: https://docs.blockscout.com/api-reference/smart-contracts/list-verified-smart-contracts-with-optional-filtering-options
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/smart-contracts/
Retrieves a paginated list of verified smart contracts with optional filtering by proxy status or programming language.
# Retrieve detailed information about a verified smart contract
Source: https://docs.blockscout.com/api-reference/smart-contracts/retrieve-detailed-information-about-a-verified-smart-contract
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/smart-contracts/{address_hash_param}
Retrieves detailed information about a specific verified smart contract, including source code, ABI, and deployment details.
# Get Stability validators counters.
Source: https://docs.blockscout.com/api-reference/stability/get-stability-validators-counters
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/validators/stability/counters
Retrieves aggregate counters for the Stability chain validator set.
# List Stability validators.
Source: https://docs.blockscout.com/api-reference/stability/list-stability-validators
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/validators/stability
Retrieves a paginated list of validators on the Stability chain, optionally filtered by state and sorted by state, address hash or number of blocks produced.
# Get daily closing price and market cap for native coin
Source: https://docs.blockscout.com/api-reference/stats/get-daily-closing-price-and-market-cap-for-native-coin
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/stats/charts/market
Retrieves time series data of market information (daily closing price, market cap) for rendering charts.
# Get daily transaction counts
Source: https://docs.blockscout.com/api-reference/stats/get-daily-transaction-counts
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/stats/charts/transactions
Retrieves time series data of daily transaction counts for rendering charts.
# Get ERC-20 or ERC-721 Token Total Supply
Source: https://docs.blockscout.com/api-reference/stats/get-erc-20-or-erc-721-token-total-supply
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=stats&action=tokensupply
Returns the total supply of an ERC-20 or ERC-721 token by contract address
# Get Native Coin Price
Source: https://docs.blockscout.com/api-reference/stats/get-native-coin-price
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=stats&action=coinprice
Returns latest price of native coin in USD and BTC.
# Get Native Token Price
Source: https://docs.blockscout.com/api-reference/stats/get-native-token-price
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=stats&action=ethprice
Returns the price of the native token in USD and BTC
# Get Total Coin Supply from DB
Source: https://docs.blockscout.com/api-reference/stats/get-total-coin-supply-from-db
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=stats&action=coinsupply
Returns total coin supply from database minus burnt tokens.
# Get Total Supply from Exchange
Source: https://docs.blockscout.com/api-reference/stats/get-total-supply-from-exchange
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=stats&action=ethsupplyexchange
Returns total supply in Wei from exchange data.
# Get Total Supply of Native Token
Source: https://docs.blockscout.com/api-reference/stats/get-total-supply-of-native-token
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=stats&action=ethsupply
Returns the total supply of the native token (e.g., ETH, xDai)
# Get Total Transaction Fees
Source: https://docs.blockscout.com/api-reference/stats/get-total-transaction-fees
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=stats&action=totalfees
Returns total transaction fees in Wei paid by users to validators per day.
`date` is required.
# Retrieve blockchain network statistics and metrics
Source: https://docs.blockscout.com/api-reference/stats/retrieve-blockchain-network-statistics-and-metrics
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/stats
Retrieves blockchain network statistics including total blocks, transactions, addresses, average block time, market data, and network utilization.
# Retrieve hot smart-contracts
Source: https://docs.blockscout.com/api-reference/stats/retrieve-hot-smart-contracts
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/stats/hot-smart-contracts
Retrieves paginated list of hot smart-contracts
# Secondary coin market history chart data
Source: https://docs.blockscout.com/api-reference/stats/secondary-coin-market-history-chart-data
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/stats/charts/secondary-coin-market
Returns market history for the secondary coin used for charting.
# Returns all available counter stats for the stats page.
Source: https://docs.blockscout.com/api-reference/statsservice/returns-all-available-counter-stats-for-the-stats-page
/openapi-specs/Master-pro-api.json get /{chain_id}/stats-service/api/v1/counters
# Returns data points for a specific line chart, with optional date range
and resolution filtering.
Source: https://docs.blockscout.com/api-reference/statsservice/returns-data-points-for-a-specific-line-chart-with-optional-date-rangeand-resolution-filtering
/openapi-specs/Master-pro-api.json get /{chain_id}/stats-service/api/v1/lines/{name}
# Returns interchain messaging stats to be displayed on the main page of interchain indexer.
Source: https://docs.blockscout.com/api-reference/statsservice/returns-interchain-messaging-stats-to-be-displayed-on-the-main-page-of-interchain-indexer
/openapi-specs/Master-pro-api.json get /{chain_id}/stats-service/api/v1/pages/interchain/main
# Returns metadata (title, description, available resolutions) for all
line charts, organized into sections.
Source: https://docs.blockscout.com/api-reference/statsservice/returns-metadata-title-description-available-resolutions-for-allline-charts-organized-into-sections
/openapi-specs/Master-pro-api.json get /{chain_id}/stats-service/api/v1/lines
# Returns multichain-aggregated stats to be displayed on the main page of multichain indexer.
Source: https://docs.blockscout.com/api-reference/statsservice/returns-multichain-aggregated-stats-to-be-displayed-on-the-main-page-of-multichain-indexer
/openapi-specs/Master-pro-api.json get /{chain_id}/stats-service/api/v1/pages/multichain/main
# Returns stats to be displayed on the contracts page.
Source: https://docs.blockscout.com/api-reference/statsservice/returns-stats-to-be-displayed-on-the-contracts-page
/openapi-specs/Master-pro-api.json get /{chain_id}/stats-service/api/v1/pages/contracts
# Returns stats to be displayed on the main page of indexer.
Source: https://docs.blockscout.com/api-reference/statsservice/returns-stats-to-be-displayed-on-the-main-page-of-indexer
/openapi-specs/Master-pro-api.json get /{chain_id}/stats-service/api/v1/pages/main
# Returns stats to be displayed on the transactions page.
Source: https://docs.blockscout.com/api-reference/statsservice/returns-stats-to-be-displayed-on-the-transactions-page
/openapi-specs/Master-pro-api.json get /{chain_id}/stats-service/api/v1/pages/transactions
# List token transfers across all token types (ERC-20, ERC-721, ERC-1155)
Source: https://docs.blockscout.com/api-reference/token-transfers/list-token-transfers-across-all-token-types-erc-20-erc-721-erc-1155
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/token-transfers
Retrieves a paginated list of token transfers across all token types (ERC-20, ERC-721, ERC-1155).
# Get Bridged Tokens List
Source: https://docs.blockscout.com/api-reference/token/get-bridged-tokens-list
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=token&action=bridgedTokenList
Returns array of bridged token information from native bridge application.
# Get Token Holders
Source: https://docs.blockscout.com/api-reference/token/get-token-holders
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=token&action=getTokenHolders
Returns an array of token holder accounts and amounts held for a specified token
# Get Token Info
Source: https://docs.blockscout.com/api-reference/token/get-token-info
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=token&action=getToken
Returns info on name, symbol, supply and type for a token contract address
# Export token holders as CSV
Source: https://docs.blockscout.com/api-reference/tokens/export-token-holders-as-csv
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/tokens/{address_hash_param}/holders/csv
Exports the holders of a specific token as a CSV file.
# Export token transfers as CSV
Source: https://docs.blockscout.com/api-reference/tokens/export-token-transfers-as-csv
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/tokens/{address_hash_param}/transfers/csv
Exports the transfers of a specific token as a CSV file.
# Fetch media type for a specific NFT instance
Source: https://docs.blockscout.com/api-reference/tokens/fetch-media-type-for-a-specific-nft-instance
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/tokens/{address_hash_param}/instances/{token_id_param}/media-type
Determines and returns the media type categories (image/video/html) for the image and animation URLs of a specific NFT instance. Fetches via HTTP HEAD if not yet determined and stores the result.
# Get holder and transfer count statistics for a specific token
Source: https://docs.blockscout.com/api-reference/tokens/get-holder-and-transfer-count-statistics-for-a-specific-token
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/tokens/{address_hash_param}/counters
Retrieves count statistics for a specific token, including holders count and transfers count.
# Get total number of ownership transfers for a specific NFT
Source: https://docs.blockscout.com/api-reference/tokens/get-total-number-of-ownership-transfers-for-a-specific-nft
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/tokens/{address_hash_param}/instances/{token_id_param}/transfers-count
Retrieves the total number of transfers for a specific NFT instance. Useful for determining how frequently an NFT has changed hands.
# List addresses holding a specific token sorted by balance
Source: https://docs.blockscout.com/api-reference/tokens/list-addresses-holding-a-specific-token-sorted-by-balance
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/tokens/{address_hash_param}/holders
Retrieves addresses holding a specific token, sorted by balance. Useful for analyzing token distribution.
# List current holders of a specific NFT
Source: https://docs.blockscout.com/api-reference/tokens/list-current-holders-of-a-specific-nft
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/tokens/{address_hash_param}/instances/{token_id_param}/holders
Retrieves current holders of a specific NFT instance. For ERC-721, this will typically be a single address. For ERC-1155, multiple addresses may hold the same token ID.
# List individual NFT instances for a token contract
Source: https://docs.blockscout.com/api-reference/tokens/list-individual-nft-instances-for-a-token-contract
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/tokens/{address_hash_param}/instances
Retrieves instances of NFTs for a specific token contract. This endpoint is primarily for ERC-721 and ERC-1155 tokens.
# List ownership transfer history for a specific NFT
Source: https://docs.blockscout.com/api-reference/tokens/list-ownership-transfer-history-for-a-specific-nft
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/tokens/{address_hash_param}/transfers
Retrieves transfer history for a specific NFT instance, showing ownership changes over time.
# List token transfers for a specific token instance
Source: https://docs.blockscout.com/api-reference/tokens/list-token-transfers-for-a-specific-token-instance
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/tokens/{address_hash_param}/instances/{token_id_param}/transfers
Retrieves token transfers for a specific token instance (by token address and token ID).
# List tokens with optional filtering by name, symbol, or type
Source: https://docs.blockscout.com/api-reference/tokens/list-tokens-with-optional-filtering-by-name-symbol-or-type
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/tokens/
Retrieves a paginated list of tokens with optional filtering by name, symbol, or type.
# Retrieve detailed information about a specific NFT
Source: https://docs.blockscout.com/api-reference/tokens/retrieve-detailed-information-about-a-specific-nft
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/tokens/{address_hash_param}/instances/{token_id_param}
Retrieves detailed information about a specific NFT instance, identified by its token contract address and token ID.
# Retrieve detailed information about a specific token
Source: https://docs.blockscout.com/api-reference/tokens/retrieve-detailed-information-about-a-specific-token
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/tokens/{address_hash_param}
Retrieves detailed information for a specific token identified by its contract address.
# Get Transaction Execution Status
Source: https://docs.blockscout.com/api-reference/transaction/get-transaction-execution-status
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=transaction&action=getstatus
Returns transaction execution status with error description if applicable.
Also available through a GraphQL 'transaction' query.
isError: 0 = pass (no error), 1 = error
# Get Transaction Info by Transaction Hash
Source: https://docs.blockscout.com/api-reference/transaction/get-transaction-info-by-transaction-hash
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=transaction&action=gettxinfo
Returns transaction information including revert reason if available
# Get Transaction Receipt Status
Source: https://docs.blockscout.com/api-reference/transaction/get-transaction-receipt-status
/openapi-specs/pro-rpc-api-universal.json get /v2/api?module=transaction&action=gettxreceiptstatus
Returns the status of a transaction receipt.
Also available through a GraphQL 'transaction' query.
Status: 0 = failed, 1 = successful
# Get a human-readable, LLM-based transaction summary
Source: https://docs.blockscout.com/api-reference/transactions/get-a-human-readable-llm-based-transaction-summary
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/transactions/{transaction_hash_param}/summary
Retrieves a human-readable summary of what a transaction did, presented in natural language.
# Get on-chain state changes caused by a specific transaction
Source: https://docs.blockscout.com/api-reference/transactions/get-on-chain-state-changes-caused-by-a-specific-transaction
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/transactions/{transaction_hash_param}/state-changes
Retrieves state changes (balance changes, token transfers) caused by a specific transaction.
# Get step-by-step execution trace for a specific transaction
Source: https://docs.blockscout.com/api-reference/transactions/get-step-by-step-execution-trace-for-a-specific-transaction
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/transactions/{transaction_hash_param}/raw-trace
Retrieves the raw execution trace for a transaction, showing the step-by-step execution path and all contract interactions.
# Get transaction statistics
Source: https://docs.blockscout.com/api-reference/transactions/get-transaction-statistics
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/transactions/stats
Retrieves statistics for transactions, including counts and fee summaries for the last 24 hours.
# List beacon deposits in a transaction
Source: https://docs.blockscout.com/api-reference/transactions/list-beacon-deposits-in-a-transaction
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/transactions/{transaction_hash_param}/beacon/deposits
Retrieves beacon deposits included in a specific transaction with pagination support.
# List blobs for a transaction
Source: https://docs.blockscout.com/api-reference/transactions/list-blobs-for-a-transaction
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/transactions/{transaction_hash_param}/blobs
Retrieves blobs for a specific transaction (Ethereum only).
# List blockchain transactions with filtering options for status, type, and method
Source: https://docs.blockscout.com/api-reference/transactions/list-blockchain-transactions-with-filtering-options-for-status-type-and-method
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/transactions
Retrieves a paginated list of transactions with optional filtering by status, type, and method.
# List event logs emitted during a specific transaction
Source: https://docs.blockscout.com/api-reference/transactions/list-event-logs-emitted-during-a-specific-transaction
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/transactions/{transaction_hash_param}/logs
Retrieves event logs emitted during the execution of a specific transaction. Logs contain information about contract events and state changes.
# List external transactions linked to a transaction
Source: https://docs.blockscout.com/api-reference/transactions/list-external-transactions-linked-to-a-transaction
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/transactions/{transaction_hash_param}/external-transactions
Retrieves external transactions that are linked to the specified transaction (e.g., Solana transactions in `neon` chain type).
# List FHE operations for a specific transaction
Source: https://docs.blockscout.com/api-reference/transactions/list-fhe-operations-for-a-specific-transaction
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/transactions/{transaction_hash_param}/fhe-operations
Retrieves Fully Homomorphic Encryption (FHE) operations parsed from transaction logs. Includes operation details, HCU (Homomorphic Compute Unit) costs, operation types, and related metadata.
# List internal transactions triggered during a specific transaction
Source: https://docs.blockscout.com/api-reference/transactions/list-internal-transactions-triggered-during-a-specific-transaction
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/transactions/{transaction_hash_param}/internal-transactions
Retrieves internal transactions generated during the execution of a specific transaction. Useful for analyzing contract interactions and debugging failed transactions.
# List L2 transactions in a Scroll batch
Source: https://docs.blockscout.com/api-reference/transactions/list-l2-transactions-in-a-scroll-batch
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/transactions/scroll-batch/{batch_number_param}
Retrieves L2 transactions bound to a specific Scroll batch number.
# List L2 transactions in a ZkSync batch
Source: https://docs.blockscout.com/api-reference/transactions/list-l2-transactions-in-a-zksync-batch
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/transactions/zksync-batch/{batch_number_param}
Retrieves L2 transactions bound to a specific ZkSync batch number.
# List L2 transactions in an Arbitrum batch
Source: https://docs.blockscout.com/api-reference/transactions/list-l2-transactions-in-an-arbitrum-batch
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/transactions/arbitrum-batch/{batch_number_param}
Retrieves L2 transactions bound to a specific Arbitrum batch number.
# List L2 transactions in an Optimism batch
Source: https://docs.blockscout.com/api-reference/transactions/list-l2-transactions-in-an-optimism-batch
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/transactions/optimism-batch/{batch_number_param}
Retrieves L2 transactions bound to a specific Optimism batch number.
# List token transfers within a specific transaction
Source: https://docs.blockscout.com/api-reference/transactions/list-token-transfers-within-a-specific-transaction
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/transactions/{transaction_hash_param}/token-transfers
Retrieves token transfers that occurred within a specific transaction, with optional filtering by token type.
# List transactions executed on a specific execution node
Source: https://docs.blockscout.com/api-reference/transactions/list-transactions-executed-on-a-specific-execution-node
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/transactions/execution-node/{execution_node_hash_param}
Retrieves transactions that were executed on the specified execution node.
# List transactions in a user's watchlist
Source: https://docs.blockscout.com/api-reference/transactions/list-transactions-in-a-users-watchlist
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/transactions/watchlist
Retrieves transactions in the authenticated user's watchlist.
# Retrieve detailed information about a specific transaction
Source: https://docs.blockscout.com/api-reference/transactions/retrieve-detailed-information-about-a-specific-transaction
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/transactions/{transaction_hash_param}
Retrieves detailed information for a specific transaction identified by its hash.
# List validator withdrawal details on proof-of-stake networks
Source: https://docs.blockscout.com/api-reference/withdrawals/list-validator-withdrawal-details-on-proof-of-stake-networks
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/withdrawals
Retrieves a paginated list of withdrawals, typically for proof-of-stake networks supporting validator withdrawals.
# Withdrawals counters
Source: https://docs.blockscout.com/api-reference/withdrawals/withdrawals-counters
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/withdrawals/counters
Returns total withdrawals count and sum from cache.
# Zilliqa validator by its BLS public key.
Source: https://docs.blockscout.com/api-reference/zilliqa/zilliqa-validator-by-its-bls-public-key
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/validators/zilliqa/{bls_public_key}
Retrieves Zilliqa validator detailed info by the given BLS public key.
# Zilliqa validators list.
Source: https://docs.blockscout.com/api-reference/zilliqa/zilliqa-validators-list
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/validators/zilliqa
Retrieves the list of Zilliqa validators.
# Get batch by number.
Source: https://docs.blockscout.com/api-reference/zksync/get-batch-by-number
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/zksync/batches/{batch_number_param}
Retrieves detailed information about a ZkSync batch by its number.
# Get batches count.
Source: https://docs.blockscout.com/api-reference/zksync/get-batches-count
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/zksync/batches/count
Retrieves the total count of ZkSync rollup batches.
# Get the latest batch number.
Source: https://docs.blockscout.com/api-reference/zksync/get-the-latest-batch-number
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/main-page/zksync/batches/latest-number
Retrieves the number of the most recent ZkSync rollup batch. Returns 0 if no batches exist.
# List batches.
Source: https://docs.blockscout.com/api-reference/zksync/list-batches
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/zksync/batches
Retrieves a paginated list of ZkSync rollup batches, newest first.
# List confirmed batches on the main page.
Source: https://docs.blockscout.com/api-reference/zksync/list-confirmed-batches-on-the-main-page
/openapi-specs/Master-pro-api.json get /{chain_id}/api/v2/main-page/zksync/batches/confirmed
Retrieves up to ten most-recently-committed ZkSync rollup batches, displayed on the main page.
# Base API
Source: https://docs.blockscout.com/base-api
Blockscout PRO API access for Base (chain ID 8453): REST, JSON RPC, and ETH RPC endpoints, paid tiers from Builder, and migrating from Etherscan.
## Base API Access with Blockscout
Base is Coinbase's Ethereum L2 and one of the fastest-growing chains in the ecosystem. With its 2026 strategy focused on tokenized markets, stablecoin payments, and developer tooling, Base has become a magnet for consumer dapps, DeFi, SocialFi, and AI agent applications. Its TVL has grown into the multi-billion dollar range, and hundreds of teams are building across the stack.
Base API access requires a paid plan.
**Base Chain ID:** `8453` **Explorer:** [base.blockscout.com](https://base.blockscout.com) **PRO API Base:** `https://api.blockscout.com` (use `chain_id=8453`)
## Quick Start
Get your first API response in under 60 seconds:
```bash theme={null}
# Get ETH balance for an address on Base via PRO API
curl "https://api.blockscout.com/v2/api?chain_id=8453&module=account&action=balance&address=0xYOUR_ADDRESS&apikey=proapi_YOUR_KEY"
```
Get your API key at [dev.blockscout.com](https://dev.blockscout.com) β required for all PRO API tiers.
## PRO API Routes for Base
All routes use Base's chain ID (`8453`):
**JSON RPC v2 (Etherscan-compatible):**
```text theme={null}
https://api.blockscout.com/v2/api?chain_id=8453&module=account&action=txlist&address=0x...&apikey=proapi_xxx
```
**JSON RPC:**
```text theme={null}
https://api.blockscout.com/8453/api?module=account&action=txlist&address=0x...&apikey=proapi_xxx
```
**REST API:**
```text theme={null}
https://api.blockscout.com/8453/api/v2/addresses/0x.../transactions?apikey=proapi_xxx
```
**ETH RPC (POST):**
```bash theme={null}
curl -H "content-type: application/json" \
-H "authorization: Bearer proapi_xxx" \
-X POST \
--data '{"id":0,"jsonrpc":"2.0","method":"eth_blockNumber","params":[]}' \
https://api.blockscout.com/8453/json-rpc
```
## Available Endpoints
### Etherscan-Compatible Modules
All standard modules work β if you've used Etherscan's Base API before, the same parameters apply:
* **Account** β Balances, transaction lists, token transfers, internal transactions, ERC-20/721/1155 activity (plus Blockscout extras: `eth_get_balance`, `pendingtxlist`, `tokenbalance`, `tokenlist`)
* **Contract** β ABI, source code, verification (plus: `listcontracts`, `getcontractcreation`, Vyper & Sourcify verification)
* **Transaction** β Status checks (plus: `gettxinfo`)
* **Logs** β Event logs with filtering by address, topics, block range
* **Token** β Token metadata, holders
* **Stats** β Supply, chain statistics, coin price
* **Block** β Block rewards, countdown, block number by time
* **Gas Tracker** β Gas oracle, gas estimates
### REST API
Blockscout's native REST API provides enriched metadata, decoded input data, NFT media and attributes, smart contract read/write interaction, and chain health monitoring β all accessible through the PRO API.
**β [Full REST API Reference](https://base.blockscout.com/api-docs)**
## Base API Pricing
| Tier | Rate Limit | Credits | Price |
| - | - | - | - |
| Builder | 15 RPS | 100M/mo | \$49/mo |
| Pro | 30 RPS | 500M/mo | \$199/mo |
| Business | 50 RPS | 3B/mo | \$999/mo |
| Enterprise | Custom | Custom | Contact us |
Every tier includes access to all 117 Blockscout-supported chains β not just Base. One API key, one account, one `chain_id` parameter swap to query any network.
## Switching from Etherscan's Base API?
Since both APIs now use a unified multichain format, the migration is a base URL and key swap:
```javascript theme={null}
// Before (Etherscan V2)
const resp = await fetch(
`https://api.etherscan.io/v2/api?chainid=8453&module=account&action=balance&address=${addr}&apikey=${ETHERSCAN_KEY}`
);
// After (Blockscout PRO API)
const resp = await fetch(
`https://api.blockscout.com/v2/api?chain_id=8453&module=account&action=balance&address=${addr}&apikey=${BLOCKSCOUT_KEY}`
);
```
Same structure: `chainid` β `chain_id`, swap the base URL and key.
**β [Full Migration Guide](https://docs.blockscout.com/devs/migrate-from-etherscan)**
## What Developers Build on Base with Blockscout's API
**Consumer Dapps & SocialFi** β Base is home to Farcaster, Zora, and a growing SocialFi ecosystem. Blockscout's API powers transaction history, token balances, and NFT data for these applications.
**DeFi Backends** β With billions in TVL across DEXs, lending markets, and yield platforms, Base DeFi apps rely on explorer APIs for contract data, event monitoring, and position tracking.
**AI Agents & Automation** β Base's 2026 roadmap includes native support for AI agent smart accounts. Blockscout's PRO API and MCP server provide the structured onchain data these agents need.
**Wallets & Portfolio Trackers** β Pull complete transaction histories, multi-token balances, and NFT holdings for Base addresses through a single API key that also covers every other chain.
## Base on Blockscout
As part of the OP Superchain, Base benefits from Blockscout's native support for L1βL2 transaction tracking, including deposit and withdrawal views and cross-chain message debugging. With the PRO API's multichain architecture, querying Base is just one `chain_id` parameter away from querying Ethereum, Optimism, Arbitrum, or any other supported network.
## Get Started
1. Get an API key at [**dev.blockscout.com**](https://dev.blockscout.com)
2. Purchase an access tier starting at \$49/mo
3. Use `chain_id=8453` in your PRO API requests
4. Explore [available endpoints](/devs/pro-api)
**β [Start Building on Base](https://dev.blockscout.com)** Β· **β [PRO API Routes Reference](https://docs.blockscout.com/devs/pro-api-responses-and-routes)**
# Best Practices
Source: https://docs.blockscout.com/best-practices
Practical tips for faster, more efficient Blockscout PRO API requests, from pagination to credit costs.
## Use pagination instead of over-fetching
Blockscout REST endpoints use keyset pagination. By default a response returns the first 50 results. When a response includes `next_page_params`, copy that object and append its fields to your next request rather than paging through with an offset:
```json theme={null}
{
"items": [ ... ],
"next_page_params": {
"block_number": 18678766,
"index": 119,
"items_count": 50
}
}
```
```sh theme={null}
curl "https://api.blockscout.com/1/api/v2/addresses/0xYourAddress/transactions?block_number=18678766&index=119&items_count=50&apikey="
```
Only request more pages than you need if you actually plan to use the data β each page is a separate call against your credit allowance.
## Know your credit costs before you build
Every call consumes credits, and the cost varies by endpoint β the default is 20 credits, but a few heavier endpoints (transaction summaries, raw traces, coin balance history) cost more. See [Rate Limits](/rate-limits) for the full table. If you're building something that polls frequently, budget for the endpoint's actual cost, not the 20-credit default.
## Filter scam tokens by default β know when not to
Token endpoints filter known scam airdrops out of results by default, which is usually what you want for a wallet UI or portfolio tracker. If you need the unfiltered list β for a dispute, an audit, or your own scoring layer β pass the `show-scam-tokens` header on the relevant token-transfer call.
## One key, every chain β don't provision per network
The PRO API scopes every request by `chain_id`, not by base URL or key. The same key that works on Ethereum works on Base, Arbitrum, Optimism, and every other supported chain β there's no need to request separate credentials per network the way some other explorers require.
## Prefer REST over RPC-style calls for richer data
The Etherscan-compatible `module`/`action` route is the easiest migration path if you're already using it, but Blockscout's REST API (`/api/v2/...`) returns more β decoded input data, human-readable transaction summaries, NFT metadata, and contract state β from the same underlying data with no extra indexing work on your side. If you're building new, start with REST.
## Combine feeds for a complete picture
No single endpoint gives you a wallet's full onchain footprint. A typical active address has top-level transactions, internal value movements (from DEX or bridge interactions), and token transfers, all as separate feeds:
| Feed | Endpoint |
| - | - |
| Top-level transactions | `GET /{chain_id}/api/v2/addresses/{address}/transactions` |
| Internal transactions | `GET /{chain_id}/api/v2/addresses/{address}/internal-transactions` |
| Token transfers | `GET /{chain_id}/api/v2/addresses/{address}/token-transfers` |
Join by transaction hash and deduplicate when combining them β see [Wallet History](/devs/wallet-history) and [Tax Calculator](/devs/tax-calculator) for worked examples.
## Watch the response headers, not just the response body
Every PRO API response includes headers that tell you exactly where you stand, so you don't have to guess:
* `x-credits-remaining` β credits left in your current period
* `x-ratelimit-limit` β your plan's RPS ceiling
* `x-ratelimit-remaining` β RPS headroom left in the current window
If `x-credits-remaining` isn't decreasing, your key isn't authenticating β check it before assuming the data is wrong.
## Historical pricing needs an external feed
The PRO API returns current exchange rates, but not historical ones. If you need the USD value of an asset at the moment of a past transaction (for tax or accounting workflows), pair the block timestamp on each row with an external pricing feed β CoinGecko, Pyth, or your own oracle.
# v12.0.0 - Breaking changes and API updates
Source: https://docs.blockscout.com/blockscout-v12-0-0-api-updates-and-breaking-changes
Blockscout v12.0.0 breaking changes and behavior updates across the REST, JSON RPC, ETH RPC, and GraphQL APIs, with the actions integrators need to take.
Blockscout v12.0.0 will be released on 7 October, 2026 and roll out to hosted instances in a gradual fashion. It includes breaking changes for API integrators. Please see the requirements below.
**Severity legend:**
**π΄ Breaking** = existing requests fail or fields disappear. π΅ **Behavior** = same request, different answer.
## Overview
Additional details are included for each item below the table.
| # | Surface | Change | Severity |
| - | - | - | - |
| 1 | REST API | `items_count` is now a page-size request param and is no longer echoed in `next_page_params`; `key`, `sort`, `order`, `state_filter` are no longer echoed either | **π΄ Breaking** |
| 2 | REST API | State-changes cursor `state_changes` + `items_count` replaced by `state_changes_count` | **π΄ Breaking** |
| 3 | REST API | `limit` query param removed from `/internal-transactions` and `/token-transfers` (422); ignored on `/tokens` | **π΄ Breaking** |
| 4 | REST API | `token` object removed from items of `/tokens/{hash}/instances` | **π΄ Breaking** |
| 5 | REST API | All `/api/v2/mud/*` endpoints removed | **π΄ Breaking** |
| 6 | REST API | Stability validators and zkSync batches endpoints now validate params (422 on unknown/invalid; `state_filter` case-sensitive) | **π΄ Breaking** |
| 7 | REST API | `?recaptcha_response=` on NFT `refetch-metadata` now returns 422; send reCAPTCHA via headers | **π΄ Breaking** |
| 8 | REST, JSON RPC, GraphQL APIs | Constructor arguments now `0x`-prefixed | **π΄ Breaking** |
| 9 | REST API | Search may return `ens_domain` results for bare names; `check-redirect` may redirect on them | π΅ **Behavior** |
| 10 | REST API | `tabs-counters` omits chain-specific counters on other chains; token counters honour scam-token toggle | π΅ **Behavior** |
| 11 | REST API | `/transactions/{hash}/summary` can return 503 under DB lock contention | π΅ **Behavior** |
| 12 | JSON RPC API | `getsourcecode` `ConstructorArguments` gets `0x`; `gettxinfo` `next_page_params` loses `items_count` | **π΄ Breaking** |
| 13 | JSON RPC API | Sourcify verification uses Sourcify API v2: `metadata.json` required, blocking poll up to \~60 s, new error strings, different `AdditionalSources[].Filename` | π΅ **Behavior** |
| 14 | ETH RPC API | `error` is now a JSON-RPC object `{code, message}` instead of a string; messages reworded | **π΄ Breaking** |
| 15 | ETH RPC API | `eth_getLogs` rejects non-`0x` block numbers (-32602) | **π΄ Breaking** |
| 16 | ETH RPC API | Operators may disable core proxy methods (`eth_call`, `eth_getCode`, β¦) β -32601 | π΅ **Behavior** (config) |
| 17 | ETH RPC API | `GET /api/legacy/logs/get-logs` and `GET /api/legacy/block/eth-block-number` removed; `POST /api/legacy/eth/*` added | **π΄ Breaking** |
| 18 | GraphQL API | `token_transfers` hide scam tokens when `HIDE_SCAM_ADDRESSES=true`; opt out with `show-scam-tokens` header or `show_scam_tokens` cookie | π΅ **Behavior** |
***
## REST API
### 1. π΄ Pagination: `items_count` changed meaning, several params no longer echoed
* `items_count` was a cursor counter echoed back inside `next_page_params`. It is now a **request parameter that sets the page size** (1 to `MAX_ITEMS_PER_PAGE`, default 100; default page size stays 50). It is **no longer included in `next_page_params`**.
* A value above `MAX_ITEMS_PER_PAGE` is **silently clamped** to the maximum; it does not return 422. Only values below 1 are rejected.
* `next_page_params` also no longer contains `key` (the API key, to stop leaking secrets) or the atom-keyed `sort`, `order`, `state_filter` values on spec'd endpoints.
**Impact**
* Clients that follow `next_page_params` verbatim keep working with the default page size, **but only for lists requested without `sort`/`order`**. Sorted lists (address transactions, addresses list, tokens, smart-contracts, validators) must re-send `sort` and `order` on every page, otherwise the next page comes back in the default order and the cursor no longer matches.
* Clients that want a custom page size must add `items_count=N` to **every** request, including follow-up pages.
* Clients that read `items_count` from `next_page_params` (for progress display, etc.) must stop; use the page length instead.
### 2. π΄ State changes cursor
`GET /api/v2/transactions/{hash}/state-changes` `next_page_params` changed from `{"state_changes": null, "items_count": N}` to `{"state_changes_count": N}`. A stored old cursor containing `state_changes` now returns 422.
### 3. π΄`limit` query parameter removed
| Endpoint | v11 | v12 |
| - | - | - |
| `GET /api/v2/internal-transactions?limit=` | clamped page size | **422 Unexpected field** |
| `GET /api/v2/token-transfers?limit=` | clamped page size | **422 Unexpected field** |
| `GET /api/v2/tokens?limit=` | applied | accepted but ignored |
Use `items_count` instead.
### 4. π΄ `token` removed from NFT instance list items
Items in `GET /api/v2/tokens/{hash}/instances` (with or without `holder_address_hash`) no longer include the nested `token` object; the token is identified by the URL. The single-instance endpoint `GET /api/v2/tokens/{hash}/instances/{id}` still includes `token`. New fields `image_media_type` and `animation_media_type` were added to instances.
### 5. π΄ MUD endpoints removed
All `/api/v2/mud/worldsβ¦` endpoints and the `mud` OpenAPI spec are gone. `MUD_INDEXER_ENABLED`, `MUD_DATABASE_URL`, `MUD_POOL_SIZE` are deprecated.
### 6. π΄ Endpoints newly validated by OpenAPI spec
These endpoints now reject unknown or malformed query parameters with **422** instead of ignoring them:
* `/api/v2/validators/stability`, `/api/v2/validators/stability/counters`
* `state_filter` must match `active|probation|inactive` (comma-separated). It is now **case-sensitive**; `ACTIVE` used to work and now returns 422.
* `sort` β `state|address_hash|blocks_validated`, `order` β `asc|desc`.
* `/api/v2/zksync/batches`, `/batches/count`, `/batches/{number}`, `/main-page/zksync/batches/confirmed`, `/latest-number`.
### 7. π΄ `recaptcha_response` query parameter removed from NFT metadata refetch
`PATCH /api/v2/tokens/{hash}/instances/{id}/refetch-metadata` no longer declares `recaptcha_response` as a query parameter, so `?recaptcha_response=β¦` now returns **422 Unexpected field**. Pass the reCAPTCHA token in the `recaptcha-v2-response` or `recaptcha-v3-response` header instead (both already worked in v11), or use the `recaptcha-bypass-token` header / `scoped_recaptcha_bypass_token` query parameter for trusted clients.
### 8. π΄ Constructor arguments are `0x`-prefixed
`constructor_args` in `GET /api/v2/smart-contracts/{hash}` (also `ConstructorArguments` in `?module=contract&action=getsourcecode`, GraphQL `smart_contract.constructor_arguments`, and `/api/v1/verified_smart_contracts`) now returns `0xβ¦` instead of bare hex. Stored values that were not valid hex are cleared to `null` by the migration. On verification input, non-hex constructor arguments are now rejected.
### 9. π΅ Search returns ENS results for bare names
BENS lookup used to require a dotted name (`name.eth`). It now runs for any query of 3+ characters, so `/api/v2/search`, `/search/quick` can return `ens_domain` items for `vitalik`, and `/search/check-redirect?q=vitalik` may return `redirect: true` with `type: "ens_domain"` (new enum value). When a query matches both an address and an ENS name, the address still takes priority in `check-redirect`.
### 10. π΅ `tabs-counters`
For unknown addresses, `celo_election_rewards_count` and `beacon_deposits_count` are emitted only on Celo / Ethereum chain types respectively (previously on all chains as `0`). Token-related counters now exclude scam tokens unless the `show-scam-tokens` header or the `show_scam_tokens` cookie is set.
### 11. π΅ Transaction summary may return 503 - Behavior
`GET /api/v2/transactions/{hash}/summary` returns `503 {"error": "Transaction data is temporarily unavailable"}` when the logs table lock cannot be acquired within `API_OPTIONAL_QUERIES_LOCK_TIMEOUT` (default 100 ms). Retry with backoff.
***
## JSON RPC API (`/api?module=β¦`)
### 12. π΄`getsourcecode` and `gettxinfo`
* `ConstructorArguments` is `0x`-prefixed (see item 8).
* `gettxinfo` `next_page_params` no longer contains `items_count` (see item 1).
### 13. π΅ Sourcify verification via Sourcify API v2
`?module=contract&action=verify_via_sourcify` and `POST /api/v2/smart-contracts/{hash}/verification/via/sourcify`:
* Request parameters and success responses are unchanged.
* The uploaded file set **must include a file named `metadata.json`**, otherwise the request fails with `Sourcify did not return metadata`.
* Blockscout submits the job and polls Sourcify (`SOURCIFY_POLL_INTERVAL` 3 s Γ `SOURCIFY_POLL_MAX_ATTEMPTS` 20). A synchronous call may block for a minute or more and can end with `Sourcify verification timed out` or `Contract is not verified`.
* Upstream error text now comes from Sourcify v2 `message` fields.
* `AdditionalSources[].Filename` for contracts verified after the upgrade are relative paths prefixed with `/` rather than absolute repository paths.
***
## ETH RPC API (`/api/eth-rpc`)
### 14. π΄ Error responses follow JSON-RPC 2.0
Before: `{"jsonrpc":"2.0","id":1,"error":"invalid block number"}` After: `{"jsonrpc":"2.0","id":1,"error":{"code":-32602,"message":"Invalid block number"}}`
Codes: `-32600` invalid request, `-32601` method not found, `-32602` invalid params, `-32603` internal/upstream error.
| Old message | New message |
| - | - |
| `Action not found.` | `Method not found.` |
| `Incorrect number of params.` | `Incorrect number of params` |
| `id is a required field` | `Id is a required field` |
| `Invalid Block Hash` | `Invalid block hash` |
| `invalid block number` | `Invalid block number` |
| `Something went wrong.` | `Something went wrong` |
A request with `params` but without `jsonrpc` now returns -32600 `Method, and jsonrpc are required parameters.`
In batched requests, a JSON-RPC error object returned by the node for an individual proxied request is now passed through as-is (including its optional `data` field) instead of being reported as an internal error.
### 15. π΄`eth_getLogs` block parameters must be hex quantities or tags
`"fromBlock": "100"` used to be silently parsed as hex (block 256). It now returns -32602 `Invalid block number`. Use `"0x64"`, `"latest"`, `"earliest"`, `"pending"`.
### 16. π΅ Core proxy methods can be disabled by the operator
With `API_ETH_RPC_DISABLE_CORE_PROXY_METHODS=true`, `eth_call`, `eth_getCode`, `eth_getStorageAt`, `eth_sendRawTransaction`, `eth_getBlockByNumber/Hash`, `eth_estimateGas`, `eth_getTransactionCount` return -32601. Default is `false`. `API_ETH_RPC_EXTENDED_PROXY_METHODS_ENABLED=true` (default `false`) adds `net_*`, `web3_*`, `eth_feeHistory`, `eth_getProof`, `eth_getBlockReceipts` and others.
### 17. π΄ `/api/legacy` GET routes removed, dedicated POST routes added
| Removed | Replacement |
| - | - |
| `GET /api/legacy/logs/get-logs` (Etherscan-style `{status, message, result}` envelope) | `POST /api/legacy/eth/eth-get-logs` with a JSON-RPC body; returns a JSON-RPC envelope |
| `GET /api/legacy/block/eth-block-number` | `POST /api/legacy/eth/eth-block-number` with a JSON-RPC body |
`GET /api/legacy/block/get-block-number-by-time` is unchanged. Also added: `POST /api/legacy/eth/eth-call`, `/eth-get-balance`, `/eth-get-storage-at`, `/eth-send-raw-transaction`. Each of them is a single-method entry point equivalent to the same method on `/api/eth-rpc`, and follows the same availability rules (item 16).
***
## GraphQL API
### 18. π΅ Scam-token filtering
`token_transfers` (by token and by address) exclude scam-flagged tokens when the instance runs with `HIDE_SCAM_ADDRESSES=true`. Send the `show-scam-tokens` header or the `show_scam_tokens` cookie to include them. No schema fields were removed or renamed. `constructor_arguments` is `0x`-prefixed (item 8).
***
## π’ Additive changes (no action needed)
* `meta: {status: 1|2, message}` on every internal-transactions list response (`status: 2` = some internal transactions still pending).
* `include_zero_value` (default `true`) on internal-transactions endpoints.
* `decoded.abi` (the matching event ABI item) on log items.
* `image_media_type`, `animation_media_type` on token instances; `GET /api/v2/tokens/{hash}/instances/{id}/media-type`.
* `POST /api/v2/tokens/batch`; `GET /api/v2/tokens/{hash}/transfers/csv`.
* CSV endpoints accept `Accept: text/csv` without a 406; `from_period`/`to_period` optional for address CSV exports.
* ENS names and metadata on `from`/`to` in advanced filters and on NFT owners.
* `bzz://` metadata URLs resolved via Swarm gateway.
* WebSocket `coin_balance` events now carry `transaction_hash` (was always `null`).
# API for AI Agents
Source: https://docs.blockscout.com/devs/api-for-ai-agents
Give AI agents structured onchain data across 100+ EVM chains with Blockscout PRO API and MCP server for decoded transactions and metadata.
# Onchain Data via Blockscout PRO API & MCP
Give your AI agents access to structured blockchain data across 100+ EVM chains. No custom integration required.
## Why AI Agents Need Blockscout
AI agents operating onchain need reliable, structured data β not raw RPC responses they have to parse and interpret. Blockscout PRO API provides decoded transaction data, token metadata, contract context, and enriched address information in a format agents can work with immediately.
The Blockscout MCP (Model Context Protocol) server takes this further by providing a standardized interface that LLM-based agents can use natively, with multichain support built in.
## Two Integration Paths
### Path 1: MCP Server (for LLM agents)
The Blockscout MCP server gives AI assistants and coding agents direct access to onchain data through a standardized tool interface.
[β Blockscout MCP Info](/devs/mcp-server)
**Supported platforms:**
* Claude Desktop
* Claude Code
* OpenAI Codex
* Google Gemini
* Any MCP-compatible agent framework
**Setup is copy-paste.** Visit the [Blockscout AI Skills Portal](https://www.blockscout.com/agents) for platform-specific instructions.
**Capabilities include:**
* Query address balances and transaction history across chains
* Inspect smart contract source code and ABIs
* Look up token metadata and transfers
* Analyze transaction details with decoded input data
* Retrieve block information and chain statistics
Multichain support is automatic: agents specify a `chain_id` parameter and the MCP server routes to the correct Blockscout instance.
### Path 2: REST API (for custom agent backends)
For agents with custom backends or automation pipelines, the PRO API provides direct HTTP access to the same data. One key, one base URL, and a `chain_id` parameter to move between chains:
```python theme={null}
import requests
API_KEY = "your_blockscout_pro_key"
BASE = "https://api.blockscout.com/v2/api"
CHAIN_ID = "1" # Ethereum mainnet β swap for any supported chain, e.g. "8453" for Base
def get_address_activity(address, chain_id=CHAIN_ID):
"""Get recent transactions for an address β useful for agent monitoring."""
resp = requests.get(BASE, params={
"chain_id": chain_id,
"module": "account",
"action": "txlist",
"address": address,
"sort": "desc",
"apikey": API_KEY
})
return resp.json()["result"]
def get_contract_abi(contract_address, chain_id=CHAIN_ID):
"""Retrieve ABI for a verified contract β lets agents interact with contracts."""
resp = requests.get(BASE, params={
"chain_id": chain_id,
"module": "contract",
"action": "getabi",
"address": contract_address,
"apikey": API_KEY
})
return resp.json()["result"]
```
## Agent Use Cases
**Monitoring & Alerting** β Agents that watch wallet activity, contract events, or token flows and trigger actions based on onchain conditions.
**Portfolio & Wallet Agents** β Conversational agents that report balances, transaction history, and token holdings across multiple chains.
**Contract Analysis** β Agents that inspect verified source code, read contract state, and explain contract behavior to users.
**Onchain Research** β Agents that investigate addresses, trace transaction flows, and compile cross-chain activity reports.
**DeFi Automation** β Agents that monitor liquidity positions, track gas costs, and execute strategies based on real-time chain data.
## Pricing for Agent Workloads
Agents tend to make high-frequency API calls. Blockscout's credit-based pricing is designed for this pattern β you pay for actual usage, not a fixed call count.
| Tier | RPS | Monthly Credits | Best For |
| - | - | - | - |
| Free | 5 | 100K/day | Development & testing |
| Builder (\$49/mo) | 15 | 100M | Single-agent production |
| Pro (\$199/mo) | 30 | 500M | Multi-agent or high-frequency |
| Enterprise | Custom | Custom | Fleet deployments |
## Get Started
1. **For MCP agents:** Visit [blockscout.com/agents](https://www.blockscout.com/agents) and copy the setup instructions for your platform
2. **For custom agents:** Get a free API key at [dev.blockscout.com](https://dev.blockscout.com)
3. **Need help?** Join the [Blockscout Discord](https://discord.gg/blockscout) β the dev team is active and responsive
**β [AI Skills Portal](https://www.blockscout.com/agents)** Β· **β [PRO API Portal](https://dev.blockscout.com)** Β· **β [MCP Documentation](/devs/mcp-server)**
# Blockscout APIs
Source: https://docs.blockscout.com/devs/apis
Overview of Blockscout APIs, including the multichain PRO API, REST, JSON-RPC, ETH-compatible RPC, and GraphQL endpoints for EVM chain data.
## Blockscout API Usage
Our Universal PRO API is now available, and per-instance API support has been deprecated. Please go to [https://dev.blockscout.com/](https://dev.blockscout.com/) to get an API key and start exploring.
Note: Your old MyAccount API keys and prior routes will not work with the new PRO API. [Get a new key](https://dev.blockscout.com/) and [update your routes](/devs/pro-api).
Blockscout v12.0.0 will be released on 7 October, 2026 and roll out to hosted instances in a gradual fashion. It includes breaking changes for API integrators. Please see the [v12.0.0 release page](/blockscout-v12-0-0-api-updates-and-breaking-changes) for details.
API Overview, Routes, Plans and Credits
Port over seamlessly and get more calls for less \$\$
Use the Dev Portal to enhance your API experience.
Example apps and agent flows
Agents should visit [https://agents.blockscout.com/](https://agents.blockscout.com/) to set up optimized data workstreams
# Blockscout APIs
Source: https://docs.blockscout.com/devs/apis-redirect
Entry point to Blockscout API documentation covering the REST API, JSON RPC endpoints, GraphQL queries, and WebSocket event subscriptions.
# Autoscout API
Source: https://docs.blockscout.com/devs/apis/autoscout-api
Programmatic API for creating and managing Autoscout explorer instances, with endpoints for deployment, configuration, and lifecycle control.
An API is available for those running multiple explorers or users who prefer a programmatic approach to Autoscout management.
* You will need a valid API key to use the API β `https://deploy.blockscout.com/api-keys`
* **API Base URL**: The base URL for the Autoscout API is `https://autoscout.services.blockscout.com`.
The Autoscout API swagger file with all endpoints and usage notes is available at [https://blockscout.github.io/swaggers/services/autoscout/main/index.html](https://blockscout.github.io/swaggers/services/autoscout/main/index.html). Here you will find setup options for flashblocks, interop and other available services.
# Create an Instance
Send a POST request to the `/api/v1/instances` endpoint with the required configuration.
```text Request Headers theme={null}
x-api-key: YOUR_API_KEY
Content-Type: application/json
```
```json Request Body theme={null}
{
"name": "MyInstance",
"config": {
"rpc_url": "https://your-rpc-url",
"server_size": "small",
"chain_type": "arbitrum",
"node_type": null,
"chain_id": "1111",
"token_symbol": "ETH",
"instance_url": null,
"logo_url": "https://eth-sepolia.blockscout.com/assets/network_logo.png",
"chain_name": "Ethereum mainnet",
"icon_url": "https://eth-sepolia.blockscout.com/assets/network_icon.png",
"homeplate_background": null,
"homeplate_text_color": null}
}
```
```shellscript curl example theme={null}
curl -X POST https://autoscout.services.blockscout.com/api/v1/instances \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "MyInstance",
"config": {
"rpc_url": "https://your-rpc-url",
"server_size": "small",
"chain_type": "arbitrum",
"node_type": null,
"chain_id": "2039",
"token_symbol": "ETH",
"instance_url": null,
"logo_url": "https://assets.alephzero.org/branding/logo/digital/A0-horizontal-black.svg",
"chain_name": "Aleph Zero",
"icon_url": "https://assets.alephzero.org/branding/logo/digital/A0-mark-black.svg",
"homeplate_background": null,
"homeplate_text_color": null
}
```
```json Response theme={null}
{
"instance_id": "your-instance-id"
}
```
## Start Instance
Send a POST request to `/api/v1/instances/{instance_id}/status:update`.
Use the instance id returned in the previous step.
```text Request Headers theme={null}
x-api-key: YOUR_API_KEY
Content-Type: application/json
```
```json Request Body theme={null}
{
"action": "START"
}
```
```shellscript curl Example theme={null}
curl -X POST https://autoscout.services.blockscout.com/api/v1/instances/your-instance-id/status:update \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"action": "START"
}'
```
```json Response theme={null}
{
"status": "QUEUED",
"deployment_id": "your-deployment-id"
}
```
## Check Deployment Status
Send a GET request to the `/api/v1/instances/{instance_id}/deployments/current` endpoint.
```text Header theme={null}
x-api-key: YOUR_API_KEY
```
```shellscript curl Example theme={null}
curl -X GET https://autoscout.services.blockscout.com/api/v1/instances/your-instance-id/deployments/current \
-H "x-api-key: YOUR_API_KEY"
```
```json Response Example theme={null}
{
"deployment_id": "your-deployment-id",
"instance_id": "your-instance-id",
"status": "RUNNING",
"error": null,
"created_at": "2023-05-15T10:00:00Z",
"started_at": "2023-05-15T10:05:00Z",
"finished_at": "2023-05-15T10:10:00Z",
"config": {
"rpc_url": "https://your-rpc-url",
"server_size": "small",
"chain_type": "arbitrum",
"node_type": null,
"chain_id": "1",
"token_symbol": "ETH",
"instance_url": null,
"logo_url": null,
"chain_name": "Ethereum Mainnet",
"icon_url": null,
"homeplate_background": null,
"homeplate_text_color": null
},
"blockscout_url": "https://ethereum.k8s-dev.blockscout.com",
"config_state_hash": "3b074908112184441603753a593d011f484e2651338ccab845623566e247fc73",
"total_cost": "0",
"health_status": {
"ok": true,
"last_check": "2024-08-28 13:47:30.059786256 +00:00",
"http_code": 200,
"error_description": null,
"response": {
"healthy": true,
"data": {
"cache_latest_block_inserted_at": "2024-08-28 13:47:28.000000Z",
"latest_block_inserted_at": "2024-08-28 13:47:28.000000Z",
"cache_latest_block_number": "4308104",
"latest_block_number": "4308104"
}
}
},
"indexing_status": {
"finished_indexing": false,
"finished_indexing_blocks": false,
"indexed_blocks_ratio": "0.09",
"indexed_internal_transactions_ratio": null
}
}
```
# Update an Instance
1. Send a PATCH request to the `/api/v1/instances/{instance_id}/config` endpoint with the config changes.
```text Headers theme={null}
x-api-key: YOUR_API_KEY
Content-Type: application/json
```
```json Body Example theme={null}
{
"config": {
"rpc_url": "https://new-rpc-url",
"server_size": "medium"
}
}
```
```json curl Example theme={null}
curl -X PATCH https://autoscout.services.blockscout.com/api/v1/instances/your-instance-id/config \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"config": {
"rpc_url": "https://new-rpc-url",
"server_size": "medium"
}
}'
```
2. Restart the instance by sending a POST request to the `/api/v1/instances/{instance_id}/status:update` endpoint with the action "RESTART".
```text Headers theme={null}
x-api-key: YOUR_API_KEY
Content-Type: application/json
```
```json Body theme={null}
{
"action": "RESTART"
}
```
```json curl Example theme={null}
curl -X POST https://autoscout.services.blockscout.com/api/v1/instances/your-instance-id/status:update \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"action": "RESTART"
}'
```
```json Response theme={null}
{
"status": "QUEUED",
"deployment_id": "your-deployment-id"
}
```
# Stop an Instance
Send a POST request to the `/api/v1/instances/{instance_id}/status:update` endpoint with the action "STOP".
**Important Note**: Stopping an instance will result in all data being deleted. Ensure that you have backed up any necessary data before stopping the instance.
```text Header theme={null}
x-api-key: YOUR_API_KEY
Content-Type: application/json
```
```json Body theme={null}
{
"action": "STOP"
}
```
```json curl Example theme={null}
curl -X POST https://autoscout.services.blockscout.com/api/v1/instances/your-instance-id/status:update \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"action": "STOP"
}'
```
```json Response theme={null}
{
"status": "QUEUED",
"deployment_id": "your-deployment-id"
}
```
# Swagger Hub
Source: https://docs.blockscout.com/devs/apis/swagger-hub
Access Swagger and OpenAPI specifications for Blockscout services and microservices, with browseable interfaces at blockscout.github.io/swaggers.
Access API interfaces for various Blockscout services on our Swagger Hub at [https://blockscout.github.io/swaggers/](https://blockscout.github.io/swaggers/)
# WebSocket API
Source: https://docs.blockscout.com/devs/apis/websocket-api
Subscribe to real-time blockchain events like new blocks, transactions, and balance changes over a single multiplexed WebSocket connection.
## Connection
WebSockets allow you to monitor ongoing events on the blockchain. A single connection can hold up to 100 subscriptions across blocks, addresses, tokens, and more.
Connect to the Pro API WebSocket endpoint and authenticate with your API key using either of the following methods:
| Method | How | Works in browsers? |
| - | - | - |
| Query string | Append `?apikey=` to the URL | Yes |
| `Authorization` header | Send `Authorization: Bearer ` on the handshake request | No β browsers' native `WebSocket` API cannot set custom headers |
```text theme={null}
wss://api.blockscout.com/ws?apikey=
```
```text theme={null}
Authorization: Bearer
```
Use the query string if you're connecting from browser JavaScript. From a server-side or CLI client (Node, Python, etc.), either method works; the header can be preferable since query strings are more likely to end up captured in access logs, proxies, or browser history.
Keep API keys in environment variables or a secret manager either way. Do not hard-code or log them.
The connection uses plain JSON over WebSocket text frames. Max frame size is 16 KB.
### Quickstart
This example connects, subscribes to new Ethereum Mainnet blocks, and handles both the subscription response and incoming events.
```js theme={null}
const apiKey = process.env.BLOCKSCOUT_API_KEY;
const chainId = "1";
const endpoint = "wss://api.blockscout.com/ws";
const socket = new WebSocket(endpoint + "?" + new URLSearchParams({ apikey: apiKey }));
socket.addEventListener("open", () => {
socket.send(JSON.stringify({
id: 1,
method: "subscribe",
params: {
topic: "blocks:new_block",
chain_id: chainId
}
}));
});
socket.addEventListener("message", ({ data }) => {
const message = JSON.parse(data);
// Response to a subscribe/unsubscribe/get_subscriptions call
if (message.id === 1) {
if (message.result === "ok") {
console.log("Subscribed");
} else if (message.error) {
console.error("Subscribe failed:", message.error);
}
return;
}
// A topic event
if (message.type === "event") {
console.log(message.topic, message.data.event, message.data.payload);
return;
}
// Server-pushed messages (see Server messages and Errors below)
if (message.type === "topic_closed" || message.type === "error") {
console.warn(message);
}
});
```
Using the `Authorization` header instead (Node.js, via the `ws` package):
```js theme={null}
import WebSocket from "ws";
const apiKey = process.env.BLOCKSCOUT_API_KEY;
const socket = new WebSocket("wss://api.blockscout.com/ws", {
headers: { Authorization: `Bearer ${apiKey}` }
});
```
Use a separate request `id` for each subscription. Reconnect with exponential backoff on close, and resend every `subscribe` request after reconnecting. The server does not persist subscriptions across connections.
Delivery is **at least once** β the same event can arrive more than once on a single subscription. Production clients should deduplicate incoming events; see [Production guidance](#production-guidance) below for recommended dedup keys and the full reconnect and delivery model.
## Message protocol
### Client β server
```json theme={null}
{
"id": 1,
"method": "subscribe",
"params": {
"topic": "blocks:new_block",
"chain_id": "1"
}
}
```
| Field | Notes |
| - | - |
| `id` | Integer chosen by the client. Echoed back in the server's response. |
| `params.topic` | Case-insensitive (lowercased on receipt). Max 256 bytes. |
| `params.chain_id` | String identifier mapping to a configured Blockscout instance. Max 32 bytes. |
### Server β client (response)
```json theme={null}
{"id": 1, "result": "ok"}
{"id": 1, "error": "unknown_chain"}
```
### Server β client (event)
```json theme={null}
{
"type": "event",
"topic": "blocks:new_block",
"chain_id": "1",
"data": {
"event": "new_block",
"payload": { }
}
}
```
The outer envelope (`type`, `topic`, `chain_id`) is added by Pro API. `data.event` and `data.payload` come directly from the upstream Blockscout instance.
## Methods
### `subscribe`
Join a topic on a chain and start receiving events.
**Params:** `topic`, `chain_id`
### `unsubscribe`
Leave a previously subscribed topic.
**Params:** `topic`, `chain_id`
### `get_subscriptions`
List all active subscriptions on this connection. No params required.
**Response:**
```json theme={null}
{
"id": 3,
"result": [
{ "chain_id": "1", "topic": "blocks:new_block" },
{ "chain_id": "137", "topic": "addresses:0xabc..." }
]
}
```
## Topics reference
Topics follow Blockscout's V2 Phoenix Channel naming.
### `blocks:*`
#### `blocks:new_block`
All new blocks on the chain as they are indexed.
| Event | Payload |
| - | - |
| `new_block` | `{ average_block_time: string (ms), block: Block }` |
The `block` object matches the [Blockscout V2 API block response](https://github.com/blockscout/blockscout/blob/master/apps/block_scout_web/lib/block_scout_web/views/api/v2/block_view.ex).
#### `blocks:{miner_address}`
Blocks produced by a specific miner or validator address.
| Event | Payload |
| - | - |
| `new_block` | Same as `blocks:new_block` |
#### `blocks:indexing`
Block indexing progress. Broadcasts periodically until the chain is fully indexed.
| Event | Payload |
| - | - |
| `index_status` | `{ ratio: string, finished: boolean }` |
#### `blocks:indexing_internal_transactions`
Internal transaction indexing progress.
| Event | Payload |
| - | - |
| `index_status` | `{ ratio: string, finished: boolean }` |
***
### `transactions:*`
The global topics (`new_transaction`, `new_pending_transaction`) broadcast only a count of new transactions per batch, not full transaction data. For full transaction payloads, subscribe to `addresses:{hash}` instead.
#### `transactions:new_transaction`
Fires when new confirmed transactions are indexed.
| Event | Payload |
| - | - |
| `transaction` | `{ transaction: number }` |
#### `transactions:new_pending_transaction`
Fires when new pending transactions appear in the mempool.
| Event | Payload |
| - | - |
| `pending_transaction` | `{ pending_transaction: number }` |
#### `transactions:{tx_hash}`
Updates for a specific transaction. Currently fires when the raw internal transaction trace becomes available.
| Event | Payload |
| - | - |
| `raw_trace` | `{ raw_trace: RawTrace }` |
***
### `addresses:*`
The richest channel. Receives balance updates, transactions, token transfers, and smart contract verification events for a specific address.
#### `addresses:{address_hash}`
| Event | Payload | Description |
| - | - | - |
| `balance` | `{ balance: string (wei), block_number: number, exchange_rate: string }` | Native coin balance changed |
| `coin_balance` | `{ coin_balance: CoinBalance }` | Detailed coin balance with delta |
| `current_coin_balance` | `{ coin_balance: string (wei), exchange_rate: string, block_number: number }` | |
| `token_balance` | `{ block_number: number }` | Any token balance changed |
| `updated_token_balances_erc_20` | `{ token_balances: [TokenBalance], overflow: boolean }` | |
| `updated_token_balances_erc_721` | `{ token_balances: [TokenBalance], overflow: boolean }` | |
| `updated_token_balances_erc_1155` | `{ token_balances: [TokenBalance], overflow: boolean }` | |
| `updated_token_balances_erc_404` | `{ token_balances: [TokenBalance], overflow: boolean }` | |
| `transaction` | `{ transactions: [Transaction] }` | Confirmed transaction involving this address |
| `pending_transaction` | `{ transactions: [Transaction] }` | |
| `token_transfer` | `{ token_transfers: [TokenTransfer] }` | Token transfer from/to this address |
| `verification_result` | `{ status: "success" }` or `{ status: "error", errors: object }` | |
| `fetched_bytecode` | `{ fetched_bytecode: string }` | |
| `changed_bytecode` | `{}` | Notification only |
| `smart_contract_was_verified` | `{}` | Notification only |
| `smart_contract_was_not_verified` | `{}` | Notification only |
| `eth_bytecode_db_lookup_started` | `{}` | Notification only |
***
### `tokens:*`
#### `tokens:{token_contract_address}`
Transfer activity and supply changes for a specific token contract.
| Event | Payload |
| - | - |
| `token_transfer` | `{ token_transfer: number }` (count only) |
| `total_supply` | `{ total_supply: string }` |
***
### `token_instances:*`
#### `token_instances:{token_contract_address}`
NFT metadata fetch results for instances of a token contract.
| Event | Payload |
| - | - |
| `fetched_token_instance_metadata` | `{ token_id: string, fetched_metadata: object }` |
| `not_fetched_token_instance_metadata` | `{ token_id: string, reason: string }` |
***
### `exchange_rate:*`
#### `exchange_rate:new_rate`
Native coin fiat exchange rate updates with recent market history.
| Event | Payload |
| - | - |
| `new_rate` | `{ exchange_rate: string, available_supply: string \| null, chart_data: [{ closing_price: string, date: string }] }` |
***
### `rewards:*`
#### `rewards:{validator_address}`
Block reward notifications for a validator. Only available on chains with emission funds enabled.
| Event | Payload |
| - | - |
| `new_reward` | `{ reward: 1 }` (notification only) |
***
### L2-specific topics
Only available when the upstream Blockscout instance is configured for the corresponding L2 chain type.
#### `arbitrum:new_batch`
New Arbitrum batches as they are confirmed.
| Event | Payload |
| - | - |
| `new_arbitrum_batch` | `{ batch: ArbitrumBatch }` |
#### `arbitrum:new_messages_to_rollup_amount`
| Event | Payload |
| - | - |
| `new_messages_to_rollup_amount` | `{ new_messages_to_rollup_amount: number }` |
#### `optimism:new_batch`
New Optimism batches.
| Event | Payload |
| - | - |
| `new_optimism_batch` | `{ batch: object }` |
#### `optimism:new_deposits`
| Event | Payload |
| - | - |
| `new_optimism_deposits` | `{ deposits: number }` |
## Production guidance
### Delivery semantics
Treat delivery as **at least once**, not exactly once. Live validation observed identical block and transaction events delivered more than once from a single subscription.
Recommended deduplication keys:
| Event type | Dedup key |
| - | - |
| Block | `chain_id + block.hash` |
| Transaction | `chain_id + transaction.hash` |
| Token transfer | `chain_id + transaction_hash + log_index` |
### Reconnect and recovery
A production client should:
1. Reconnect with exponential backoff.
2. Restore every subscription after reconnecting. The server does not persist subscriptions across connections.
3. Persist the last processed block or timestamp.
4. Use REST endpoints to recover activity missed during downtime.
5. Treat WebSocket events as real-time notifications, separate from confirmation and finality.
### Validation checklist
Before acting on an event, validate:
* `type` is `event`.
* `topic` matches an active subscription.
* `chain_id` matches the requested chain.
* `data.event` is expected for that topic.
* Required identifiers are present.
* The event has not already been processed (see dedup keys above).
## Limits
| Parameter | Value |
| - | - |
| Connections per user | 5 |
| Subscriptions per connection | 100 |
| Max frame size | 16 KB |
| Max topic length | 256 bytes |
| Max chain\_id length | 32 bytes |
### Billing
| Parameter | Value |
| - | - |
| Connection open cost | 100 credits |
| Cost per message | 10 credits |
| Idle timeout | 60s |
Free-tier and admin-managed users are disconnected when credits run out. Paid users may continue into overage.
## Server messages
In addition to events and responses, the server may push these message types.
### Topic closed
```json theme={null}
{"type": "topic_closed", "topic": "blocks:new_block", "chain_id": "1"}
```
Sent when the upstream Blockscout channel closes a topic. The subscription is automatically removed; there is no need to unsubscribe.
### Error
```json theme={null}
{"type": "error", "error": "insufficient_credits"}
```
A connection-level error. The server closes the WebSocket shortly after sending this.
## Errors
### Connection errors
| Error | Description |
| - | - |
| `unauthorized` | Invalid or missing API key |
| `insufficient_credits` | Not enough credits to open a connection |
| `connection_limit_reached` | Too many concurrent connections for this user |
| `service_restart` | Server is restarting. Reconnect after a brief delay |
### Subscribe errors
| Error | Description |
| - | - |
| `unknown_chain` | The `chain_id` is not configured on the server |
| `subscription_limit_reached` | Connection has too many active subscriptions |
| `already_subscribed` | \*not returned as an error, but as a successful call with no result `{"id": 2, "result": "already_subscribed"}` |
| `worker_unavailable` | Upstream connection to this chain is not ready |
### Unsubscribe errors
| Error | Description |
| - | - |
| `not_subscribed` | Not currently subscribed to this topic and chain combination |
# Blockscout Software Licence
Source: https://docs.blockscout.com/devs/blockscout-license
Overview of the source-available licence adopted in Blockscout v11.0.0, covering permitted use for self-hosted explorers, chains, and resellers.
Beginning with the [v11.0.0 release](https://github.com/blockscout/blockscout/releases/tag/v11.0.0) Blockscout has adopted a new [source-available licence](https://github.com/blockscout/blockscout/blob/master/LICENSE). The licence continues to allow standalone projects and chains to download, run, and modify Blockscout for free, and self-hosted explorers are unaffected.\
\
**The update only impacts Blockscout resellers who want to resell Blockscout as a paid service** (hosted explorers, managed offerings, RaaS platforms, anything where customers pay another provider for functionality powered by Blockscout). **These projects now need a Commercial Licence**.
Any interface built on Blockscout also must show a clear "Powered by Blockscout" credit linking to [blockscout.com](http://blockscout.com).
# **Frequently Asked Questions**
*Last Updated: April 2026*
*Applies to: Blockscout Software Licence v1.0 (April 22 2026)*
## **General Questions**
### **Can I still self-host Blockscout for my own chain?**
Yes. The licence grants you the right to download, deploy, use, copy, modify, and create Derivative Works of the Software. If you are running Blockscout as a block explorer for your own chain and not charging others to access it, you do not need a Commercial Licence.
### **Do I need a Commercial Licence if I donβt charge anyone to use the explorer?**
No. The Commercial Licence requirement is triggered when you sell, license, monetise, or otherwise make the Software available to a third party in exchange for a fee or other consideration. If you are running Blockscout as a free, public-facing explorer for your own project or chain, the licence covers your use.
### **Can I modify the Blockscout UI or add custom features for my own chain?**
Yes. You are free to create Derivative Works (modifications, custom modules, UI changes, etc.) and deploy them on your own chain. The restriction on Derivative Works applies to *distribution* β you may not distribute, sublicense, or offer your modifications to other parties for a fee without a Commercial Licence. Using your modified version on your own chain is permitted.
### **If I modify the Software, do I still need to display the Blockscout attribution?**
Yes. Regardless of any modifications you make, the licence requires that any user interface powered by the Software includes clear and prominent attribution to Blockscout. This must include the βBlockscoutβ brand name (e.g., βPowered by Blockscoutβ), a link to [blockscout.com](http://blockscout.com), and any branding or notices provided by Blockscout, matching the format displayed in the footer of [eth.blockscout.com](http://eth.blockscout.com).
### **Can I fork Blockscout and distribute it under a different name?**
No. The licence prohibits distributing the Software or Derivative Works under any name or branding that is identical or confusingly similar to Blockscoutβs marks, or that could cause confusion about origin or endorsement. Additionally, distribution of Derivative Works to third parties requires a Commercial Licence, regardless of branding.
### **Does this licence apply to older versions of Blockscout I already have deployed?**
No. The licence applies solely to the version of the Software distributed under it. Prior versions (βPrior Softwareβ) released before **April 22, 2026 and** distributed under GPL v3.0 are not affected by this licence. However, any new version you download after the Effective Date will be governed by this licence.
### **What versions are covered under the new licence?**
All versions moving forward, starting from backend v11.0+ and frontend v2.8. These versions are effective from April 22, 2026.
Versions up to v10.2.0 and frontend v2.7.1 were released under GPL v3.0 and are not affected by this licence.Β
## **Commercial Licence**
### **When do I need a Commercial Licence?**
A Commercial Licence is required if you intend to sell, license, monetise, or commercially make the Software available to any third party in exchange for fees or consideration. This includes, but is not limited to:
* Hosting Blockscout for third parties as a paid service
* Offering the Software on a SaaS, RaaS, or managed-service basis
* Bundling Blockscout into a commercial product or platform
* Charging for support, consulting, implementation, customisation, or maintenance services that depend on the Software
* Distributing Derivative Works to third parties
### **How do I obtain a Commercial Licence?**
Contact Blockscout directly at [eaas.blockscout.com/#contact](https://eaas.blockscout.com/?utm_source=multichain-search\&utm_medium=header#contact) to discuss pricing and terms. Any commercial use is unauthorised until a Commercial Licence has been expressly agreed in writing. Blockscout is not obligated to grant a Commercial Licence.Β
## **RaaS Providers**
### **Iβm a RaaS provider and bundle Blockscout as the default explorer for chains I deploy. Do I need a Commercial Licence?**
Yes, for backend versions v11.0+ and frontend version v2.8.0+. The licence explicitly covers offerings made on a βhosted, as-a-service, or managed basis.β Providing Blockscout as part of a Rollup-as-a-Service or chain deployment offering requires a Commercial Licence, regardless of whether the explorer is itemised separately or bundled into a broader platform fee.
### **What if I donβt charge separately for the explorer?**
A Commercial Licence is still required. The restriction covers direct and indirect monetisation. If the explorer is included as part of a paid chain deployment or platform service, the Software is being made available in exchange for consideration, even if there is no separate line item for the explorer.
### **What if Blockscout is just one component of a larger platform I offer?**
A Commercial Licence is still required. The licence applies wherever your product or service βincorporates, uses, depends on, or is materially enabled by the Software.β If Blockscout is a component of your commercial offering, the restriction applies.
### **Can I offer Blockscout to my customers under my own brand?**
No. You must maintain the required Blockscout attribution on all user interfaces, and you may not distribute the Software or Derivative Works under branding that is confusingly similar to Blockscoutβs or that could suggest endorsement or affiliation. Your customersβ explorers must display the βPowered by Blockscoutβ attribution.
### **What if my customer self-hosts Blockscout and I only help configure it?**
Consulting, implementation, and customisation services that depend on the Software are explicitly listed as uses requiring a Commercial Licence when provided in exchange for fees. If you are being paid to configure, deploy, or maintain Blockscout for a customer, contact us to discuss a Commercial Licence.
### **If I already have chains running Blockscout under the old GPL licence, are those grandfathered?**
Prior versions of the Software distributed under the GPL v3.0 are governed by their original licence terms. However, any new version (backend v11.0+ and frontend v2.8.0+) you download or deploy will be subject to this licence. If you update your deployments to a version covered by this licence, the new terms will apply.
### **Why should I upgrade to the new licence if older instances are running well in my RaaS environment?**
New Blockscout versions will include new and upgraded features, updated EIP support, and optimisations for speed and storage. Blockscout also provides technical support for newer versions (there is no technical support available for older versions). Blockscout offers no guarantees that previous versions of the software will continue to run properly.
## **Derivative Works**
### **What qualifies as a Derivative Work?**
A Derivative Work is any work based on or derived from the Software in which modifications (revisions, additions, deletions, annotations, etc.) constitute an original work of authorship. Works that remain separable from or merely link to the Software are not considered Derivative Works.
### **Can I create and deploy Derivative Works?**
Yes, for your own use. You may create Derivative Works and deploy them on your own chain or for your own internal purposes. You do not need a Commercial Licence to run a modified version of Blockscout on your own chain.
### **Can I distribute my Derivative Works to others?**
No β not without a Commercial Licence. You may not distribute, sublicense, sell, or make available any Derivative Works to third parties without first obtaining a Commercial Licence from Blockscout.
### **Does Blockscout have rights to my Derivative Works?**
Yes. By creating Derivative Works, you grant Blockscout a perpetual, irrevocable, worldwide, royalty-free licence to use, reproduce, modify, incorporate, and otherwise exploit your Derivative Works for any purpose, including to develop, improve, or distribute the Software.
## **Termination and Breach**
### **What happens if I breach the licence?**
The licence terminates automatically and immediately upon any breach. There is no cure period. Upon termination, you must cease all use of the Software, delete all copies, and stop distributing any Derivative Works.
### **If my Commercial Licence is terminated, what happens to chains Iβve already deployed?**
Upon termination, all rights under both the base licence and any Commercial Licence cease immediately. You must stop using the Software, uninstall it from all systems under your control, and destroy all copies β including copies held by your contractors or service providers. There is no grace period or wind-down provision in the base licence. If continuity is important to your business, we recommend addressing this in your Commercial Licence terms.
## **Legal and Disputes**
### **What law governs this licence?**
The licence is governed by the laws of England and Wales.
### **How are disputes resolved?**
Parties must first attempt to resolve disputes informally by contacting [community@blockscout.com](mailto:community@blockscout.com). If unresolved after 30 days, disputes are referred to binding arbitration under LCIA Rules in London. Claims may only be brought individually, class or collective actions are not permitted.
### **What is the liability cap?**
To the maximum extent permitted by law, Blockscoutβs total liability is capped at the amount you paid under the licence in the 12 months preceding the claim, or USD \$100 if no payments were made.
## **Transition from GPL**
### **Blockscout was previously licensed under the GPL. What changed?**
The Blockscout Software Licence replaces the GPL for all new versions of the Software distributed from April 26 onward. The key differences are:
* **Commercial use:** The GPL permitted unrestricted commercial use including SaaS and RaaS. The new licence requires a Commercial Licence for commercial or monetised use.
* **Distribution of modifications:** Under the GPL, you could distribute modified versions provided you shared the source under the GPL. Under the new licence, distribution of Derivative Works to third parties requires a Commercial Licence.
* **Copyleft:** The GPL required derivative works to be licensed under the GPL. The new licence does not impose copyleft, instead, it prohibits third-party distribution entirely without a Commercial Licence.
* **Licensor rights:** Under the GPL, the project had no special rights to your modifications. Under the new licence, you grant Blockscout a perpetual, irrevocable licence to use your Derivative Works.
* **Attribution:** The GPL required preserving copyright notices. The new licence adds a mandatory, prominent UI attribution requirement (βPowered by Blockscoutβ).
* **Termination:** GPL v3 includes a 30-day cure period for breach. The new licence terminates automatically on breach. The Licensor can also terminate at any time at its sole discretion.
* **SaaS / RaaS:** The GPL did not restrict RaaS and SaaS resellers. The new licence explicitly closes this by requiring a Commercial Licence for any managed or as-a-service offering.
* **Licence updates:** Under the GPL, you could choose which version of the GPL to comply with. Under the new licence, continued use of the Software after a licence update constitutes acceptance of the new terms.
## **Contact**
For questions about the licence, Commercial Licence enquiries, or compliance:
**Commercial Licence:** [eaas.blockscout.com/#contact](https://eaas.blockscout.com/?utm_source=multichain-search\&utm_medium=header#contact)
**General enquiries:** [community@blockscout.com](mailto:community@blockscout.com)
# Blockscout SDK
Source: https://docs.blockscout.com/devs/blockscout-sdk
React SDK for integrating Blockscout transaction notifications and history into dApps with real-time updates and mobile-responsive design.
Add the Blockscout SDK into your app to provide interactivity and instant explorer feedback to your users.
Note: The Blockscout SDK is currently in beta release. Please report any issues on the [Blockscout Discord](https://discord.gg/blockscout).
## Overview
The Blockscout App SDK is a React toolkit designed to integrate Blockscout transaction notifications and transaction history into your decentralized applications (dApps). It provides an easy-to-use interface for displaying transaction status updates and viewing transaction history with real-time updates and mobile-responsive design.
* Repo: [https://github.com/blockscout/app-sdk](https://github.com/blockscout/app-sdk)
* NPM Package [https://www.npmjs.com/package/@blockscout/app-sdk](https://www.npmjs.com/package/@blockscout/app-sdk)
### Key Features
* **Transaction Toast Notifications** - Real-time transaction status updates with pending, success, and error states
* **Transaction History Popup** - View recent transactions for specific addresses or entire chains
* **Transaction Interpretation** - Detailed transaction summaries and interpretations
* **Multi-chain Support** - Compatible with any blockchain that has a Blockscout explorer instance
* **Mobile-responsive Design** - Optimized for both desktop and mobile experiences
### Installation
Install the SDK using npm or yarn:
```sh theme={null}
npm install @blockscout/app-sdk
# or
yarn add @blockscout/app-sdk
```
### Transaction Toast Notifications
The transaction toast feature provides real-time notifications for transaction status updates, showing pending, success, and error states with detailed transaction information.
#### Setup
Wrap your application with the `NotificationProvider`:
```javascript theme={null}
import { NotificationProvider } from "@blockscout/app-sdk";
function App() {
return (
);
}
```
#### Usage
Use the `useNotification` hook to display transaction toasts:
```javascript theme={null}
import { useNotification } from "@blockscout/app-sdk";
function YourComponent() {
const { openTxToast } = useNotification();
const handleTransaction = async (txHash) => {
try {
// Your transaction logic here
await sendTransaction();
// Show transaction toast
openTxToast("1", txHash); // '1' is the chain ID for Ethereum mainnet
} catch (error) {
console.error("Transaction failed:", error);
}
};
return (
);
}
```
#### Toast Features
* Real-time status updates (pending, success, error)
* Transaction interpretation and summaries
* Links to block explorer
* Automatic status polling
* Error handling with revert reasons
### Transaction History Popup
The transaction history popup allows users to view recent transactions for a specific address or all transactions on a chain.
#### Setup
Wrap your application with the `TransactionPopupProvider`:
```javascript theme={null}
import { TransactionPopupProvider } from "@blockscout/app-sdk";
function App() {
return (
);
}
```
#### Usage
Use the `useTransactionPopup` hook to open transaction history:
```javascript theme={null}
import { useTransactionPopup } from "@blockscout/app-sdk";
function YourComponent() {
const { openPopup } = useTransactionPopup();
// Show transactions for a specific address
const showAddressTransactions = () => {
openPopup({
chainId: "1", // Ethereum mainnet
address: "0x123...", // Optional: specific address
});
};
// Show all transactions for a chain
const showAllTransactions = () => {
openPopup({
chainId: "1", // Ethereum mainnet
});
};
return (
);
}
```
#### Popup Features
* View recent transactions
* Filter by address
* Transaction status indicators
* Transaction interpretation
* Links to block explorer
* Mobile-responsive design
* Loading states and error handling
### Supported Chains
The SDK is compatible with any blockchain that has a Blockscout explorer instance with API v2 support.
* Chains are listed in [Chainscout](https://chains.blockscout.com/).
* Chain IDs can be retrieved from [https://github.com/blockscout/chainscout/blob/main/data/chains.json](https://github.com/blockscout/chainscout/blob/main/data/chains.json)
* To verify if your target chain ID is supported, visit the [compatibility checker](https://sdk-compatibility.blockscout.com/).
#### Common Supported Chain IDs
* `1` - Ethereum Mainnet
* `137` - Polygon Mainnet
* `42161` - Arbitrum One
* `10` - Optimism
### API Reference
#### useNotification Hook
```js theme={null}
const { openTxToast } = useNotification();
// Open a transaction toast
openTxToast(chainId: string, hash: string): Promise
```
#### useTransactionPopup Hook
```js theme={null}
const { openPopup } = useTransactionPopup();
// Open transaction popup
openPopup(options: {
chainId: string;
address?: string;
}): void
```
### Complete Integration Example
Here's a complete example showing how to integrate both features:
```javascript theme={null}
import React from 'react';
import {
NotificationProvider,
TransactionPopupProvider,
useNotification,
useTransactionPopup
} from "@blockscout/app-sdk";
function TransactionComponent() {
const { openTxToast } = useNotification();
const { openPopup } = useTransactionPopup();
const sendTransaction = async () => {
const txHash = "0x123..."; // Your transaction hash
await openTxToast("1", txHash);
};
const viewHistory = () => {
openPopup({
chainId: "1",
address: "0x456..." // Optional
});
};
return (
);
}
function App() {
return (
);
}
export default App;
```
# Chainscout Chains List
Source: https://docs.blockscout.com/devs/chainscout-chains-list
Chainscout is a JSON-based directory of EVM networks running Blockscout, including chain IDs and metadata contributed via pull requests.
Chainscout is currently in Beta. Visit a live instance at [https://chains.blockscout.com/](https://chains.blockscout.com/).
* Chainscout includes chain IDs and other chain information formatted as a JSON file. Add your own chain details through a pull request.
* Visit the repository to learn more: [https://github.com/blockscout/chainscout](https://github.com/blockscout/chainscout)
* Once all chains have been added, Chainscout will replace the current Blockscout chains and projects page located at [https://www.blockscout.com/chains-and-projects](https://www.blockscout.com/chains-and-projects).
## Find a chain ID
Chain IDs are standard EVM network identifiers. The same value is used in wallet configuration and in the `chain_id` parameter of the [PRO API](/devs/pro-api).
1. Open [chains.blockscout.com](https://chains.blockscout.com/) and search by chain name.
2. The chain's entry shows its chain ID and the URL of its hosted explorer instance.
Common examples:
| Chain | Chain ID |
| - | - |
| Ethereum Mainnet | `1` |
| OP Mainnet | `10` |
| BNB Smart Chain | `56` |
| Gnosis | `100` |
| Polygon Mainnet | `137` |
| Robinhood Chain | `4663` |
| Base | `8453` |
| Arbitrum One | `42161` |
| Scroll | `534352` |
For a full table of chain IDs supported by the PRO API, see [Complete supported chains comparison](/devs/migrate-from-etherscan#complete-supported-chains-comparison-blockscout-vs-etherscan).
Chainscout lists every chain running Blockscout. To confirm a chain is queryable through the PRO API, check the supported chains list on the [PRO API page](/devs/pro-api) or at [dev.blockscout.com](https://dev.blockscout.com).
Recent Deprecations
* Ethereum Goerli is no longer supported by Blockscout
# Dev Portal
Source: https://docs.blockscout.com/devs/dev-portal
Blockscout developer portal at dev.blockscout.com where developers sign up, manage PRO API keys, and monitor usage across supported chains.
More info coming soon. Check out the dev portal now at [https://dev.blockscout.com/](https://dev.blockscout.com/)
# Error Handling
Source: https://docs.blockscout.com/devs/error-responses
How the Blockscout PRO API returns proxied responses and structured error objects with error and source fields for internal vs upstream failures.
# Proxy API responses
For endpoints proxied to a Blockscout instance, responses fall into two categories:
1. **Success** β The HTTP status and body come **from Blockscout** (as if you called it directly). The body format depends on the path (JSON, plain text, etc.).
2. **Pro API error** β JSON with **`error`** (short message) and **`source`** (`internal` or `upstream`). Pro API returns this when the request did not complete normally through the proxy or the response is normalized for clients.
#### The `source` field:
* **internal:** Something went wrong inside Pro API: routing, chain configuration, or an internal failure. Check your chain identifier, URL shape, and supported networks.
* **upstream:** The request reached (or should have reached) Blockscout, but the connection or upstream response failed (timeout, unavailable server, Blockscout 5xx). Retrying later or checking the chain instance status is usually appropriate.
## Common errors (JSON)
| HTTP | Example `error` | What it means |
| - | - | - |
| **404** | `Network not supported` | This chain / route is **not configured** on this Pro API deployment. Verify the chain id and the list of supported networks. |
| **404** | `Not found` | The path does **not match** any known proxy pattern for that chain. Check path prefixes (e.g. `api`, `v2`, `json-rpc`) and the full URL. |
| **500** | `Internal server error` | An **unexpected error** in Pro API while handling or forwarding. Retry in case it was transient; if it persists, contact support with the request time. |
| **502** | `Bad gateway` | Blockscout returned a response Pro API treats as a **bad gateway** β upstream misbehaved or returned something invalid. Often a temporary issue on the instance. |
| **503** | `Service unavailable` | Blockscout returned **503** β overload, maintenance, or service unavailable. Wait and retry. |
| **503** | `Upstream service temporarily unavailable` | Pro API **could not connect** to Blockscout (network, TLS, host down, etc.βother than a read timeout). Usually temporary infrastructure or instance issues. |
| **504** | `Gateway timeout` | **Timeout** waiting for Blockscout, or an upstream "gateway timeout" style response (some cases are normalized to 504). Retry with backoff; heavy queries may need to be simplified. |
| **501** | `Not implemented` | Blockscout returned **501** β that capability is not implemented on this instance. Not a Pro API bug; use another endpoint or instance/chain if needed. |
| **Other 5xx** | `Unknown error` | Upstream returned a **less common 5xx**; the `error` string is generic. Use the HTTP status and instance health/logs for details. |
## Quick actions
* **`source: internal` + 404** β Fix **chain and URL** (supported network, correct path).
* **`source: upstream` + 5xx / 504** β Usually **temporary Blockscout or network issues**; retry later; if constant, check the instance status.
* **Successful responses without this JSON envelope** β **Direct Blockscout responses**; 4xx in that case come from upstream (e.g. "not found" for a specific API method), not necessarily the table above.
# For Web3 Developers
Source: https://docs.blockscout.com/devs/for-web3-developers
Developer hub for building on Blockscout with links to APIs, contract verification tools, the SDK, Merits integration, and link replacement guides.
π Welcome Web3 Developers and hackathon participants! Blockscout is built for you and optimized for use in web3 applications.
See the categories below for more information.
Blockscout APIs
Smart Contract Verification Tools and Resources
Pointing links to Blockscout / Replacing Existing Links
Blockscout SDK
Integrate Blockscout Merits
Autoscout 5 minute cloud deployment wizard
Chainscout EVM chains list
### Additional Resources
ππ»ββοΈ For details on developing on the Blockscout platform, advanced setup, ENVs, microservices like ENS, and Blockscout deployment please see the [Blockscout Setup](/setup/information-and-settings) section.
β See the [Common Developer FAQs](/faqs/developer-faqs) for questions related to Blockscout development.
ππ½ββοΈ [Join our Discord](https://discord.gg/blockscout) for technical questions and support.
# Integrate Merits
Source: https://docs.blockscout.com/devs/integrate-merits
Add Blockscout Merits, chain-agnostic digital rewards, to your dApp or activity to incentivize signups, referrals, and user engagement.
### What are Blockscout Merits?
Merits are digital rewards collected by interacting with Blockscout and Blockscout-related apps and by participating in various activities (like contests, X participation, telegram participation, app participation and more). Merits are chain agnostic and can be incorporated into any application. For more details see the [Merits section of the docs](/using-blockscout/merits).
### Using Merits as an activity incentive
Merits are used to incentivize different activities within the Blockscout universe. For example:
* **Blockscout explorer basics:** Earn Merits by signing up for the program. Once you are signed up, you can earn additional Merits by completing a daily claim. You can also share your referral code and earn Merits when new users sign up with that code.
* **Telegram mini app.** The telegram Blockscout Merits Bot allows for direct communication with subscribers. Users who download the bot receive extra Merits -> [https://t.me/blockscout\_merits\_bot](https://t.me/blockscout_merits_bot)
* **Swapscout swapping app**. Merits are incorporated in the app so that users can view their balance and earn Merits for their swaps. [https://swap.blockscout.com/](https://swap.blockscout.com/). **This is a good example of an external app that incorporates Merits.**
* **Revokescout app.** Merits are used to incentivize users but there is no sign in or interface. We simply check addresses that use the application and distribute Merits to those addresses.
* **Blockscout campaigns**. Participants in time-gated campaigns such as rating Dapps or Twitter(X) contests receive additional Merits. We collect the Ethereum addresses of winners and distribute Merits manually.
* **Partner campaigns**. Merits are allocated to users of other protocols as an additional incentive for use. Partners provide us with a list of addresses and tasks they completed and we distribute accordingly.
### Integrating Test Merits into your application
Merits can be integrated in different ways into your application. Ideas may be to include Merits as a reward for user interactions with your app or a general reward for any activity. Merits can be distributed to users via the API.
Users can have the ability to sign up for Merits through your app and/or log in to their Merits account. You can also display individual Merits balances and leaderboard balances within your application. However, these are optional integrations.
To qualify for the bounty, you simply need to provide Merit incentives for certain activities, and then distribute those merits appropriately. As long as you have the participant's Ethereum address you can distribute Merits.
Note: You can retrieve basic data without an API key, but **for interactivity purposes you will need to request one via our Discord channel**. See below.
### Getting started
1. Request your API key at: [https://ethglobal.com/discord](https://ethglobal.com/discord) in the #partner-blockscout channel
2. API hostname (and test merits dashboard): [https://merits-staging.blockscout.com](https://merits-staging.blockscout.com)
A full list of endpoints is available on our swagger page here: [https://blockscout.github.io/swaggers/services/merits/main/index.html](https://blockscout.github.io/swaggers/services/merits/main/index.html)
### Get basic Merit info for a user
`GET` `https://merits-staging.blockscout.com/api/v1/auth/user/{address}`
Returns user information by address
**Path parameters**
The blockchain address of the user
**Responses**
Indicates if the user exists
Example: `true`
The blockchain address of the user
Example: `0x813399e5b08Bb50b038AA7dF6347b6AF2D161338`
Merits balance
Example: `981`
Number of invited users
Example: `5`
Registration timestamp
Example: `2024-10-21T13:21:20.529Z`
```http HTTP theme={null}
GET /api/v1/auth/user/{address} HTTP/1.1
Host: merits-staging.blockscout.com
Accept: */*
```
```sh cURL theme={null}
curl -L \
--url 'https://merits-staging.blockscout.com/api/v1/auth/user/{address}' \
--header 'Accept: */*'
```
```js JavaScript theme={null}
const response = await fetch('https://merits-staging.blockscout.com/api/v1/auth/user/{address}', {
method: 'GET',
headers: {
"Accept": "*/*"
},
});
const data = await response.json();
```
```py Python theme={null}
import requests
response = requests.get(
"https://merits-staging.blockscout.com/api/v1/auth/user/{address}",
headers={"Accept":"*/*"},
)
data = response.json()
```
```json 200 User Information theme={null}
{
"exists": true,
"user": {
"address": "0x813399e5b08Bb50b038AA7dF6347b6AF2D161338",
"total_balance": "981",
"referrals": "5",
"registered_at": "2024-10-21T13:21:20.529Z"
}
}
```
### Get leaderboard ranking for a user
`GET` `https://merits-staging.blockscout.com/api/v1/leaderboard/users/{address}`
Returns the leaderboard information for a specific user
**Path parameters**
The blockchain address of the user
**Responses**
The blockchain address of the user
Example: `0x813399e5b08Bb50b038AA7dF6347b6AF2D161338`
The current user's balance
Example: `981`
Number of invited users
Example: `5`
The date and time when the user registered
Example: `2024-10-21T13:21:20.529Z`
The rank of the user on the leaderboard
Example: `1`
Number of users below the current user
Example: `71569`
In what percentage of users the current one is in
Example: `0.01`
```http HTTP theme={null}
GET /api/v1/leaderboard/users/{address} HTTP/1.1
Host: merits-staging.blockscout.com
Accept: */*
```
```sh cURL theme={null}
curl -L \
--url 'https://merits-staging.blockscout.com/api/v1/leaderboard/users/{address}' \
--header 'Accept: */*'
```
```js JavaScript theme={null}
const response = await fetch('https://merits-staging.blockscout.com/api/v1/leaderboard/users/{address}', {
method: 'GET',
headers: {
"Accept": "*/*"
},
});
const data = await response.json();
```
```py Python theme={null}
import requests
response = requests.get(
"https://merits-staging.blockscout.com/api/v1/leaderboard/users/{address}",
headers={"Accept":"*/*"},
)
data = response.json()
```
```json 200 User leaderboard information theme={null}
{
"address": "0x813399e5b1102950b038AA7dF6347b6AF21102828",
"total_balance": "981",
"referrals": "5",
"registered_at": "2024-10-21T13:21:20.529Z",
"rank": "1",
"users_below": "71569",
"top_percent": 0.01
}
```
### Partner balance and distribution information
When you request an API key you become a partner! You will receive a balance of test Merits which can then be distributed to your users.
*\* Requires API Key - Add the assigned API KEY in the Authorization header to see your information.*
`GET` `https://merits-staging.blockscout.com/partner/api/v1/balance`
Returns the balance and distribution information for a partner
**Responses**
Partner name
Example: `partner-1`
API key for the partner
Example: `4VF6LDF7RC64CNGWXOECF8J1LJ62W5HS`
Merits accrual start date
Example: `2025-05-01T00:00:00.000Z`
Merits accrual end date
Example: `2025-06-01T00:00:00.000Z`
Amount of accruing merits per second
Example: `0.1`
Current amount available for distribution
Example: `1234.5`
Total amount distributed in the past
Example: `100`
Last update timestamp
Example: `2025-04-16T11:26:31.757Z`
```http HTTP theme={null}
GET /partner/api/v1/balance HTTP/1.1
Host: merits-staging.blockscout.com
Accept: */*
```
```sh cURL theme={null}
curl -L \
--url 'https://merits-staging.blockscout.com/partner/api/v1/balance' \
--header 'Accept: */*'
```
```js JavaScript theme={null}
const response = await fetch('https://merits-staging.blockscout.com/partner/api/v1/balance', {
method: 'GET',
headers: {
"Accept": "*/*"
},
});
const data = await response.json();
```
```py Python theme={null}
import requests
response = requests.get(
"https://merits-staging.blockscout.com/partner/api/v1/balance",
headers={"Accept":"*/*"},
)
data = response.json()
```
```json 200 Partner balance information theme={null}
{
"name": "partner-1",
"api_key": "4VF6LDF7RC64CNGWXOECF8J1LJ62W5HS",
"valid_since": "2025-05-01T00:00:00.000Z",
"valid_until": "2025-06-01T00:00:00.000Z",
"rate": "0.1",
"balance": "1234.5",
"total_distributed": "100",
"updated_at": "2025-04-16T11:26:31.757Z"
}
```
### Distribute Merits
*\* Requires API Key - Add the assigned API KEY in the Authorization header to add your distribution information.*
*Notes:*
* `id` must be unique per each API KEY, so it's recommended to include date or time period describing the distribution period.
* `distributions`
* Max `1000` wallets per distribution.
* Amounts less than `0.01` per address are not allowed.
* Amounts can be in decimals, max 2 decimal digits precision is recommended.
* create\_missing\_accounts
* `true`: allows distributions to not yet registered Merits accounts.
* `false`: only allow distributions to users that are already registered.
`POST` `https://merits-staging.blockscout.com/partner/api/v1/distribute`
Distributes merits to specified addresses
**Body**
Unique ID for the distribution
Example: `ethglobal_rewards-2025/05/01`
Human readable description of the distribution
Example: `Extra rewards from ProjectX for using Blockscout during ETH Global`
List of wallet addresses and amounts (max 1000 wallets)
Blockchain address to receive the distribution
Example: `0x813399e5b08Bb50b038AA7dF6347b6AF2D161338`
Amount to distribute
Example: `10.50`
Allow distribution for non-registered accounts if true
Example: `false`
Total distribution amount (must equal sum of all amounts)
Example: `100.00`
**Responses**
Number of accounts that received distributions
Example: `1`
Number of new accounts created during distribution
Example: `0`
```http HTTP theme={null}
POST /partner/api/v1/distribute HTTP/1.1
Host: merits-staging.blockscout.com
Content-Type: application/json
Accept: */*
Content-Length: 270
{
"id": "ethglobal_rewards-2025/05/01",
"description": "Extra rewards from ProjectX for using Blockscout during ETH Global",
"distributions": [
{
"address": "0x813399e5b08Bb50b038AA7dF6347b6AF2D161338",
"amount": "10.50"
}
],
"create_missing_accounts": false,
"expected_total": "100.00"
}
```
```sh cURL theme={null}
curl -L \
--request POST \
--url 'https://merits-staging.blockscout.com/partner/api/v1/distribute' \
--header 'Content-Type: application/json' \
--data '{
"id": "ethglobal_rewards-2025/05/01",
"description": "Extra rewards from ProjectX for using Blockscout during ETH Global",
"distributions": [
{
"address": "0x813399e5b08Bb50b038AA7dF6347b6AF2D161338",
"amount": "10.50"
}
],
"create_missing_accounts": false,
"expected_total": "100.00"
}'
```
```js JavaScript theme={null}
const response = await fetch('https://merits-staging.blockscout.com/partner/api/v1/distribute', {
method: 'POST',
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"id": "ethglobal_rewards-2025/05/01",
"description": "Extra rewards from ProjectX for using Blockscout during ETH Global",
"distributions": [
{
"address": "0x813399e5b08Bb50b038AA7dF6347b6AF2D161338",
"amount": "10.50"
}
],
"create_missing_accounts": false,
"expected_total": "100.00"
})
});
const data = await response.json();
```
```py Python theme={null}
import requests
response = requests.post(
"https://merits-staging.blockscout.com/partner/api/v1/distribute",
headers={"Content-Type":"application/json"},
data=json.dumps({
"id": "ethglobal_rewards-2025/05/01",
"description": "Extra rewards from ProjectX for using Blockscout during ETH Global",
"distributions": [
{
"address": "0x813399e5b08Bb50b038AA7dF6347b6AF2D161338",
"amount": "10.50"
}
],
"create_missing_accounts": False,
"expected_total": "100.00"
})
)
data = response.json()
```
```json 200 Distribution results theme={null}
{
"accounts_distributed": "1",
"accounts_created": "0"
}
```
### Login and Registration Flow - Get User Token
*Use the following flow to get a User Token*
1. Get Nonce from Backend
`GET` `https://merits-staging.blockscout.com/api/v1/auth/nonce`
Returns a nonce for authentication
**Responses**
Authentication nonce
Example: `4MCWIDlddqsmJAAAZ`
Optional merits-specific login nonce
```http HTTP theme={null}
GET /api/v1/auth/nonce HTTP/1.1
Host: merits-staging.blockscout.com
Accept: */*
```
```sh cURL theme={null}
curl -L \
--url 'https://merits-staging.blockscout.com/api/v1/auth/nonce' \
--header 'Accept: */*'
```
```js JavaScript theme={null}
const response = await fetch('https://merits-staging.blockscout.com/api/v1/auth/nonce', {
method: 'GET',
headers: {
"Accept": "*/*"
},
});
const data = await response.json();
```
```py Python theme={null}
import requests
response = requests.get(
"https://merits-staging.blockscout.com/api/v1/auth/nonce",
headers={"Accept":"*/*"},
)
data = response.json()
```
```json 200 Authentication nonce theme={null}
{
"exists": true,
"user": {
"address": "0x813399e5b08Bb50b038AA7dF6347b6AF2D161338",
"total_balance": "981",
"referrals": "5",
"registered_at": "2024-10-21T13:21:20.529Z"
}
}
```
2. Ask for a signature from a user with a predefined message
```text theme={null}
// Formatted message example
merits.blockscout.com wants you to sign in with your Ethereum account:
0x813399e5b08Bb50b038AA7dF6347b6AF2D163328
Sign-In for the Blockscout Merits program.
URI:
https://merits-staging.blockscout.com
Version: 1
Chain ID: 1
Nonce: 4MCWIDlddqsmJAZOZ
Issued At: 2025-03-18T12:23:51.549Z
Expiration Time: 2026-03-18T12:23:51.549Z
```
3. Send data to get a user token
`POST` `https://merits-staging.blockscout.com/api/v1/auth/login`
Authenticates a user with a signed message
**Body**
Authentication nonce received from the server
Example: `4MCWIDlddqsmJAAAZ`
The message that was signed
Example: `merits.blockscout.com wants you to sign in with your Ethereum account: 0x813399e5b08Bb50b038AA7dF6347b6AF2D161338 Sign-In for the Blockscout Merits program. URI: https://merits.blockscout.com Version: 1 Chain ID: 1 Nonce: 4MCWIDlddqsmJAAAZ Issued At: 2025-03-18T12:23:51.549Z Expiration Time: 2026-03-18T12:23:51.549Z`
The signature of the message
Example: `0xb11b582a6ef196a3f20fa9c84443a92c9f456c9da2ce8ceea2bcf4ce2b936e35767ac2ff56a1de635b7a5f4bcb5da89c4297efb2b4ce559123891202731752661c`
**Responses**
Indicates if an account was created during this login
Example: `false`
JWT authentication token
Example: `eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE3NzM4MzY2MzEsImlhdCI6MTc0MjMwMDYzMSwibmJmIjoxNzQyMzAwNjMxLCJzdWIiOiIweDgxMzM5OWU1YjA4QmI1MGIwMzhBQTdkRjYzNDdiNkFGMkQxNsadasdasdasdsajE4MjgiLCJqdGkiOiI0TUNXSURsZGRxc21KQVpPWiIsImNoYWluX2lkIjoxLCJkb21haW4iOiJtZXJpdHMuYmxvY2tzY291dC5jb20ifQ.QQj-dn3ZmHhusq7cvtohF72yxF-605lP7WxVuVZ7BfQ`
```http HTTP theme={null}
POST /api/v1/auth/login HTTP/1.1
Host: merits-staging.blockscout.com
Content-Type: application/json
Accept: */*
Content-Length: 518
{
"nonce": "4MCWIDlddqsmJAAAZ",
"message": "merits.blockscout.com wants you to sign in with your Ethereum account:\n0x813399e5b08Bb50b038AA7dF6347b6AF2D161338\n\nSign-In for the Blockscout Merits program.\n\nURI: https://merits.blockscout.com\nVersion: 1\nChain ID: 1\nNonce: 4MCWIDlddqsmJAAAZ\nIssued At: 2025-03-18T12:23:51.549Z\nExpiration Time: 2026-03-18T12:23:51.549Z",
"signature": "0xb11b582a6ef196a3f20fa9c84443a92c9f456c9da2ce8ceea2bcf4ce2b936e35767ac2ff56a1de635b7a5f4bcb5da89c4297efb2b4ce559123891202731752661c"
}
```
```sh cURL theme={null}
curl -L \
--request POST \
--url 'https://merits-staging.blockscout.com/api/v1/auth/login' \
--header 'Content-Type: application/json' \
--data '{
"nonce": "4MCWIDlddqsmJAAAZ",
"message": "merits.blockscout.com wants you to sign in with your Ethereum account:\n 0x813399e5b08Bb50b038AA7dF6347b6AF2D161338\n\n Sign-In for the Blockscout Merits program.\n\n URI: https://merits.blockscout.com\n Version: 1\n Chain ID: 1\n Nonce: 4MCWIDlddqsmJAAAZ\n Issued At: 2025-03-18T12:23:51.549Z\n Expiration Time: 2026-03-18T12:23:51.549Z",
"signature": "0xb11b582a6ef196a3f20fa9c84443a92c9f456c9da2ce8ceea2bcf4ce2b936e35767ac2ff56a1de635b7a5f4bcb5da89c4297efb2b4ce559123891202731752661c"
}'
```
```js JavaScript theme={null}
const response = await fetch('https://merits-staging.blockscout.com/api/v1/auth/login', {
method: 'POST',
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"nonce": "4MCWIDlddqsmJAAAZ",
"message": "merits.blockscout.com wants you to sign in with your Ethereum account:\n0x813399e5b08Bb50b038AA7dF6347b6AF2D161338\n\nSign-In for the Blockscout Merits program.\n\nURI: https://merits.blockscout.com\nVersion: 1\nChain ID: 1\nNonce: 4MCWIDlddqsmJAAAZ\nIssued At: 2025-03-18T12:23:51.549Z\nExpiration Time: 2026-03-18T12:23:51.549Z",
"signature": "0xb11b582a6ef196a3f20fa9c84443a92c9f456c9da2ce8ceea2bcf4ce2b936e35767ac2ff56a1de635b7a5f4bcb5da89c4297efb2b4ce559123891202731752661c"
})
});
const data = await response.json();
```
```py Python theme={null}
import requests
response = requests.post(
"https://merits-staging.blockscout.com/api/v1/auth/login",
headers={"Content-Type":"application/json"},
data=json.dumps({
"nonce": "4MCWIDlddqsmJAAAZ",
"message": "merits.blockscout.com wants you to sign in with your Ethereum account:\n0x813399e5b08Bb50b038AA7dF6347b6AF2D161338\n\nSign-In for the Blockscout Merits program.\n\nURI: https://merits.blockscout.com\nVersion: 1\nChain ID: 1\nNonce: 4MCWIDlddqsmJAAAZ\nIssued At: 2025-03-18T12:23:51.549Z\nExpiration Time: 2026-03-18T12:23:51.549Z",
"signature": "0xb11b582a6ef196a3f20fa9c84443a92c9f456c9da2ce8ceea2bcf4ce2b936e35767ac2ff56a1de635b7a5f4bcb5da89c4297efb2b4ce559123891202731752661c"
})
)
data = response.json()
```
### API Calls Requiring a User Token
*\*Requires User Token: put the user token in the Authorization header*
`GET` `https://merits-staging.blockscout.com/api/v1/user/balances`
Returns the detailed balance information for the authenticated user
**Responses**
The total balance of the user
Example: `2426.61`
The amount of tokens staked by the user
Example: `0`
The amount of tokens not staked by the user
Example: `2426.61`
The total staking rewards earned by the user
Example: `0`
The total referral rewards earned by the user
Example: `20`
The pending referral rewards for the user
Example: `0`
```http HTTP theme={null}
GET /api/v1/user/balances HTTP/1.1
Host: merits-staging.blockscout.com
Accept: */*
```
```sh cURL theme={null}
curl -L \
--url 'https://merits-staging.blockscout.com/api/v1/user/balances' \
--header 'Accept: */*'
```
```js JavaScript theme={null}
const response = await fetch('https://merits-staging.blockscout.com/api/v1/user/balances', {
method: 'GET',
headers: {
"Accept": "*/*"
},
});
const data = await response.json();
```
```py Python theme={null}
import requests
response = requests.get(
"https://merits-staging.blockscout.com/api/v1/user/balances",
headers={"Accept":"*/*"},
)
data = response.json()
```
```json 200 User balance details theme={null}
{
"total": "2426.61",
"staked": "0",
"unstaked": "2426.61",
"total_staking_rewards": "0",
"total_referral_rewards": "20",
"pending_referral_rewards": "0"
}
```
`GET` `https://merits-staging.blockscout.com/api/v1/user/logs`
Returns activity logs for the authenticated user
**Query parameters**
Number of items to return per page
Token for pagination
**Responses**
list of activity logs
Type of activity
Example: `daily_reward`
Streak count for daily rewards
Example: `1`
Amount of merits received
Example: 10
Date of the activity
Example: 2025-03-18
Timestamp of the activity
Example: `2025-03-18T12:13:20.110Z`
Token for the next page
Example: `1732067538792818,984727`
Size of the page
Example: `50`
```http HTTP theme={null}
GET /api/v1/user/logs HTTP/1.1
Host: merits-staging.blockscout.com
Accept: */*
```
```sh cURL theme={null}
curl -L \
--url 'https://merits-staging.blockscout.com/api/v1/user/logs' \
--header 'Accept: */*'
```
```js JavaScript theme={null}
const response = await fetch('https://merits-staging.blockscout.com/api/v1/user/logs', {
method: 'GET',
headers: {
"Accept": "*/*"
},
});
const data = await response.json();
```
```py Python theme={null}
import requests
response = requests.get(
"https://merits-staging.blockscout.com/api/v1/user/logs",
headers={"Accept":"*/*"},
)
data = response.json()
```
# MCP Server
Source: https://docs.blockscout.com/devs/mcp-server
Blockscout MCP server wraps the APIs to expose balances, tokens, NFTs, and contract metadata for AI agents, IDEs, and automation tools.
* MCP Landing page: [https://mcp.blockscout.com](https://mcp.blockscout.com)
* Github with technical specs and run information located at [https://github.com/blockscout/mcp-server](https://github.com/blockscout/mcp-server)
The Model Context Protocol (MCP) is an open protocol designed to allow AI agents, IDEs, and automation tools to consume, query, and analyze structured data through context-aware APIs.
This server wraps Blockscout APIs and exposes blockchain dataβbalances, tokens, NFTs, contract metadataβvia MCP so that AI agents and tools (like Claude, Cursor, or IDEs) can access and analyze it contextually.
#### **Key Features:**
* Contextual blockchain data access for AI tools
* Multi-chain support via getting Blockscout instance URLs from Chainscout
* Custom instructions for MCP host to use the server
* Supports MCP progress notifications for multi-step tool operations, allowing clients to track execution status
* Enhanced User Experience: Provides periodic progress updates for long-running API queries (e.g., fetching extensive transaction histories) when requested by the client, improving responsiveness
#### Use Cases
* Enabling AI agents to analyze blockchain transactions and account balances.
* Automating blockchain data analysis workflows with context-aware APIs.
* Allowing IDEs to fetch contract ABIs and other relevant smart contract information.
### Examples
* Using the MCP to [find ENV variables for rollup deployments](/devs/mcp-examples/rollup-deployment-variables).
#### **Architecture and Data Flow**
```mermaid theme={null}
sequenceDiagram
participant AI as MCP Host
participant MCP as MCP Server
participant BENS as ENS Service
participant CS as Chainscout
participant BS as Blockscout Instance
participant Metadata as Metadata Service
AI->>MCP: __get_instructions__
MCP-->>AI: Custom instructions
AI->>MCP: get_address_by_ens_name
MCP->>BENS: Forward ENS name resolution request
BENS-->>MCP: Address response
MCP-->>AI: Formatted address
AI->>MCP: get_chains_list
MCP->>CS: Request available chains
CS-->>MCP: List of chains
MCP-->>AI: Formatted chains list
Note over AI: Host selects chain_id as per the user's initial prompt
AI->>MCP: Tool request with chain_id
MCP->>CS: GET /api/chains/:id
CS-->>MCP: Chain metadata (includes Blockscout URL)
par Concurrent API Calls (when applicable)
MCP->>BS: Request to Blockscout API
BS-->>MCP: Primary data response
and
MCP->>Metadata: Request to Metadata API (for enriched data)
Metadata-->>MCP: Secondary data response
end
MCP-->>AI: Formatted & combined information
```
# Metadata Service
Source: https://docs.blockscout.com/devs/metadata-service
Blockscout Metadata service turns raw addresses into human-readable name tags, protocols, categories, risk flags, and ecosystem labels.
Turn raw addresses into meaningful, human-readable information
* human-readable labels
* compliance signals
* protocol grouping
* enriched analytics
Rather than
`0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48`
You get:
* **name tag:** USD Coin
* **protocol:** Circle
* **category:** stablecoin
* **risk flags** (if any)
* **ecosystem tags** (CEX, DeFi, grants, etc.)
## Handles
| Handle | Why |
| - | - |
| `GET https://api.blockscout.com/metadata/api/v1/tags` | Get all available tag types (OFAC, CEX, protocol, hacks, etc.) |
| `GET https://api.blockscout.com/metadata/api/v1/addresses/{address}` | Get all metadata for a specific address |
| `GET https://api.blockscout.com/metadata/api/v1/addresses?addresses=...` | Batch enrich multiple addresses |
| `GET https://api.blockscout.com/metadata/api/v1/search?q=...` | Search metadata (protocols, entities, labels) |
## Examples
### Wallet / explorer UX (name tags)
```shellscript theme={null}
curl "https://api.blockscout.com/metadata/api/v1/addresses/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48?apikey=YOUR_KEY"
```
### Compliance (OFAC / sanctions)
```shellscript theme={null}
curl "https://api.blockscout.com/metadata/api/v1/search?q=ofac&apikey=YOUR_KEY"
```
### Exchange detection (CEX)
```shellscript theme={null}
curl "https://api.blockscout.com/metadata/api/v1/search?q=binance&apikey=YOUR_KEY"
```
### Hack / exploit detection
```shellscript theme={null}
curl "https://api.blockscout.com/metadata/api/v1/addresses/0x...&apikey=YOUR_KEY"
```
### Protocol discovery
```shellscript theme={null}
curl "https://api.blockscout.com/metadata/api/v1/search?q=uniswap&apikey=YOUR_KEY"
```
## TypeScript example
```ts theme={null}
const API_KEY = process.env.API_KEY!;
const ADDRESSES = [
"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"
];
async function getJson(url: string) {
const res = await fetch(url);
return res.json();
}
async function main() {
const url =
`https://api.blockscout.com/metadata/api/v1/addresses?` +
`addresses=${ADDRESSES.join(",")}&apikey=${API_KEY}`;
const data = await getJson(url);
for (const item of data.items ?? []) {
console.log(item.address);
console.log("name:", item.name);
console.log("tags:", item.tags?.map((t: any) => t.name).join(", "));
console.log("");
}
}
main();
```
***
# Migrate from Etherscan to Blockscout PRO API
Source: https://docs.blockscout.com/devs/migrate-from-etherscan
Move Etherscan API calls to the Blockscout PRO API with matching endpoints, more chains, higher rate limits, and lower pricing in minutes.
To get started immediately, see our [blog post with simple migration instructions](https://www.blog.blockscout.com/how-to-migrate-your-etherscan-api-calls-to-blockscout/).
# Etherscan API Alternative β Migrate to Blockscout PRO API
> Same endpoint structure. More chains. Higher limits. Lower price. Migrate in minutes.
## Why Developers Are Switching
Etherscan has reduced free-tier API access for major chains including Base and Optimism. Developers building production applications need reliable, predictable API access.
Blockscout PRO API provides Etherscan-compatible endpoints across 100+ EVM chains with higher rate limits and more generous usage allowances at every pricing tier. Free-tier access is available on all supported chains.
## Side-by-Side Comparison
| Feature | Blockscout PRO API | Etherscan API |
| - | - | - |
| Free tier RPS | 5 | 3 |
| Free tier chains | All supported | Limited |
| \$49/mo RPS | 15 | 5 |
| \$49/mo credits/calls | 100M credits | 100K calls |
| \$199/mo RPS | 30 | 10 |
| \$199/mo credits/calls | 500M credits | 200K calls |
| Multichain access | Single API key | Per-chain keys |
| API keys per account | Up to 50 | Limited |
| Usage dashboard | Real-time | Basic |
At the \$49/mo tier, Blockscout's 100M monthly credits provide roughly 3Γ more throughput than Etherscan Lite's 100K daily calls.
## Migration Is a Base URL Swap
Both Etherscan V2 and Blockscout PRO API now use a unified multichain endpoint with a chain ID parameter. The APIs are structurally almost identical β migration is a base URL and key swap.
### Etherscan Route
```text theme={null}
https://api.etherscan.io/v2/api?chainid=1&module=account&action=balance&address=0x...&apikey=YOUR_ETHERSCAN_KEY
```
### Blockscout PRO API
```text theme={null}
https://api.blockscout.com/v2/api?chainid=1&module=account&action=balance&address=0x...&apikey=proapi_YOUR_KEY
```
The only differences: `api.etherscan.io` β `api.blockscout.com` and your API key. Same modules, same actions, same parameters.
Blockscout also supports path-based routing as an alternative (chainid is 1 in the path):
```text theme={null}
https://api.blockscout.com/1/api?module=account&action=balance&address=0x...&apikey=proapi_YOUR_KEY
```
### Chain IDs for Common Networks
| Chain | Chain ID | Etherscan Status |
| - | - | - |
| Ethereum Mainnet | `1` | Available |
| OP Mainnet | `10` | Paid only |
| Base Mainnet | `8453` | Paid only |
| Arbitrum One | `42161` | Available |
| Scroll Mainnet | `534352` | Available |
| Soneium Mainnet | `1868` | Not available (Blockscout exclusive) |
| Ink Mainnet | `57073` | Not available (Blockscout exclusive) |
| MegaETH Mainnet | `4326` | Available |
| Immutable zkEVM | `13371` | Not available (Blockscout exclusive) |
| World Chain | `480` | Available |
| Celo Mainnet | `42220` | Available |
### Complete Supported Chains Comparison: Blockscout vs Etherscan
**Legend:** β Supported Β· β Not supported Β· β οΈ Paid tier only (Etherscan)
**Bold** rows = exclusive to one explorer. \\
* Blockscout: 117 chains \
-Β Etherscan: 68 chains \\
* Shared: 20 chains.Β
| Chain Name | Chain ID | Blockscout Pro API | Etherscan API |
| :- | :- | :-: | :-: |
| Ethereum Mainnet | 1 | β | β |
| **Goerli Testnet** | 5 | **β ** | β |
| OP Mainnet | 10 | β | β οΈ Paid only |
| **Rootstock Mainnet** | 30 | **β ** | β |
| **Rootstock Testnet** | 31 | **β ** | β |
| **XDC Mainnet** | 50 | β | **β ** |
| **XDC Apothem Testnet** | 51 | β | **β ** |
| **BNB Smart Chain Mainnet** | 56 | β | **β οΈ Paid only** |
| **Ethereum Classic** | 61 | **β ** | β |
| **ETC Mordor Testnet** | 63 | **β ** | β |
| **Shibuya Testnet** | 81 | **β ** | β |
| **Viction Mainnet** | 88 | **β ** | β |
| **Viction Testnet** | 89 | **β ** | β |
| **BNB Smart Chain Testnet** | 97 | β | **β οΈ Paid only** |
| Gnosis | 100 | β | β |
| **Fuse Mainnet** | 122 | **β ** | β |
| **Fuse Spark Testnet** | 123 | **β ** | β |
| Unichain Mainnet | 130 | β | β |
| Polygon Mainnet | 137 | β | β |
| **Monad Mainnet** | 143 | β | **β ** |
| **Sonic Mainnet** | 146 | β | **β ** |
| **ShimmerEVM Mainnet** | 148 | **β ** | β |
| **HashKey Chain Mainnet** | 177 | **β ** | β |
| **BitTorrent Chain Mainnet** | 199 | β | **β ** |
| **opBNB Mainnet** | 204 | β | **β ** |
| **TAC Mainnet** | 239 | **β ** | β |
| **Fraxtal Mainnet** | 252 | β | **β ** |
| **zkSync Sepolia Testnet** | 300 | **β ** | β |
| **Filecoin Mainnet** | 314 | **β ** | β |
| **zkSync Era Mainnet** | 324 | **β ** | β |
| **Shape Mainnet** | 360 | **β ** | β |
| **OP Goerli Testnet** | 420 | **β ** | β |
| World Chain Mainnet | 480 | β | β |
| **Blackfort Mainnet** | 488 | **β ** | β |
| **Astar Mainnet** | 592 | **β ** | β |
| **Redstone Mainnet** | 690 | **β ** | β |
| **Matchain Mainnet** | 698 | **β ** | β |
| **Social Network Testnet** | 749 | **β ** | β |
| **Stable Mainnet** | 988 | β | **β ** |
| **HyperEVM Mainnet** | 999 | β | **β ** |
| **BitTorrent Chain Testnet** | 1029 | β | **β ** |
| **ShimmerEVM Testnet** | 1073 | **β ** | β |
| **IOTA EVM Testnet** | 1076 | **β ** | β |
| **Lisk Mainnet** | 1135 | **β ** | β |
| **Moonbeam Mainnet** | 1284 | β | **β ** |
| **Moonriver Mainnet** | 1285 | β | **β ** |
| **Moonbase Alpha Testnet** | 1287 | β | **β ** |
| Unichain Sepolia Testnet | 1301 | β | β |
| **Story Aeneid Testnet** | 1315 | **β ** | β |
| **Sei Testnet** | 1328 | β | **β ** |
| **Sei Mainnet** | 1329 | β | **β ** |
| **Story Mainnet** | 1514 | **β ** | β |
| **Reya Network Mainnet** | 1729 | **β ** | β |
| **PlayBlock Mainnet** | 1829 | **β ** | β |
| **Soneium Mainnet** | 1868 | **β ** | β |
| **LightLink Phoenix Mainnet** | 1890 | **β ** | β |
| **LightLink Pegasus Testnet** | 1891 | **β ** | β |
| **Swellchain Mainnet** | 1923 | β | **β ** |
| **Swellchain Testnet** | 1924 | β | **β ** |
| **Soneium Minato Testnet** | 1946 | **β ** | β |
| **Stable Testnet** | 2201 | β | **β ** |
| **KiteAI Mainnet** | 2365 | **β ** | β |
| **KiteAI Mainnet (alt)** | 2366 | **β ** | β |
| **KiteAI Testnet** | 2368 | **β ** | β |
| **TAC St. Petersburg Testnet** | 2391 | **β ** | β |
| **Fraxtal Hoodi Testnet** | 2523 | β | **β ** |
| **Abstract Mainnet** | 2741 | β | **β ** |
| **Nexus Staging Testnet** | 3941 | **β ** | β |
| **Nexus Testnet** | 3945 | **β ** | β |
| **Lisk Sepolia Testnet** | 4202 | **β ** | β |
| MegaETH Mainnet | 4326 | β | β |
| **Memecore Mainnet** | 4352 | β | **β ** |
| World Chain Sepolia Testnet | 4801 | β | β |
| **Blackfort Testnet** | 4888 | **β ** | β |
| **Blackfort Mainnet (legacy)** | 4999 | **β ** | β |
| **Mantle Mainnet** | 5000 | β | **β ** |
| **Mantle Sepolia Testnet** | 5003 | β | **β ** |
| **opBNB Testnet** | 5611 | β | **β ** |
| MegaETH Testnet | 6342 | β | β |
| **MegaETH Testnet v2** | 6343 | **β ** | β |
| **Everclear Testnet** | 6398 | **β ** | β |
| **ZetaChain Mainnet** | 7000 | **β ** | β |
| **ZetaChain Testnet** | 7001 | **β ** | β |
| **Numine Mainnet** | 8021 | **β ** | β |
| **Zenchain Mainnet** | 8408 | **β ** | β |
| **Base Mainnet** | 8453 | β | **β οΈ Paid only** |
| **IOTA EVM Mainnet** | 8822 | **β ** | β |
| **Plasma Mainnet** | 9745 | β | **β ** |
| **Plasma Testnet** | 9746 | β | **β ** |
| **Monad Testnet** | 10143 | β | **β ** |
| **Gnosis Chiado Testnet** | 10200 | **β ** | β |
| **Tea Sepolia Testnet** | 10218 | **β ** | β |
| **Shape Sepolia Testnet** | 11011 | **β ** | β |
| **Abstract Sepolia Testnet** | 11124 | β | **β ** |
| **Immutable zkEVM Mainnet** | 13371 | **β ** | β |
| **Immutable zkEVM Testnet** | 13473 | **β ** | β |
| **Sonic Testnet** | 14601 | β | **β ** |
| **Ethereum Holesky Testnet** | 17000 | **β ** | β |
| **Zilliqa EVM Mainnet** | 32769 | **β ** | β |
| **Zilliqa EVM Testnet** | 33101 | **β ** | β |
| **ApeChain Curtis Testnet** | 33111 | β | **β ** |
| **ApeChain Mainnet** | 33139 | β | **β ** |
| **Mode Mainnet** | 34443 | **β ** | β |
| **EDU Chain Mainnet** | 41923 | **β ** | β |
| Arbitrum One Mainnet | 42161 | β | β |
| **Arbitrum Nova Mainnet** | 42170 | **β ** | β |
| Celo Mainnet | 42220 | β | β |
| **Etherlink Mainnet** | 42793 | **β ** | β |
| **Avalanche Fuji Testnet** | 43113 | β | **β οΈ Paid only** |
| **Avalanche C-Chain** | 43114 | β | **β οΈ Paid only** |
| **Memecore Testnet** | 43521 | β | **β ** |
| **Metabased Stratos Testnet** | 51010 | **β ** | β |
| **Ink Mainnet** | 57073 | **β ** | β |
| **Linea Sepolia Testnet** | 59141 | β | **β ** |
| **Linea Mainnet** | 59144 | β | **β ** |
| **ICB Testnet** | 73114 | **β ** | β |
| **ICB Mainnet** | 73115 | **β ** | β |
| **Polygon Amoy Testnet** | 80002 | β | **β ** |
| **Berachain Bepolia Testnet** | 80069 | β | **β ** |
| **Berachain Mainnet** | 80094 | β | **β ** |
| **Blast Mainnet** | 81457 | β | **β ** |
| **Base Goerli Testnet** | 84531 | **β ** | β |
| Base Sepolia Testnet | 84532 | β | β οΈ Paid only |
| **Creditcoin Mainnet** | 102030 | **β ** | β |
| **Creditcoin Testnet** | 102031 | **β ** | β |
| **Creditcoin Devnet** | 102032 | **β ** | β |
| **Etherlink Shadownet** | 127823 | **β ** | β |
| **Etherlink Testnet** | 128123 | **β ** | β |
| **Taiko Mainnet** | 167000 | β | **β ** |
| **Taiko Hoodi** | 167013 | β | **β ** |
| **Filecoin Calibration Testnet** | 314159 | **β ** | β |
| **World Mobile Testnet** | 323432 | **β ** | β |
| Arbitrum Sepolia Testnet | 421614 | β | β |
| Scroll Sepolia Testnet | 534351 | β | β |
| Scroll Mainnet | 534352 | β | β |
| Hoodi Testnet | 560048 | β | β |
| **Crosschain Testnet** | 612044 | **β ** | β |
| **Crosschain Mainnet** | 612055 | **β ** | β |
| **EDU Chain Testnet** | 656476 | **β ** | β |
| **Gensyn Testnet** | 685685 | **β ** | β |
| **Pyrope Chain Mainnet** | 695569 | **β ** | β |
| **Katana Bokuto** | 737373 | β | **β ** |
| **Katana Mainnet** | 747474 | β | **β ** |
| **Ink Sepolia Testnet** | 763373 | **β ** | β |
| **Arc Testnet** | 5042002 | **β ** | β |
| **Kaigan Mainnet** | 5278000 | **β ** | β |
| **Zora Mainnet** | 7777777 | **β ** | β |
| **Fluence Mainnet** | 9999999 | **β ** | β |
| **Spotlight Mainnet** | 10058111 | **β ** | β |
| **Spotlight Sepolia Testnet** | 10058112 | **β ** | β |
| Celo Sepolia Testnet | 11142220 | β | β |
| Ethereum Sepolia Testnet | 11155111 | β | β |
| OP Sepolia Testnet | 11155420 | β | β οΈ Paid only |
| **Citronus Testnet** | 34949059 | **β ** | β |
| **Fluence Testnet** | 52164803 | **β ** | β |
| **Reya Cronos Testnet** | 89346162 | **β ** | β |
| **Blast Sepolia Testnet** | 168587773 | β | **β ** |
| **Neon EVM Devnet** | 245022926 | **β ** | β |
| **Neon EVM Mainnet** | 245022934 | **β ** | β |
| **OP Interop Alpha 0 Testnet** | 420120000 | **β ** | β |
| **OP Interop Alpha 1 Testnet** | 420120001 | **β ** | β |
| **Polygon CDK Stavanger Testnet** | 686669576 | **β ** | β |
| **Eden Testnet** | 3735928814 | **β ** | β |
| **Arbitrum Blueberry Testnet** | 88153591557 | **β ** | β |
## Migration Checklist
* Create a free account at [dev.blockscout.com](https://dev.blockscout.com)
* Generate your API key (format: `proapi_xxxxxxxx`)
* Look up chain IDs for your target networks
* Update your API client to use `https://api.blockscout.com/v2/api`
* Replace your Etherscan API key with your Blockscout PRO API key
* Test core endpoints (account balance, transaction list, contract ABI)
* Monitor usage and credits in the [developer portal dashboard](https://dev.blockscout.com)
## Additional Blockscout feature set
An itemized list of over 60 features and views available on Blockscout that are not available on Optimistic Etherscan is [available here](https://docs.google.com/spreadsheets/d/1HGw9bh5Iq3xBZlrnrwVOzD_0844zt7PPakkuxVsiS1g/edit?usp=sharing).
* **DAppscout** DApp marketplace providing dapp discovery and interaction features.
* **BENS in addition to ENS support, protocols can submit their subgraphs to be supported. Blockscout allows multiple protocols to co-exist within a single network.**
* **Ads and banner control** - Ability to add, remove and curate your own ads/banners
* **Public tagging -** a central microservice allows tags enabled on mainnet to be shown on other chains. This is especially useful for malicious address display.
* **Vera and BytecodeDB Bytecode** - works for verification info on multiple chains
* **Roadmap, research and rollup-specific features**
* Rollup-specific feature support (e.g. Fault proofs)
* DA support (e.g. [Celestia](https://github.com/blockscout/blockscout/pull/10199))
## API Differences
The following details endpoint differences between the Optimistic Etherscan and Blockscout Optimism instances. Endpoints vary slightly for different chains.
### **1. Account/Address Endpoints**
`module=account`
| | Blockscout | Etherscan | Purpose |
| :- | :- | :- | :- |
| `action=eth_get_balance` | β | β | Mimics Ethereum JSON RPC's eth\_getBalance |
| `action=balance` | β | β | Get Ether Balance for Single Address |
| `action=balancemulti` | β | β | Get Ether Balance for Multiple Addresses |
| `action=pendingtxlist` | β | β | Get Pending Transactions by Address |
| `action=txlist` | β | β | Get Normal Transactions by Address |
| `action=txlistinternal` | β | β | Get Internal Transactions by Address |
| `action=tokentx` | β | β | Get ERC20 Token Transfers |
| `action=tokennfttx` | β | β | Get ERC721 Token Transfers |
| `action=token1155tx` | β | β | Get ERC1155 Token Transfers |
| `action=token404tx` | β | β | Get ERC-404 token transfer events by address |
| `action=tokenbalance` | β | β | Get Token Balance for Address |
| `action=tokenlist` | β | β | Get list of tokens owned by address |
| `action=getminedblocks` | β | β | Get list of blocks mined by address |
| `action=listaccounts` | β | β | Get a list of accounts and their balances |
| `action=txsBeaconWithdrawal` | β | β | Get Beacon Chain Withdrawals by Address and Block Range |
| `action=balancehistory` | β | β Β (PRO) | Get Historical Ether Balance for an Address By BlockNo |
### **2. Contract Endpoints**
### `module=contract`
| | Blockscout | Etherscan | Purpose |
| :- | :- | :- | :- |
| `action=listcontracts` | β | β | Get list of any deployed contract |
| `action=getabi` | β | β | Get Contract ABI for verified contracts |
| `action=getsourcecode` | β | β | Get contract source code for a verified contract |
| `action=getcontractcreation` | β | β | Get contract creator address hash and creation transaction hash |
| `action=verify` | β | β | Verify Contract with Source Code |
| `action=verifysourcecode` | β | β | Verify Contract with JSON file |
| `action=checkverifystatus` | β | β | Check Verification Status |
| `action=verifyproxycontract` | β | β | Get Internal Transactions by Address |
| `action=checkproxyverification` | β | β | Get ERC20 Token Transfers |
| `action=verify_via_sourcify` | β | β | Verify a contract through Sourcify |
| `action=verify_vyper_contract` | β | β | Verify a Vyper contract |
### **3. Transaction Endpoints**
### `module=transaction`
| | Blockscout | Etherscan | Purpose |
| :- | :- | :- | :- |
| `action=gettxinfo` | β | β | Get Transaction info including block number, sender, gas, +++ |
| `action=gettxreceiptstatus` | β | β | Get Transaction Receipt Status |
| `action=getstatus` | β | β | Get Transaction Execution Status |
### **4. Block Endpoints**
**module=block**
| | Blockscout | Etherscan | Purpose |
| :- | :- | :- | :- |
| `action=getblockreward` | β | β | Get Block Rewards |
| `action=getblockcountdown` | β | β | Get Block Countdown |
| `action=getblocknobytime` | β | β | Get Block Number by Time |
| `action=eth_block_number` | β | β | Mimics Ethereum JSON RPC's eth\_blockNumber. |
|
`action=dailyavgblocksize` | β | β Β (PRO) | Get Daily Average Block Size |
| `action=dailyblkcount` | β | β Β (PRO) | Get Daily Block Count and Rewards |
| `action=dailyblockrewards` | β | β Β (PRO) | Get Daily Block Rewards |
| `action=dailyavgblocktime` | β | β Β (PRO) | Get Daily Average Time for A Block to be Included in the chain |
| `action=dailyuncleblkcount` | β | β Β (PRO) | Get Daily Uncle Block Count and Rewards |
### **5. Token Endpoints**
### `module=token`
Note other endpoints contain token specific information including `module=stats` and `module=account`.
| | Blockscout | Etherscan | Purpose |
| :- | :- | :- | :- |
| action=getToken | β | β | Get Token Information |
| action=getTokenHolders | β | β | Get Token Holders |
| action=bridgedtokenlist | β | β | Get Bridged Tokens |
| action=tokenholderlist | β | β Β (PRO) | Get Token Holders |
| action=tokenholdercount | β | β Β (PRO) | Number of ERC20 token holders |
| action=tokeninfo | β | β Β (PRO) | Token project info |
### **6. Logs/Events Endpoints**
### `module=logs`
Both Etherscan and Blockscout use the getLogs endpoint which includes enhanced filtering capabilities.
* β `action=getLogs` - Get Event Logs by Address/Topics/Block Range
### **7. Proxy/ETH RPC Endpoints**
Etherscan uses the Proxy module `module=proxy` to retrieve standard Ethereum JSON-RPC methods.
For Blockscout, send post requests to\
**api.blockscout.com/\{chain\_id}/json-rpc**
The following methods are supported:
* eth\_blockNumber
* eth\_getBalance
* eth\_getLogs
* eth\_gasPrice
* eth\_getTransactionByHash
* eth\_getTransactionReceipt
* eth\_chainId
* eth\_maxPriorityFeePerGas
* eth\_getTransactionCount
* eth\_getCode
* eth\_getStorageAt
* eth\_estimateGas
* eth\_getBlockByNumber
* eth\_getBlockByHash
* eth\_sendRawTransaction
* eth\_call
### **8. Stats/Network Information**
### `module=stats`
In addition to these stats, Blockscout provides general chain stats via the [REST API](/devs/apis/rest).
| | Blockscout | Etherscan | Purpose |
| :- | :- | :- | :- |
| tokensupply | β | β | Get Token Information |
| ethsupplyexchange | β | β | total supply in Wei from exchange |
| ethsupply | β | β | Get total supply in Wei from DB |
| ethsupply2 | β | β | Get amount of Ether in circulation, ETH2 Staking rewards, EIP1559 burnt fees, and total withdrawn ETH from the beacon chain |
| coinsupply | β | β | Get total coin supply from DB minus burnt number |
| ethprice | β | β | Get latest price of native coin in USD and BTC |
| coinprice | β | β | Get latest price of native coin in USD and BTC in more general format |
| totalfees | β | β | Get total transaction fees in Wei paid by users to validators per day |
| chainsize | β | β | Get the size of the Ethereum blockchain, in bytes, over a date range. |
| nodecount | β | β (PRO) | Get total number of discoverable Ethereum nodes |
| dailytxnfee | β | β (PRO) | Get Daily Network Transaction Fee |
| dailynewaddress | β | β (PRO) | Get Daily New Address Count |
| dailynetutilization | β | β (PRO) | Get Daily Network Utilization |
| dailyavghashrate | β | β (PRO) | Get Daily Average Network Hash Rate |
| dailytx | β | β (PRO) | Get Daily Transaction Count |
| dailyavgnetdifficulty | β | β (PRO) | Get Daily Average Network Difficulty |
| ethdailyprice | β | β (PRO) | Get Ether Historical Price |
### **9. Gas Tracking**
**Etherscan Gas Tracker** (`module=gastracker`)
* β `action=gasoracle` - Get Gas Oracle
* β `action=gasestimate` - Get Gas Estimate
**Blockscout**
* β Gas information integrated into transaction and block data
## Supported Modules
Blockscout supports the core Etherscan-compatible modules:
* **`module=account`** β Balances, transaction lists, token transfers, internal transactions (plus Blockscout extras: `eth_get_balance`, `pendingtxlist`, `tokenbalance`, `tokenlist`, `listaccounts`)
* **`module=contract`** β ABI retrieval, source code, contract verification (plus: `listcontracts`, `getcontractcreation`, Vyper & Sourcify verification)
* **`module=transaction`** β Transaction status, receipt status (plus: `gettxinfo`)
* **`module=logs`** β Event logs by address, topics, and block range
* **`module=token`** β Token info, holder lists
* **`module=stats`** β Chain statistics, token supply, coin price
* **`module=block`** β Block rewards, countdown, block number by time
* **`module=gastracker`** β Gas oracle, gas estimates
## REST API (Beyond Etherscan Compatibility)
The PRO API also exposes Blockscout's modern REST API at:
```text theme={null}
https://api.blockscout.com/{chain_id}/api/v2/{endpoint}?apikey=proapi_YOUR_KEY
```
This provides capabilities not available through the Etherscan-compatible interface, including enriched address metadata, decoded transaction data, NFT details, smart contract read/write, and chain health monitoring.
## ETH RPC API
For standard Ethereum JSON-RPC methods, send POST requests to:
```text theme={null}
https://api.blockscout.com/{chain_id}/json-rpc
```
With your API key in the `authorization` header:
```bash theme={null}
curl -H "content-type: application/json" \
-H "authorization: Bearer proapi_YOUR_KEY" \
-X POST \
--data '{"id":0,"jsonrpc":"2.0","method":"eth_blockNumber","params":[]}' \
https://api.blockscout.com/10/json-rpc
```
Supported methods include `eth_blockNumber`, `eth_getBalance`, `eth_getLogs`, `eth_gasPrice`, `eth_getTransactionByHash`, `eth_getTransactionReceipt`, `eth_call`, `eth_estimateGas`, `eth_getBlockByNumber`, `eth_getBlockByHash`, `eth_sendRawTransaction`, and more.
## Common Migration Patterns
### JavaScript / Node.js
```javascript theme={null}
// Before (Etherscan V2)
const api = axios.create({
baseURL: "https://api.etherscan.io/v2/api",
params: { chainid: 1, apikey: process.env.ETHERSCAN_KEY }
});
// After (Blockscout PRO API β same structure, more chains, higher limits)
const BLOCKSCOUT_KEY = process.env.BLOCKSCOUT_KEY;
async function query(chainId, module, action, params = {}) {
const resp = await axios.get("https://api.blockscout.com/v2/api", {
params: {
chainid: chainId,
module,
action,
apikey: BLOCKSCOUT_KEY,
...params
}
});
return resp.data;
}
// Query Ethereum (chainid=1)
const ethBalance = await query(1, "account", "balance", { address: "0x..." });
// Query Base (chainid=8453) β same function, different chainid
const baseBalance = await query(8453, "account", "balance", { address: "0x..." });
```
### Python
```python theme={null}
import requests
# Before (Etherscan V2)
BASE_URL = "https://api.etherscan.io/v2/api"
API_KEY = os.environ["ETHERSCAN_KEY"]
resp = requests.get(BASE_URL, params={
"chainid": 1, "module": "account", "action": "balance",
"address": addr, "apikey": API_KEY
})
# After (Blockscout PRO API)
BLOCKSCOUT_KEY = os.environ["BLOCKSCOUT_KEY"]
def query(chainid, module, action, **params):
resp = requests.get("https://api.blockscout.com/v2/api", params={
"chainid": chainid,
"module": module,
"action": action,
"apikey": BLOCKSCOUT_KEY,
**params
})
return resp.json()
# Ethereum
eth_balance = query(1, "account", "balance", address="0x...")
# Optimism (chainid=10)
op_txns = query(10, "account", "txlist", address="0x...", sort="desc")
```
### Multichain Setup
```javascript theme={null}
// Both Etherscan V2 and Blockscout PRO API use the same pattern:
// unified base URL + chain ID. The switch is trivial.
const CHAINS = {
ethereum: 1,
optimism: 10,
base: 8453,
arbitrum: 42161,
scroll: 534352,
soneium: 1868, // Blockscout exclusive
ink: 57073, // Blockscout exclusive
};
async function getBalance(chainName, address) {
const chainId = CHAINS[chainName];
const res = await fetch(
`https://api.blockscout.com/v2/api?chainid=${chainId}&module=account&action=balance&address=${address}&apikey=${API_KEY}`
);
return res.json();
}
```
## Framework Compatibility
Blockscout works with the tools you already use:
* **Ethers.js** β [ethers.org provider docs](https://docs.ethers.org/v6/api/providers/thirdparty/#providers-blockscout)
* **Hardhat** β [@ericxstone/hardhat-blockscout-verify](https://www.npmjs.com/package/@ericxstone/hardhat-blockscout-verify)
* **Foundry** β [Foundry verification guide](https://docs.blockscout.com/devs/verification/foundry-verification)
* **Remix** β Direct deployment and verification support
## Beyond Etherscan Compatibility
Blockscout also provides a modern REST API with capabilities not available through Etherscan-compatible endpoints, including smart contract read/write interactions, advanced token metadata, NFT details, and chain health monitoring.
**β [REST API Documentation](https://docs.blockscout.com/devs/apis)**
## Start Free, Scale When Ready
No credit card. No chain restrictions. No surprise cutoffs.
**β [Get Your API Key](https://dev.blockscout.com)**
# Multichain Service
Source: https://docs.blockscout.com/devs/multichain-service
Aggregate hashes, tokens, and addresses across chains behind one Blockscout endpoint for unified search, token discovery, and multichain UX.
The Multichain service aggregates hashes and entities from multiple chains behind one endpoint.
* single search across chains
* token discovery without chain selection
* unified UX for hashes
| Handle | What it gives you | Why it is useful |
| - | - | - |
| `GET https://api.blockscout.com/multichain/api/v1/clusters/multichain/chains` | List of chains supported by Multichain service | Required to know which chains are indexed in multichain |
| `GET https://api.blockscout.com/multichain/api/v1/clusters/multichain/search:quick?q={query}&apikey=YOUR_KEY` | Multichain search results for addresses, blocks, transactions, tokens, NFTs, domains, and dapps | One search box across all supported chains |
## Examples
### Multichain token search
Use for:
* token discovery across all supported chains
* resolving multiple deployments (e.g. USDC on Ethereum, Arbitrum, Base)
* showing correct contract per chain
```bash theme={null}
curl "https://api.blockscout.com/multichain/api/v1/clusters/multichain/search:quick?q=usdc&apikey=YOUR_KEY"
```
### Multichain address / tx lookup
Use for:
* detecting which chain an address or transaction belongs to
* building a universal search bar
* avoiding chain selection UX
**Example (address):**
```bash theme={null}
curl "https://api.blockscout.com/multichain/api/v1/clusters/multichain/search:quick?q=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045&apikey=YOUR_KEY"
```
**Example (transaction):**
```bash theme={null}
curl "https://api.blockscout.com/multichain/api/v1/clusters/multichain/search:quick?q=0x4b03d69654a965de6a2fe907856a0e39a51a8ae25d9ddb8d97aa16ba5c1835e1&apikey=YOUR_KEY"
```
## Minimal flow
1. fetch supported chains
```bash theme={null}
curl "https://api.blockscout.com/multichain/api/v1/clusters/multichain/chains?apikey=YOUR_KEY"
```
2. user inputs query
3. call `search:quick`
4. render results grouped by type + chain
## TypeScript example
```ts theme={null}
const API_KEY = process.env.BLOCKSCOUT_API_KEY ?? "YOUR_KEY";
const QUERY = process.argv[2] ?? "usdc";
const base = "https://api.blockscout.com/multichain/api/v1/clusters/multichain";
async function getJson(url: string) {
const res = await fetch(url);
return res.json();
}
async function main() {
const chains = await getJson(`${base}/chains?apikey=${API_KEY}`);
console.log("Supported chains:", Object.keys(chains).length);
const searchUrl =
`${base}/search:quick?q=${encodeURIComponent(QUERY)}&apikey=${API_KEY}`;
const data = await getJson(searchUrl);
console.log(`\nQuery: ${QUERY}\n`);
for (const token of data.tokens ?? []) {
const chains = Object.keys(token.chain_infos ?? {});
console.log(`${token.symbol} | ${token.address_hash}`);
console.log(`chains: ${chains.join(", ")}`);
}
console.log("\nAddresses:", (data.addresses ?? []).length);
console.log("Transactions:", (data.transactions ?? []).length);
}
main();
```
## Supported chains
Fetch dynamically:
```bash theme={null}
GET https://api.blockscout.com/multichain/api/v1/clusters/multichain/chains
```
***
# PRO API general info
Source: https://docs.blockscout.com/devs/pro-api
Access multichain onchain data through one Blockscout PRO API key with expanded rate limits, unified billing, and REST plus RPC endpoints.
# Blockscout PRO API β Multichain Onchain Data, One API Key
Agents should visit [https://agents.blockscout.com/](https://agents.blockscout.com/) to set up optimized data workstreams
## The Problem
Building multichain? You're probably managing separate API keys, billing accounts, and rate limits for every chain you support. When a provider drops free-tier access or changes terms without warning, your app breaks.
Blockscout PRO API eliminates that fragmentation. One account, one API key, dozens of mainnets and testnets β with the same endpoint structure you already know.
## Why Developers Switch to Blockscout PRO API
### Multichain by Default
Access onchain data across all Blockscout-supported chains through a single API key. Add a new chain by changing a `chain_id` parameter β no new vendor setup, no duplicated integration work.
```text theme={null}
https://api.blockscout.com/v2/api?chain_id=1&module=account&action=balance&address=0x...&apikey=proapi_xxx
```
Swap `chain_id=1` for `chain_id=8453` (Base), `chain_id=10` (Optimism), `chain_id=534352` (Scroll), or any supported chain.
### What Chains are Supported?
The latest list is also available at [dev.blockscout.com](http://dev.blockscout.com) under supported chains.
### Etherscan-Compatible Endpoints
Already using Etherscan V2's unified API? Migration is trivial β the structure is nearly identical. Etherscan uses `api.etherscan.io/v2/api?chainid=`, Blockscout uses `api.blockscout.com/v2/api?chain_id=`. Same modules, same parameters β swap the base URL and key.
**β [Migration Guide: Etherscan to Blockscout](/devs/migrate-from-etherscan)**
All PRO API endpoints are documented individually in the API Reference menu.
Blockscout v12.0.0 will be released on 7 October, 2026 and roll out to hosted instances in a gradual fashion. It includes breaking changes for API integrators. Please see the [v12.0.0 release page](/blockscout-v12-0-0-api-updates-and-breaking-changes) for details.
### More Capacity at Every Tier
| | Blockscout PRO API | Etherscan |
| - | - | - |
| **Free** | 100K credits/day Β· 5 RPS Β· All chains | 3 RPS Β· Limited chains |
| **\$49/mo** | 100M credits Β· 15 RPS | 100K calls Β· 5 RPS |
| **\$199/mo** | 500M credits Β· 30 RPS | 200K calls Β· 10 RPS |
| **Enterprise** | Custom | Custom |
### Explorer-Enriched Data
PRO API serves the same indexed, decoded, and structured data that powers Blockscout explorers. That means token metadata, proxy implementations, internal transactions, and contract context β not just raw RPC responses.
## Built For
* **Dapps & Wallets** β Transaction history, token balances, NFTs, and contract activity across chains
* **AI Agents & Bots** β Structured onchain data for monitoring, automation, and AI-driven workflows
* **Analytics & Research** β Cross-chain behavior analysis, dashboards, and reporting
* **Operational Tooling** β Debugging, compliance workflows, and internal monitoring
## Get Started in 3 Steps
1. **Create an account** at [dev.blockscout.com](https://dev.blockscout.com)
2. **Generate your API key** β free tier starts immediately
3. **Query any supported chain** using familiar REST or JSON-RPC endpoints
No credit card required for the free tier. Upgrade when you're ready.
**β [Start Building](https://dev.blockscout.com)**
## Trusted Infrastructure
Blockscout powers explorers for 100+ L2s and scaling projects. The PRO API runs on the same infrastructure and data pipeline β formalized for production workloads with higher limits, real-time usage dashboards, and up to 50 API keys per account.
**β [View Supported Chains](https://chains.blockscout.com)** **β [API Documentation](/devs/apis)** **β [Developer Portal](https://dev.blockscout.com)**
# PRO API authorization, response headers, and routes
Source: https://docs.blockscout.com/devs/pro-api-responses-and-routes
Reference for Blockscout PRO API authorization, response headers, route list, pagination, and credit costs for REST and RPC endpoints.
Dev portal and free API key at [https://dev.blockscout.com/](https://dev.blockscout.com/)
Agents visit [https://agents.blockscout.com/](https://agents.blockscout.com/) to access optimized instructions
* [Authorization](#pro-api-authorization)
* [Routes](#pro-api-routes)
* [Pagination](#pagination)
* [Credits](#blockscout-credit-costs)
PRO API endpoints are documented individually in the API Reference menu.
Blockscout v12.0.0 will be released on 7 October, 2026 and roll out to hosted instances in a gradual fashion. It includes breaking changes for API integrators. Please see the [v12.0.0 release page](/blockscout-v12-0-0-api-updates-and-breaking-changes) for details.
# PRO API Authorization
Pass an API key using either:
* `apikey` query parameter
* `authorization` header
## PRO API Response Headers
The following information related to the PRO API plan is included in the response headers:
* **x-credits-remaining:** Number of credits remaining in your plan. If on the free plan, this will reset daily, otherwise it is monthly. You can check additional details in the [PRO API UI](https://dev.blockscout.com/).
* **x-ratelimit-limit:** Available RPS with your plan (can be -1 if there is an internal error)
* **x-ratelimit-remaining:** Remaining rate limit based on your queries (can be -1 if there is an internal error)
* **x-ratelimit-reset:** time in milliseconds until the rate limit resets (can be -1 if there is an internal error)
# PRO API Routes
All current API routes can be used with the PRO Plan. See the PRO API Endpoints section to try example calls with your API key.
The Route examples below use the Optimism chain (chain\_id=10). In previous per-instance routes API keys were optional for the free tier, but they are required for all tiers (including the free tier) of the PRO API.
## **JSON RPC API v2 (compare to Etherscan PRO API)**
PRO API Route:
```text wrap theme={null}
https://api.blockscout.com/v2/api?chain_id=10&module=block&action=eth_block_number&apikey=proapi_xxxxxxxx
```
Previous per-instance route:
`https://optimism.blockscout.com/api?module=block&action=eth_block_number`
## **JSON RPC API**
PRO API Route:
```text wrap theme={null}
https://api.blockscout.com/10/api?module=account&action=eth_get_balance&address={addressHash}&apikey=proapi_xxxxxxx
```
Previous per-instance route:
`https://optimism.blockscout.com/api?module=account&action=eth_get_balance&address={addressHash}`
## **REST API**
PRO API Route:
```text wrap theme={null}
https://api.blockscout.com/10/api/v2/blocks/{block_number_or_hash}?apikey=proapi_xxxxxxxx
```
Previous per-instance route:
`https://optimism.blockscout.com/api/v2/blocks/{block_number_or_hash}`
## **ETH RPC API**
See [ETH RPC docs](/devs/apis/rpc/eth-rpc) for more info on post requests.
PRO API Route:
```text theme={null}
curl -H "content-type: application/json" \
-H "authorization: Bearer proapi_xxxxxx" \
-X POST \
--data '{"id":0,"jsonrpc":"2.0","method":"eth_blockNumber","params":[]}' \
https://api.blockscout.com/10/json-rpc
```
Please see the [API reference section](/devs/apis) for specific endpoint info related to the various API routes.
# Pagination
Blockscout uses the keyset pagination method to quickly return results. By default an API response returns the first 50 results. To access additional results (in groups of 50), add the `next_page_params` to your query.
For example, open [**https://api.blockscout.com/10/api/v2/transactions?apikey=proapi\_xxxxxx**](https://api.blockscout.com/10/api/v2/transactions?apikey=proapi_xxxxxx) and scroll to the bottom of the response.
You will see the `next_page_params` object. Add the parameters from this object to your next query to receive the next 50 results.
[**https://api.blockscout.com/10/api/v2/transactions?apikey=proapi\_xxxxxx\&block\_number=148445196\&index=59\&items\_count=50**](https://api.blockscout.com/10/api/v2/transactions?apikey=proapi_xxxxxx\&block_number=148445196\&index=59\&items_count=50)
Repeat this process to continue receiving results in groups of 50 (remove params and substitute the new `next_page_params` found in the body of the query).
In this example, the query to receive the next 50 results would be:
[**https://api.blockscout.com/10/api/v2/transactions?apikey=proapi\_xxxxxx\&block\_number=148445366\&index=24\&items\_count=50**](https://api.blockscout.com/10/api/v2/transactions?apikey=proapi_xxxxxx\&block_number=148445366\&index=24\&items_count=50)
# Blockscout Credit Costs
Credit amounts vary based on resource usage for different calls. The number of credits required for different calls is subject to change based on current analytics and resource usage.
You can check your credits, top calls and overall usage in the dev portal dashboard at [https://dev.blockscout.com/](https://dev.blockscout.com/).
Credits are consumed per API call. The **default cost is 20 credits** for any endpoint not listed below.
* A request consumes credits once, no matter how many records the response contains. For example, a `txlist` call that returns 10,000 transactions costs the same as one that returns a single transaction.
* Etherscan-compatible RPC calls (`?module=...&action=...`, such as `txlist` and `tokentx`) are not listed in the table below, so they use the default cost of 20 credits per call.
## When credits run out
* **Free plan:** the 100K credit allowance resets **daily**. Once it is exhausted, further requests are rejected until the daily reset. Requests are not automatically served at a lower rate limit. They fail instead.
* **Paid plans:** the monthly credit allowance may continue into overage once exhausted, subject to your plan terms.
Track remaining credits with the `x-credits-remaining` response header or the [developer portal dashboard](https://dev.blockscout.com/), and upgrade your plan if you regularly hit the cap.
| Endpoint | Credits |
| :- | :-: |
| `default` (all unlisted endpoints) | 20 |
| `api/v2/search/quick` | 25 |
| `api/v2/transactions/:hash/logs` | 30 |
| `api/v2/transactions/:hash/token-transfers` | 30 |
| `api/v2/transactions/:hash/state-changes` | 30 |
| `api/v2/tokens` | 30 |
| `api/v2/tokens/:address_hash/transfers` | 30 |
| `api/v2/addresses/:address_hash/token-transfers` | 30 |
| `api/v2/addresses/:address_hash/logs` | 30 |
| `api/v2/transactions/:hash/internal-transactions` | 40 |
| `api/v2/addresses/:address_hash/internal-transactions` | 40 |
| `api/v2/smart-contracts/verification/config` | 40 |
| `api/v2/transactions/:hash/summary` | 50 |
| `api/v2/transactions/:hash/raw-trace` | 50 |
| `api/v2/addresses/:address_hash/coin-balance-history` | 50 |
*Last Updated February, 2026*
# Link to Blockscout
Source: https://docs.blockscout.com/devs/replace-links
Swap Etherscan and other block explorer links for Blockscout URLs across transactions, blocks, addresses, and tokens with simple URL replacement.
## Replace the primary explorer link
In most cases simply replacing the first part of the url is all that is needed to replace Etherscan with Blockscout.
For example, replace [https://etherscan.io/](https://etherscan.io/) with [https://eth.blockscout.com/](https://eth.blockscout.com/) in your code and the corresponding links to blocks, transactions, etc. will be mapped to Blockscout rather than Etherscan.
π’ Tx before replacement
[https://etherscan.io/tx/0x3e8c3aad50b2f8471400e3fe6b812f20c332846064dff8c25fadf783eefa68df](https://etherscan.io/tx/0x3e8c3aad50b2f8471400e3fe6b812f20c332846064dff8c25fadf783eefa68df)
π Tx after replacement
[https://eth.blockscout.com/tx/0x3e8c3aad50b2f8471400e3fe6b812f20c332846064dff8c25fadf783eefa68df](https://eth.blockscout.com/tx/0x3e8c3aad50b2f8471400e3fe6b812f20c332846064dff8c25fadf783eefa68df)
Blockscout linking architecture follows [EIP-3091](https://eips.ethereum.org/EIPS/eip-3091) standardization for the following routes:
* Blocks `/block/`
* Transactions `/tx/`
* Accounts `/address/`
* Tokens `/token/`
### UTM tags
We encourage adding UTM tags with your project information to Blockscout links. This helps us track referrals and improve our overall performance via metrics. Simply append `?utm_source=` to the end of any links pointing to Blockscout. For example, [https://eth.blockscout.com/?utm\_source=tenderly](https://eth.blockscout.com/?utm_source=tenderly).
### Common chain replacements
Replace the Etherscan url in your code with the Blockscout url for a seamless transition. All chains supported by Etherscan are also supported by Blockscout (along with many additional Blockscout chains). Some examples are below. For additional Blockscout chains see the [chains and projects](https://www.blockscout.com/chains-and-projects) page or the [chainscout json file which includes chainids](https://github.com/blockscout/chainscout/blob/main/data/chains.json).
| Chain | Etherscan β | Blockscout β |
| - | - | - |
| Ethereum | [https://etherscan.io/](https://etherscan.io/) | [https://eth.blockscout.com/](https://eth.blockscout.com/) |
| Ethereum Sepolia | [https://sepolia.etherscan.io/](https://sepolia.etherscan.io/) | [https://eth-sepolia.blockscout.com/](https://eth-sepolia.blockscout.com/) |
| Optimism | [https://optimistic.etherscan.io/](https://optimistic.etherscan.io/) | [https://optimism.blockscout.com/](https://optimism.blockscout.com/) |
| Optimism Sepolia | [https://sepolia-optimism.etherscan.io/](https://sepolia-optimism.etherscan.io/) | [https://optimism-sepolia.blockscout.com/](https://optimism-sepolia.blockscout.com/) |
| Base | [https://basescan.org/](https://basescan.org/) | [https://base.blockscout.com/](https://base.blockscout.com/) |
| Base Sepolia | [https://sepolia.basescan.org/](https://sepolia.basescan.org/) | [https://base-sepolia.blockscout.com/](https://base-sepolia.blockscout.com/) |
| Arbitrum | [https://arbiscan.io/](https://arbiscan.io/) | [https://arbitrum.blockscout.com/](https://arbitrum.blockscout.com/) |
| Arbitrum Sepolia | [https://sepolia.arbiscan.io/](https://sepolia.arbiscan.io/) | [https://arbitrum-sepolia.blockscout.com/](https://arbitrum-sepolia.blockscout.com/) |
| Polygon | [https://polygonscan.com/](https://polygonscan.com/) | [https://polygon.blockscout.com/](https://polygon.blockscout.com/) |
| Gnosis | [https://gnosisscan.io/](https://gnosisscan.io/) | [https://gnosis.blockscout.com/](https://gnosis.blockscout.com/) |
| Celo | [https://celoscan.io/](https://celoscan.io/) | [https://celo.blockscout.com/](https://celo.blockscout.com/) |
| Unichain | [https://uniscan.xyz/](https://uniscan.xyz/) | [https://unichain.blockscout.com/](https://unichain.blockscout.com/) |
### Exceptions
Some newer operations without standards are still handled differently by different explorers. For example:
* Blobs on Blockscout are accessed in different ways depending on the route. For example via the `?tab=blob_txs` query string following a block ([https://eth.blockscout.com/block/20822532?tab=blob\_txs](https://eth.blockscout.com/block/20822532?tab=blob_txs)) or the `?tab=blobs` query string following a transaction. Blobs on Etherscan are accessed via `#blobinfo` query string following a block (i.e. [https://etherscan.io/block/20822532#blobinfo](https://etherscan.io/block/20822532#blobinfo)).
* User Operations (EIP-4337) are displayed on Blockscout via the [https://eth.blockscout.com/ops](https://eth.blockscout.com/ops) url. On Etherscan there is currently no defined route, but User Operations can be viewed with the `Handle Ops` filter applied to the sender's address (i.e. [https://etherscan.io/advanced-filter?fadd=0x20e9695f25413f14e5807b530D0698bd4F155074\&mtd=0x1fad948c\~Handle+Ops\&ps=10\&p=8](https://etherscan.io/advanced-filter?fadd=0x20e9695f25413f14e5807b530D0698bd4F155074\&mtd=0x1fad948c~Handle+Ops\&ps=10\&p=8))
## Replace the API link
Per-instance API endpoints (e.g. `eth.blockscout.com/api`) are deprecated. Use the Blockscout PRO API instead: one key covers every Blockscout-supported chain. Get a free key at [dev.blockscout.com](https://dev.blockscout.com/).
Etherscan uses a subdomain link for api access. For example, for the Ethereum explorer the api link is [https://api.etherscan.io/](https://api.etherscan.io/) followed by your query, or for Optimism it is [https://api-optimistic.etherscan.io/](https://api-optimistic.etherscan.io/) followed by your query.
**To replace, use the PRO API base URL with the target chain's `chain_id`**, swapping Etherscan's `chainid` parameter for Blockscout's `chain_id`:
π’ Etherscan call
[https://api.etherscan.io/v2/api?chainid=1\&module=account\&action=balance\&address=0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae\&tag=latest\&apikey=YourApiKeyToken](https://api.etherscan.io/v2/api?chainid=1\&module=account\&action=balance\&address=0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae\&tag=latest\&apikey=YourApiKeyToken)
π Blockscout PRO API call
[https://api.blockscout.com/v2/api?chain\_id=1\&module=account\&action=balance\&address=0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae\&tag=latest\&apikey=YOUR\_PRO\_API\_KEY](https://api.blockscout.com/v2/api?chain_id=1\&module=account\&action=balance\&address=0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae\&tag=latest\&apikey=YOUR_PRO_API_KEY)
Unlike the old per-instance route, the PRO API requires a real key on every tier, including the free tier. Get one at [dev.blockscout.com](https://dev.blockscout.com/) before making requests.
Standard API routes on Etherscan work for your queries on Blockscout. We've structured our data calls to be consistent with Etherscan whenever possible. Swap `chain_id` to move between chains, for example `chain_id=8453` for Base or `chain_id=10` for Optimism. You can see supported calls in the [PRO API reference](/devs/pro-api-responses-and-routes).
If you require more varied or richer datasets consider replacing your JSON RPC calls with the [REST API from Blockscout](/devs/apis/rest). This free API features additional metadata, stats data, human readable transactions and more.
### API Exceptions
* Blockscout does not currently support most [Etherscan API PRO](https://docs.etherscan.io/api-pro/etherscan-api-pro) queries.
* Rate limits scale with your PRO API plan. See the [PRO API overview](/devs/pro-api) for plan details and credit costs.
## Replace your wallet block explorer link
Every wallet handles the explorer link differently, but typically wallets ship with Etherscan links by default. To change, simply go to settings and replace the Etherscan link with the Blockscout one. Here's how you do it in MetaMask.
1. Open MetaMask, click the dots to open the menu, and select Settings
2. Select Networks
3. Select the network where you want to change the explorer link
4. Find the block explorer url (i.e. [https://optimistic.etherscan.io/](https://optimistic.etherscan.io/)).
5. Change the url to Blockscout (i.e. [https://optimism.blockscout.com/](https://optimism.blockscout.com/)) and Save.
Repeat this process for all networks from the Networks screen.
# Build a multichain stats dashboard
Source: https://docs.blockscout.com/devs/stats-dashboard
Build a multichain daily transaction dashboard using the Blockscout PRO API and REST stats endpoints across supported networks with one API key.
## Build a simple multi-chain stats dashboard with Blockscout PRO API
This example uses REST methods with the PRO API. See the [PRO API overview](/devs/pro-api) for information on creating and using an API key.
See a dashboard in action in this blog post. [https://www.blog.blockscout.com/build-a-multichain-dashboard-with-blockscout-pro-api/](https://www.blog.blockscout.com/build-a-multichain-dashboard-with-blockscout-pro-api/)
Blockscout's extended chain coverage and curated stats endpoints allow you to create data dashboards covering multiple chains. In this brief example, we show the calls to get supported chain ids, select the chains you want to cover, and the stats to print.
The flow is simple on purpose:
* `config` gives you the supported chain IDs
* `chainscout` makes them human-readable and lets you exclude testnets
* `stats-service /lines` tells you which chart names are valid
* `stats-service /lines/newTxns` gives you the daily tx data
Here we show the basic calls needed to retrieve stats info along with a typescript example at the end.
Additional Blockscout stats endpoints and documentation are available at [https://blockscout.github.io/swaggers/services/stats/index.html](https://blockscout.github.io/swaggers/services/stats/index.html)
## Endpoint Summary
The following REST calls can be used to get data for a stats app:
| Load Data | API CALL | Purpose |
| - | - | - |
| 1. Get supported chains | `GET https://api.blockscout.com/api/json/config` | Get the list of chain IDs supported by PRO API (`result.chains`) |
| 2. Resolve chain metadata | `GET https://chains.blockscout.com/api/chains?chain_ids=...` | Resolve chain IDs into names, slugs, and mainnet/testnet metadata |
| 3. Discover available chart series | `GET https://api.blockscout.com/{chainid}/stats-service/api/v1/lines` | Discover which chart series are available for a given chain |
| 4. Fetch daily transactions | `GET https://api.blockscout.com/{chainid}/stats-service/api/v1/lines/newTxns?from=YYYY-MM-DD&to=YYYY-MM-DD&resolution=DAY` | Get daily transaction counts on one chain |
***
## Flow
### 1. Get supported chains
```bash theme={null}
curl "https://api.blockscout.com/api/json/config"
```
Use `result.chains` as the source of supported PRO chain IDs.
***
### 2. Resolve chain metadata
```bash theme={null}
curl "https://chains.blockscout.com/api/chains?chain_ids=1,10,100"
```
Use the response to turn raw chain IDs into something usable in a dashboard:
* chain name
* short name / slug
* mainnet vs testnet
### Example Result
```json wrap theme={null}
{
"1":{
"name":"Ethereum",
"description":"Decentralized global computing platform supporting smart contracts & P2P apps.",
"logo":"https://blockscout-icons.s3.us-east-1.amazonaws.com/ethereum.svg",
"ecosystem":"Ethereum",
"isTestnet":false,
"layer":1,
"rollupType":null,
"native_currency":"ETH",
"website":"https://ethereum.org/",
"explorers":[
{
"url":"https://eth.blockscout.com/",
"hostedBy":"blockscout"
}
]
},
"10":{
"name":"OP Mainnet",
"description":"Optimism is building an equitable Internet with their Superchain infra - this is the flagship Optimism Mainnet instance.",
"logo":"https://blockscout-icons.s3.us-east-1.amazonaws.com/op-mainnet.svg",
"ecosystem":[
"Optimism",
"Superchain"
],
"isTestnet":false,
"layer":2,
"settlementLayerChainId":"1",
"rollupType":"optimistic",
"native_currency":"ETH",
"website":"https://www.optimism.io/",
"explorers":[
{
"url":"https://explorer.optimism.io/",
"hostedBy":"blockscout"
}
]
},
"100":{
"name":"Gnosis",
"description":"Gnosis Chain is a feature-rich, user-centered blockchain ecosystem.",
"logo":"https://blockscout-icons.s3.us-east-1.amazonaws.com/gnosis.svg",
"ecosystem":"Gnosis",
"isTestnet":false,
"layer":1,
"rollupType":null,
"native_currency":"XDAI",
"website":"https://docs.gnosischain.com/",
"explorers":[
{
"url":"https://gnosis.blockscout.com/",
"hostedBy":"blockscout"
}
]
}
}
```
***
### 3. Discover available charts
```bash theme={null}
curl "https://api.blockscout.com/1/stats-service/api/v1/lines?apikey=YOUR_KEY"
```
This tells you which stats charts exist for that chain (in this case chainid = 1, which is Ethereum mainnet).
For a simple dashboard, you only need `newTxns`, but this endpoint is useful because it also shows what else you can chart later without guessing.
Typical follow-up uses:
* daily users
* gas usage
* blocks
* fees
* other precomputed time-series exposed by the stats service
***
### 4. Fetch daily transactions
```bash theme={null}
curl "https://api.blockscout.com/1/stats-service/api/v1/lines/newTxns?from=2026-02-19&to=2026-03-19&resolution=DAY&apikey=YOUR_KEY"
```
This returns the daily tx time series for that chain.
Run the same request for every mainnet chain you want to include.
***
## TypeScript example
This script:
* fetches supported chain IDs
* resolves chain metadata
* keeps mainnets only
* fetches `newTxns` for the last 30 days
* prints a daily tx table for each chain
```ts theme={null}
type ConfigResponse = {
result?: {
chains?: Array;
};
};
type ChainInfo = {
id?: string | number;
name?: string;
shortname?: string;
isTestnet?: boolean;
};
type ChainsResponse = {
items?: ChainInfo[];
};
type LinePoint = {
date?: string;
value?: string | number;
};
type LineResponse = {
chart_data?: LinePoint[];
};
const FROM = "2026-02-19";
const TO = "2026-03-19";
async function getJson(url: string): Promise {
const res = await fetch(url);
if (!res.ok) {
throw new Error(`Request failed: ${res.status} ${res.statusText} for ${url}`);
}
return res.json() as Promise;
}
async function main() {
const config = await getJson(
"https://api.blockscout.com/api/json/config"
);
const chainIds = (config.result?.chains ?? []).map(String);
if (!chainIds.length) {
throw new Error("No chain IDs returned from config");
}
const chains = await getJson(
`https://chains.blockscout.com/api/chains?chain_ids=${chainIds.join(",")}`
);
const mainnets = (chains.items ?? []).filter((chain) => !chain.isTestnet);
for (const chain of mainnets) {
const chainId = String(chain.id);
const chainName = chain.name ?? chain.shortname ?? chainId;
const url =
`https://api.blockscout.com/${chainId}/stats-service/api/v1/lines/newTxns` +
`?from=${FROM}&to=${TO}&resolution=DAY`;
try {
const data = await getJson(url);
const rows = data.chart_data ?? [];
if (!rows.length) continue;
console.log(`\n=== ${chainName} (${chainId}) ===`);
console.log("date | daily_txs");
console.log("-----------|----------");
for (const row of rows) {
const date = row.date ?? "";
const value = row.value ?? "";
console.log(`${date} | ${value}`);
}
} catch (err) {
console.error(`Failed for ${chainName} (${chainId})`, err);
}
}
}
main().catch((err) => {
console.error(err);
process.exit(1);
});
```
***
## Result
```text theme={null}
=== Ethereum (1) ===
date | daily_txs
-----------|----------
2026-02-19 | 1234567
2026-02-20 | 1200456
...
```
This can be used to:
* compare activity across mainnets
* dump results into CSV later
* feed a BI tool
* build a lightweight internal dashboard
***
# Build a crypto tax calculator with PRO API
Source: https://docs.blockscout.com/devs/tax-calculator
Fetch full wallet history including transactions, internal txs, and token transfers across chains with the Blockscout PRO API for tax reporting.
## Calculate my taxes β fetching full history with Blockscout PRO API
This example uses REST methods with the PRO API. See the [PRO API overview](/devs/pro-api) for information on creating and using an API key.
You can use the Blockscout API to collect your activity across multiple chains and feed it into an existing tax tool (or vibe code your own!).
The recommended approach combines pulling transactions from several feeds and combining them into a single data source.
In the typescript example at the end we follow this basic flow:
1. get supported chains
2. resolve β filter mainnets
3. fetch 1-year history per chain
4. merge + dedupe
5. output rows
## Endpoint Summary
The following REST calls can be used to get tax data. Note that `api/v2` calls require a working PRO API key.
| Handle | Why |
| - | - |
| `GET /api/json/config` | Get all supported chain IDs |
| `GET https://chains.blockscout.com/api/chains?chain_ids=...` | Resolve + filter mainnets |
| `GET /{chainid}/api/v2/addresses/{address}/transactions` | Top-level txs (fees + native transfers) |
| `GET /{chainid}/api/v2/addresses/{address}/internal-transactions` | Native value inside contract execution |
| `GET /{chainid}/api/v2/addresses/{address}/token-transfers` | ERC20 / NFT movements |
### Pull and Combine 3 feeds
**Transactions**
```text theme={null}
curl "https://api.blockscout.com/1/api/v2/addresses/0xYOURADDRESS/transactions?apikey=YOUR_KEY"
```
**Internal transactions**
```text theme={null}
curl "https://api.blockscout.com/1/api/v2/addresses/0xYOURADDRESS/internal-transactions?apikey=YOUR_KEY"
```
**Token transfers**
```text theme={null}
curl "https://api.blockscout.com/1/api/v2/addresses/0xYOURADDRESS/token-transfers?apikey=YOUR_KEY"
```
Complete the following programmatically.
* join by tx hash
* deduplicate
* normalize
## Pagination
REST responses use keyset pagination.
When a response includes `next_page_params`, copy that object and append its fields to the next request.
Example (params may include additional items such as value, hash, and date inserted that you won't use):
```json theme={null}
{
"items": [ ... ],
"next_page_params": {
"block_number": 24464759,
"index": 284,
"items_count": 50
}
}
```
Next request:
```bash theme={null}
curl "https://api.blockscout.com/1/api/v2/addresses/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045/transactions?block_number=24464759&index=284&items_count=50&apikey=YOUR_KEY"
```
Then repeat the same pattern with the new `next_page_params` from that response until empty.
***
## TypeScript example
```ts theme={null}
const API_KEY = process.env.API_KEY!;
const ADDRESS = "0x...";
const PRO = "https://api.blockscout.com";
async function getJson(url: string) {
const res = await fetch(url, { headers: { Authorization: API_KEY } });
return res.json();
}
async function* paginate(url: string) {
const u = new URL(url);
while (true) {
const data = await getJson(u.toString());
for (const item of data.items) yield item;
if (!data.next_page_params || !Object.keys(data.next_page_params).length) break;
for (const [k, v] of Object.entries(data.next_page_params)) {
u.searchParams.set(k, String(v));
}
}
}
async function main() {
const cfg = await getJson(`${PRO}/api/json/config`);
const chainIds = Object.keys(cfg.chains);
const chains = await getJson(
`https://chains.blockscout.com/api/chains?chain_ids=${chainIds.join(",")}`
);
const mainnets = Object.entries(chains)
.filter(([, c]: any) => !c.isTestnet)
.map(([id]) => id);
for (const chainId of mainnets) {
const base = `${PRO}/${chainId}/api/v2`;
for await (const tx of paginate(`${base}/addresses/${ADDRESS}/transactions?apikey=${API_KEY}`)) {
console.log("TX", chainId, tx.hash);
}
for await (const t of paginate(`${base}/addresses/${ADDRESS}/token-transfers?apikey=${API_KEY}`)) {
console.log("TOKEN", chainId, t.transaction_hash);
}
for await (const itx of paginate(`${base}/addresses/${ADDRESS}/internal-transactions?apikey=${API_KEY}`)) {
console.log("INTERNAL", chainId, itx.transaction_hash);
}
}
}
main();
```
# Blockscout PRO API use cases overview
Source: https://docs.blockscout.com/devs/use-cases-overview
Explore example Blockscout PRO API use cases including wallet history trackers, multichain stats dashboards, and crypto tax calculators.
The following example use cases use Blockscout PRO API methods.
Methods for a basic wallet or portfolio tracker
Create a multichain daily tx dashboard
Pull txs, internal txs and token transfers & combine
If you are accessing the PRO API via AI or an AI agent, direct the AI to this file to get started. [https://dev.blockscout.com/llms.txt](https://dev.blockscout.com/llms.txt)
# Smart Contract Verification
Source: https://docs.blockscout.com/devs/verification
Verify deployed smart contracts on Blockscout using source code, standard JSON input, Sourcify, Hardhat, Foundry, Remix, and other methods.
Once verified, a smart contract or token contract's source code becomes publicly available and verifiable, creating transparency and trust. It also allows for interactivity with methods directly through the Read and Write buttons.
There are many different ways to verify your contracts with Blockscout.
* [Blockscout UI](/devs/verification/blockscout-ui)
* [Verification API](/devs/verification/blockscout-smart-contract-verification-api)
* [Hardhat Plugin](/devs/verification/hardhat-verification-plugin)
* [Foundry Verification](/devs/verification/foundry-verification)
* [Sourcify Verification](/devs/verification/contracts-verification-via-sourcify)
* [Remix Verification](/devs/verification/remix-verification)
* [Stylus verification via API](/devs/verification/stylus-verification)
* [Thirdweb verification](/devs/verification/verification-via-thirdweb)
# Blockscout Smart Contract Verification API
Source: https://docs.blockscout.com/devs/verification/blockscout-smart-contract-verification-api
Verify Solidity and Vyper smart contracts on Blockscout programmatically, across any supported chain, using the PRO API's contract verification route.
Contract verification is available through the PRO API's Etherscan-compatible RPC route β `module=contract`. One key works across every Blockscout-supported chain: swap `chain_id` to move between them. Get a free key at [dev.blockscout.com](https://dev.blockscout.com/).
All calls in this guide share the same base pattern:
```text theme={null}
https://api.blockscout.com/v2/api?chain_id=&module=contract&action=&apikey=
```
Swap `` for the target chain (`1` for Ethereum, `8453` for Base, `11155111` for Sepolia, and so on β full list at [dev.blockscout.com](https://dev.blockscout.com/)).
Contract addresses, source code, and other variables in the examples below are illustrative. Replace them with your own contract's details.
If you're running a self-hosted Blockscout instance, or verifying on a chain the PRO API doesn't cover yet, the same actions work against that instance's own API directly β see the [Contract module RPC reference](/devs/apis/rpc/contract) for the per-instance version of these calls.
### License type
You can specify the license type of the smart contract as `string` or `number`. For example, for `GNU General Public License v2.0 (GNU GPLv2)` you could pass either `4` or `"gnu_gpl_v2"`.
We are supporting such types of license as:
```java theme={null}
1. No License (None)
2. The Unlicense (Unlicense)
3. MIT License (MIT)
4. GNU General Public License v2.0 (GNU GPLv2)
5. GNU General Public License v3.0 (GNU GPLv3)
6. GNU Lesser General Public License v2.1 (GNU LGPLv2.1)
7. GNU Lesser General Public License v3.0 (GNU LGPLv3)
8. BSD 2-clause "Simplified" license (BSD-2-Clause)
9. BSD 3-clause "New" Or "Revised" license* (BSD-3-Clause)
10. Mozilla Public License 2.0 (MPL-2.0)
11. Open Software License 3.0 (OSL-3.0)
12. Apache 2.0 (Apache-2.0)
13. GNU Affero General Public License (GNU AGPLv3)
14. Business Source License (BSL 1.1)
```
API license types:
```text theme={null}
none
unlicense
mit
gnu_gpl_v2
gnu_gpl_v3
gnu_lgpl_v2_1
gnu_lgpl_v3
bsd_2_clause
bsd_3_clause
mpl_2_0
osl_3_0
apache_2_0
gnu_agpl_v3
bsl_1_1
```
## Via flattened source code or standard JSON input
`action=verifysourcecode`
The same action handles both cases β set `codeformat` to `solidity-single-file` for a flattened contract, or `solidity-standard-json-input` for a standard JSON input file (the format most build tools, like Hardhat and Foundry, generate automatically).
| Parameter | Description |
| - | - |
| **codeformat** | `solidity-single-file` or `solidity-standard-json-input` |
| **contractaddress** | `string` containing the address hash of the contract |
| **contractname** | `string` name of the contract. Can be empty (`""`), just the name (`"ContractName"`), or path and name (`"contracts/contract_1.sol:ContractName"`) |
| **compilerversion** | `string` containing the compiler version for the contract |
| **sourceCode** | `string` standard input JSON or flattened Solidity code |
| optimizationUsed | `0`, `false`, `1`, or `true`. Set when `codeformat=solidity-single-file` |
| runs | `integer` optimization runs used during compilation. Set when `optimizationUsed` is `1` or `true` |
| evmversion | `string` EVM version. Set when `codeformat=solidity-single-file` |
| constructorArguments | optional `string` constructor argument data |
| autodetectConstructorArguments | optional `boolean` whether to auto-detect constructor arguments |
| licenseType | `string` or `number` license type β see [License type](#license-type) above |
| libraryname1 / libraryaddress1 | optional name and address of a linked library |
```json theme={null}
{
"message": "OK",
"result": "b080b96bd06ad1c9341c2afb7e3730311388544961acde94",
"status": "1"
}
```
The `result` is a `guid` β use it with [`checkverifystatus`](#check-verification-status) to poll for the outcome.
```sh cURL theme={null}
curl "https://api.blockscout.com/v2/api?chain_id=11155111&module=contract&action=verifysourcecode&apikey=" \
--form 'contractaddress="0xYourContractAddress"' \
--form 'sourceCode="// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.8.2 <0.9.0;
contract Storage {
uint256 number;
function store(uint256 num) public {
number = num;
}
function retrieve() public view returns (uint256){
return number;
}
}"' \
--form 'contractname="Storage"' \
--form 'codeformat="solidity-single-file"' \
--form 'compilerversion="v0.8.34+commit.80d5c536"' \
--form 'optimizationUsed="0"' \
--form 'evmversion="default"' \
--form 'licenseType="3"'
```
```js JavaScript theme={null}
const formData = new FormData();
formData.append("contractaddress", "0xYourContractAddress");
formData.append("sourceCode", sourceCode); // flattened Solidity or standard-json-input string
formData.append("contractname", "Storage");
formData.append("codeformat", "solidity-single-file"); // or "solidity-standard-json-input"
formData.append("compilerversion", "v0.8.34+commit.80d5c536");
formData.append("optimizationUsed", "0");
formData.append("evmversion", "default");
formData.append("licenseType", "3");
const response = await fetch(
"https://api.blockscout.com/v2/api?chain_id=11155111&module=contract&action=verifysourcecode&apikey=",
{ method: "POST", body: formData }
);
const data = await response.json();
```
```py Python theme={null}
import requests
files = {
"contractaddress": (None, "0xYourContractAddress"),
"sourceCode": (None, source_code), # flattened Solidity or standard-json-input string
"contractname": (None, "Storage"),
"codeformat": (None, "solidity-single-file"), # or "solidity-standard-json-input"
"compilerversion": (None, "v0.8.34+commit.80d5c536"),
"optimizationUsed": (None, "0"),
"evmversion": (None, "default"),
"licenseType": (None, "3"),
}
response = requests.post(
"https://api.blockscout.com/v2/api",
params={"chain_id": "11155111", "module": "contract", "action": "verifysourcecode", "apikey": ""},
files=files,
)
data = response.json()
```
## Via Sourcify
`action=verify_via_sourcify`
If the contract is already verified on [Sourcify](https://sourcify.dev/), Blockscout fetches the match from the [repo](https://repo.sourcify.dev/) automatically. Otherwise, upload the source files and JSON metadata file(s).
| Parameter | Description |
| - | - |
| **addressHash** | `string` containing the address hash |
| files | `array` with source and metadata files |
```json theme={null}
{
"message": "OK",
"result": {
"ABI": "[...]",
"CompilerVersion": "v0.8.34+commit.80d5c536",
"ContractName": "Storage",
"SourceCode": "// SPDX-License-Identifier: GPL-3.0..."
},
"status": "1"
}
```
```sh cURL theme={null}
curl "https://api.blockscout.com/v2/api?chain_id=11155111&module=contract&action=verify_via_sourcify&apikey=" \
--form 'addressHash="0xYourContractAddress"' \
--form 'files[0]=@./Storage.sol' \
--form 'files[1]=@./metadata.json'
```
```js JavaScript theme={null}
const formData = new FormData();
formData.append("addressHash", "0xYourContractAddress");
formData.append("files[0]", solFile); // File or Blob for the .sol source
formData.append("files[1]", metadataFile); // File or Blob for metadata.json
const response = await fetch(
"https://api.blockscout.com/v2/api?chain_id=11155111&module=contract&action=verify_via_sourcify&apikey=",
{ method: "POST", body: formData }
);
const data = await response.json();
```
```py Python theme={null}
import requests
files = {
"addressHash": (None, "0xYourContractAddress"),
"files[0]": ("Storage.sol", open("Storage.sol", "rb")),
"files[1]": ("metadata.json", open("metadata.json", "rb")),
}
response = requests.post(
"https://api.blockscout.com/v2/api",
params={"chain_id": "11155111", "module": "contract", "action": "verify_via_sourcify", "apikey": ""},
files=files,
)
data = response.json()
```
## Vyper contracts
`action=verify_vyper_contract`
| Parameter | Description |
| - | - |
| **addressHash** | `string` containing the address hash of the contract |
| **name** | `string` containing the name of the contract |
| **compilerVersion** | `string` containing the compiler version for the contract |
| **contractSourceCode** | `string` containing the source code of the contract |
| constructorArguments | optional `string` constructor argument data |
```json theme={null}
{
"message": "OK",
"result": {
"ABI": "[...]",
"CompilerVersion": "v0.3.7+commit.6020b8bb",
"ContractName": "VyperStorage",
"SourceCode": "# @version 0.3.7..."
},
"status": "1"
}
```
```sh cURL theme={null}
curl "https://api.blockscout.com/v2/api?chain_id=11155111&module=contract&action=verify_vyper_contract&apikey=" \
--form 'addressHash="0xYourContractAddress"' \
--form 'name="VyperStorage"' \
--form 'compilerVersion="v0.3.7+commit.6020b8bb"' \
--form 'contractSourceCode=""'
```
```js JavaScript theme={null}
const formData = new FormData();
formData.append("addressHash", "0xYourContractAddress");
formData.append("name", "VyperStorage");
formData.append("compilerVersion", "v0.3.7+commit.6020b8bb");
formData.append("contractSourceCode", vyperSourceCode);
const response = await fetch(
"https://api.blockscout.com/v2/api?chain_id=11155111&module=contract&action=verify_vyper_contract&apikey=",
{ method: "POST", body: formData }
);
const data = await response.json();
```
```py Python theme={null}
import requests
files = {
"addressHash": (None, "0xYourContractAddress"),
"name": (None, "VyperStorage"),
"compilerVersion": (None, "v0.3.7+commit.6020b8bb"),
"contractSourceCode": (None, vyper_source_code),
}
response = requests.post(
"https://api.blockscout.com/v2/api",
params={"chain_id": "11155111", "module": "contract", "action": "verify_vyper_contract", "apikey": ""},
files=files,
)
data = response.json()
```
Only single-file Vyper verification is confirmed on this route. If you need Vyper multi-part or Vyper standard-JSON-input verification specifically, those aren't confirmed to have a PRO API equivalent yet β use the [per-instance route](/devs/apis/rpc/contract) for those cases in the meantime.
## Multiple raw source files
Blockscout's REST API has a dedicated "multi-part" mode for submitting several unflattened `.sol` files at once. The PRO API's `verifysourcecode` action doesn't have a direct equivalent for that β instead, build a standard JSON input file (most toolchains generate one automatically, e.g. under `artifacts/build-info/` in Hardhat) and submit it with `codeformat=solidity-standard-json-input` in the [flattened / standard JSON section above](#via-flattened-source-code-or-standard-json-input). That covers the same multi-file case.
## Check verification status
`action=checkverifystatus`
`guid` is the value returned by `verifysourcecode`.
| Parameter | Description |
| - | - |
| **guid** | `string` used for identifying the verification attempt |
```json theme={null}
{
"message": "OK",
"result": "Pending in queue",
"status": "1"
}
```
Return options: `Pending in queue` | `Pass - Verified` | `Fail - Unable to verify` | `Unknown UID`
```sh cURL theme={null}
curl "https://api.blockscout.com/v2/api?chain_id=11155111&module=contract&action=checkverifystatus&guid=&apikey="
```
## Verify a proxy contract
`action=verifyproxycontract`, checked with `action=checkproxyverification`
Same route family as the actions above β pass the proxy's own address and Blockscout resolves and links the implementation contract.
| Parameter | Description |
| - | - |
| **address** | `string` containing the address hash of the proxy contract |
```json theme={null}
{
"message": "OK",
"result": "c32d204404f33ff38fee42394f7e671fd96314b3658d466a",
"status": "1"
}
```
Poll the result with `action=checkproxyverification&guid=`. Return options: `Verification in progress` | a success message naming the resolved implementation address | `A corresponding implementation contract was unfortunately not detected for the proxy address.` | `Unknown UID`
```sh cURL theme={null}
curl "https://api.blockscout.com/v2/api?chain_id=11155111&module=contract&action=verifyproxycontract&address=0xYourProxyAddress&apikey="
```
# Verify contracts using the Blockscout UI
Source: https://docs.blockscout.com/devs/verification/blockscout-ui
Verify Solidity and Vyper smart contracts directly from the Blockscout UI using seven input methods including flattened source, JSON, and Sourcify.
Verification is available for both Solidity and Vyper contracts. **Currently, there are 7 different types of inputs you can use for verification using the Blockscout UI.**
π·π»ββοΈ If preferred you can verify directly from your Hardhat or Foundry dev environment.
* [Hardhat Verification Plugin](/devs/verification/hardhat-verification-plugin)
* [Foundry Verification](https://hardhat.org/hardhat-runner/plugins/nomicfoundation-hardhat-verify)
To learn more about the smart contract verification Rust microservice and verification algorithm [see this page for developers](/setup/microservices/smart-contract-verification).
## Smart Contract Verification with Blockscout
1. Go to the Verify contract page *(Other -> Verify contract)*
2. Enter in the contract address you received during deployment. The dropdown will show you several available verification options. Select the one you would like to use and continue.
* [Solidity (Flattened source code)](/devs/verification#via-flattened-source-code)
* [Solidity (Standard JSON input)](/devs/verification/blockscout-ui#via-standard-json-input)
* [Solidity (Sourcify)](/devs/verification/contracts-verification-via-sourcify)
* [Solidity (Multi-part files)](/devs/verification/blockscout-ui#solidity-multi-part-files)
* [Vyper (Contract)](/devs/verification#vyper-contract)
* [Vyper (Multi-part files)](/devs/verification/blockscout-ui#vyper-multi-part-files-and-standard-json-input)
* [Vyper (Standard JSON input)](/devs/verification/blockscout-ui#vyper-multi-part-files-and-standard-json-input)
### Solidity (Flattened source code)
This verification method is recommended only for a single-file smart contract without any imports. For verification of contracts containing more than 1 file, a different verification method is recommended.
1. **Contract Address:** The `0x` address supplied on contract creation (added above)
2. **Is Yul contract:** Select if the contract is coded in Yul for efficiency.
3. **Include Nightly Builds**: Select if you want to show nightly builds.
4. **Compiler:** derived from the first line in the contract `pragma solidity X.X.X`. Use the corresponding compiler version rather than the nightly build.
5. **EVM Version:** Select the correct [EVM version](/setup/information-and-settings/evm-version-information) if known, otherwise use default.
6. **Optimization Enabled:** If you enabled optimization during compilation, select and enter the run value. 200 is the Solidity Compiler default value. Only change if you changed this value while compiling.
7. **Enter the Solidity Contract Code:** Copy-paste the source code of your smart contract as is.
8. **Add Contract Libraries:** Enter the name and 0x address for any required libraries called in the .sol file. You can add multiple contracts with the "+" button.
9. Click the `Verify and Publish` button.
10. If all goes well, you will see a checkmark β next to Code in the code tab, and an additional tab called `Read Contract`. The contract name will now appear in BlockScout with any transactions related to your contract.
### Solidity (Standard JSON input)
[More information on JSON input is available here](https://docs.soliditylang.org/en/latest/using-the-compiler.html#input-description).
1. **Include nightly builds**. You can choose **Yes** or **No** depending on your compiler.
2. **Compiler.** Choose the compiler version used to compile your smart contract. If you selected yes for nightly builds, use the compiler version rather than the build.
3. **Standard Input JSON.** Upload your Standard Input JSON file. File should follow solidity [format](https://docs.soliditylang.org/en/latest/using-the-compiler.html#input-description) and all the sources must be in Literal Content format, not a URL.
Click the **Verify & publish** button and wait for the response.
### Via Sourcify: Sources and metadata JSON file
See the [Contract Verification via Sourcify](/devs/verification/contracts-verification-via-sourcify) page for details.
### Solidity (Multi-part files)
See the above settings. You will upload all of the .sol or .yul files you used for your contract. This method requires at least 2 files - if you have a single file use the flattened source code method.
### Vyper Contract
1. **Contract Name:** Name assigned to the contract.
2. **Compiler**: Select the compiler version used in the source code.
3. **EVM Version:** Select the correct [EVM version](/setup/information-and-settings/evm-version-information) if known, otherwise use default.
4. **Contract Code:** Copy and paste the contract code
5. Click the `Verify and Publish` button.
If all goes well, you will see a checkmark β next to Code in the code tab, and an additional tab called `Read Contract`. The contract name will now appear in BlockScout with any transactions related to your contract.
### Vyper Multi-part files and standard json input
See the information above.
## Troubleshooting
If you receive the dreaded `There was an error compiling your contract` message this means the bytecode doesn't match the supplied source code. Unfortunately, there are many reasons this may be the case. Here are a few things to try:
1. Double check the compiler version is correct.
Check all version digits - for example 0.5.1 is different from 0.5.10
2. Check that an extra space has not been added to the end of the contract. When pasting in, an extra space may be added. Delete this and attempt to recompile.
3. Copy, paste, and verify your source code in Remix. You may find some exceptions here.
### Verification in a dev environment
The [Hardhat verification plugin](/devs/verification/hardhat-verification-plugin) supports BlockScout. You can also choose to use the [Sourcify plugin](/devs/verification/hardhat-verification-plugin/sourcify-plugin-for-hardhat) to verify with Sourcify from your hardhat environment. [Foundry supports blockscout verification with Forge](https://book.getfoundry.sh/reference/forge/forge-verify-contract).
# Verify contracts via Sourcify on Blockscout
Source: https://docs.blockscout.com/devs/verification/contracts-verification-via-sourcify
Verify smart contracts on Blockscout using the Sourcify verification option, matching metadata and source files against Sourcify's decentralized repo.
Along with contract verification through a flattened source file (the default option in Blockscout), a [Sourcify](https://sourcify.dev/) verification option through their UI is also available.
## Usage Example
Verify your contract using Sourcify:
1\) Go to the Verify contract page *(Other -> Verify contract)*
2\) Enter the deployed contract address, select Sourcify (Solidity or Vyper) from the Verification method dropdown.
3\) Now follow the instructions inside the Sourcify widget. Select the smart contract language of the source code and a verification method.
4\) Upload or paste your contract source code according to the selected verification method. In the example, we paste the contract sources as Std JSON into the text box. Select the compiler version and contract identifier.
Once all information is provided, start the verification by clicking the Verify Contract button.
5\) You can follow the verification process by clicking on the View Job Status button.
After several seconds your contract should be verified through Sourcify's API (If verification fails, you will see the reason in the job status page). Verification metadata will be saved in the Blockscout DB and you will see the verified contract page with the link to the same metadata in the [Sourcify contract repository](https://repo.sourcify.dev/).
### Example Contract:
* Contract [verified in Blockscout](https://gnosis.blockscout.com/address/0x4f15a6e74CFC2F80D5967a8aB75F3c83D8043cF4?tab=contract)
* The same contract in the [Sourcify contract repository](https://repo.sourcify.dev/contracts/full_match/100/0x4f15a6e74CFC2F80D5967a8aB75F3c83D8043cF4/).
# Verify smart contracts with Foundry Forge
Source: https://docs.blockscout.com/devs/verification/foundry-verification
Verify Solidity smart contracts on Blockscout directly from the Foundry toolchain using Forge's built-in verification support and CLI flags.
[Foundry](https://github.com/foundry-rs/foundry/) is a smart contract development toolchain. Foundry manages your dependencies, compiles your project, runs tests, deploys, and lets you interact with the chain from the command line and via Solidity scripts.
Forge is a command-line tool that ships with Foundry. Forge tests, builds, and deploys your smart contracts. Forge supports contract verification out of the box ([https://www.getfoundry.sh/reference/forge/verify-contract](https://www.getfoundry.sh/reference/forge/verify-contract)).
## Verify contract
In forge, contracts can be verified at the time of deployment (e.g. using `forge script` or `forge create`), or later if the contracts are already deployed (e.g. using `forge verify-contract`).
This guide uses the Blockscout PRO API, which covers every Blockscout-supported chain with a single key. Swap the `chain_id` value to move between chains, no per-chain setup required. Get a free key at [dev.blockscout.com](https://dev.blockscout.com/).
#### Tips:
1. Specify the `--verifier=blockscout` flag to use the Blockscout verification provider.
2. Specify `--verifier-url="https://api.blockscout.com/v2/api?chain_id="`, swapping `` for the chain you deployed to (e.g. `chain_id=1` for Ethereum mainnet, `chain_id=8453` for Base). See the full list of supported chains at [dev.blockscout.com](https://dev.blockscout.com/).
3. Pass your PRO API key with `--etherscan-api-key `. Forge uses this flag name for all Etherscan-compatible verifiers, including Blockscout.
4. You can specify most configuration options (e.g., evm version, disabling optimizations) via the usual [Forge configuration](https://www.getfoundry.sh/config/compiler).
### Example (Deploy and verify)
Verify a contract with Blockscout right after deployment:
```sh theme={null}
forge create \
--rpc-url \
--private-key $PRIVATE_KEY \
: \
--verify \
--verifier blockscout \
--verifier-url "https://api.blockscout.com/v2/api?chain_id=" \
--etherscan-api-key
```
Or if using Foundry scripts:
```sh theme={null}
forge script \
--rpc-url \
--private-key $PRIVATE_KEY \
--broadcast \
--verify \
--verifier blockscout \
--verifier-url "https://api.blockscout.com/v2/api?chain_id=" \
--etherscan-api-key
```
### Example (Verify already deployed contract)
```sh theme={null}
forge verify-contract \
--rpc-url \
\
: \
--verifier blockscout \
--verifier-url "https://api.blockscout.com/v2/api?chain_id=" \
--etherscan-api-key
```
Or if using Foundry scripts for the last executed script run:
```sh theme={null}
forge script \
--rpc-url \
--private-key $PRIVATE_KEY \
--resume \
--verify \
--verifier blockscout \
--verifier-url "https://api.blockscout.com/v2/api?chain_id=" \
--etherscan-api-key
```
## Verifying against a specific instance
If you're running a self-hosted Blockscout instance, or verifying on a chain the PRO API doesn't cover yet, point Forge at that instance's own API instead. No API key is required for this route.
```sh theme={null}
forge verify-contract \
--rpc-url \
\
: \
--verifier blockscout \
--verifier-url /api/
```
Make sure to add `/api/` to the end of the Blockscout homepage explorer URL (e.g., `--verifier-url=https://eth-sepolia.blockscout.com/api/`). The same `--verify` flag works with `forge create` and `forge script`, following the patterns above.
For the PRO API, yes. Get a free key at [dev.blockscout.com](https://dev.blockscout.com/). For the per-instance route, no: any non-empty string works, or you can drop `--etherscan-api-key` entirely.
Every Blockscout-indexed mainnet and testnet, under one key. Check the current list at [dev.blockscout.com](https://dev.blockscout.com/).
## Resources
Learn more about Forge's verification flags at [https://www.getfoundry.sh/reference/forge/verify-contract](https://www.getfoundry.sh/reference/forge/verify-contract)
# Verify contracts with the Hardhat plugin on Blockscout
Source: https://docs.blockscout.com/devs/verification/hardhat-verification-plugin
Verify smart contracts on Blockscout with the hardhat-verify plugin, including setup steps for Hardhat 3 native support and Hardhat 2 configuration.
> ## Documentation Index
>
> Fetch the complete documentation index at: [https://docs.blockscout.com/llms.txt](https://docs.blockscout.com/llms.txt) Use this file to discover all available pages before exploring further.
# Verify contracts with the Hardhat plugin
> Verify smart contracts on Blockscout from your Hardhat project using the hardhat-verify plugin, on either Hardhat 3 (native Blockscout support, Pro API key optional) or Hardhat 2 (per-instance API).
[Hardhat](https://hardhat.org/) is a full-featured development environment for contract compilation, deployment and verification. The [hardhat-verify plugin](https://hardhat.org/hardhat-runner/plugins/nomicfoundation-hardhat-verify) supports contract verification on Blockscout. The setup differs depending on which major version of Hardhat your project uses, since the plugin's config format changed between Hardhat 2 and Hardhat 3.
A plain `npm install @nomicfoundation/hardhat-verify` installs v3, which targets **Hardhat 3**. If your project is using Hardhat 2, install with the `@hh2` tag instead (`@nomicfoundation/hardhat-verify@hh2`). Check which version applies to you before following the steps below.
## Hardhat 3
Hardhat 3's hardhat-verify plugin (v3.1.0+) has built-in Blockscout support. As of v3.1.0, it also supports an `apiKey` to use the Blockscout [Pro API](https://docs.blockscout.com/devs/pro-api).
### 1) Install Hardhat and the plugin
```sh theme={null}
npm install --save-dev hardhat @nomicfoundation/hardhat-verify
```
### 2) Register the plugin
```ts theme={null}
import { defineConfig } from "hardhat/config";
import hardhatVerify from "@nomicfoundation/hardhat-verify";
export default defineConfig({
plugins: [hardhatVerify],
// ...rest of your config
});
```
### 3) Configure Blockscout (if your instance needs an API key)
A key is required for any publicly hosted Blockscout chain. A private, self-hosted instance or Autoscout instance is a separate case and may not require one. Add your Pro API key under `verify.blockscout`:
```ts theme={null}
import { configVariable, defineConfig } from "hardhat/config";
import hardhatVerify from "@nomicfoundation/hardhat-verify";
export default defineConfig({
plugins: [hardhatVerify],
verify: {
blockscout: {
// For Pro API interface.
// Obtain at https://dev.blockscout.com/
apiKey: configVariable("BLOCKSCOUT_API_KEY"),
},
},
// ...rest of your config
});
```
We recommend using a [configuration variable](https://hardhat.org/docs/learn-more/configuration-variables) (as shown above) rather than hardcoding the key in your config file.
You can disable Blockscout verification entirely by setting `enabled: false` under `verify.blockscout`.
### 4) Verify
```sh theme={null}
npx hardhat verify blockscout --network DEPLOYED_CONTRACT_ADDRESS "Constructor argument 1"
```
Omitting `blockscout` runs verification against every configured provider (Etherscan, Blockscout, Sourcify); passing it explicitly scopes the run to Blockscout only.
### Programmatic verification
```ts theme={null}
import hre from "hardhat";
import { verifyContract } from "@nomicfoundation/hardhat-verify/verify";
await verifyContract(
{
address: "DEPLOYED_CONTRACT_ADDRESS",
constructorArgs: ["Constructor argument 1"],
provider: "blockscout",
},
hre,
);
```
`verifyContract` isn't re-exported from the Hardhat toolboxes β install the plugin directly and import from `@nomicfoundation/hardhat-verify/verify`.
## Hardhat 2
This is Hardhat 2 syntax β install with `@nomicfoundation/hardhat-verify@hh2`. There's no native Blockscout shortcut on this path, you configure `customChains` manually, as shown below. A Pro API key is now required for any publicly hosted Blockscout chain.
### **1) Install Hardhat**
If you are starting from scratch, create an npm project by going to an empty folder, running `npm init`, and following the instructions. Recommend npm 7 or higher.
Once your project is ready:
**npm instructions**
```sh theme={null}
npm install --save-dev hardhat
```
**yarn instructions**
```sh theme={null}
yarn add --dev hardhat
```
### **2) Create a project**
Run `npx hardhat` in your project folder and follow the instructions to create ([more info here](https://hardhat.org/getting-started/#quick-start)).
### 3) Install plugin
Install the [hardhat-verify plugin](https://hardhat.org/hardhat-runner/plugins/nomicfoundation-hardhat-verify)
**npm**
```sh theme={null}
npm install --save-dev @nomicfoundation/hardhat-verify@hh2
```
**yarn**
```sh theme={null}
yarn add --dev @nomicfoundation/hardhat-verify@hh2
```
Note the `@hh2` tag above β plain `npm install @nomicfoundation/hardhat-verify` now installs v3 (Hardhat 3), which uses a different config format entirely (see the Hardhat 3 section above).
### 4) Add plugin reference to config file
Add the following statement to your `hardhat.config.js`.
```javascript theme={null}
require("@nomicfoundation/hardhat-verify");
```
If using TypeScript, add this to your `hardhat.config.ts`. [More info on using typescript with hardhat available here](https://hardhat.org/guides/typescript.html#typescript-support).
```ts theme={null}
import "@nomicfoundation/hardhat-verify";
```
## Config File and Unsupported Networks
Your basic [Hardhat config file](https://hardhat.org/config/) (`hardhat.config.js` or `hardhat.config.ts`) will be set up to support the network you are working on. In this example we use the Optimism Sepolia test network and a `.ts` file.
Here we add an RPC url without an API key, however some value is still required. You can use any arbitrary string. [More info](https://hardhat.org/hardhat-runner/plugins/nomicfoundation-hardhat-verify#multiple-api-keys-and-alternative-block-explorers).
In order to use Blockscout explorer for the verification, you have to specify the explorer details under a `customChains` object. It includes:
* `chainId` - Network chain ID
* `apiURL` - Block explorer API URL
* `browserURL` - Block explorer URL
Find an extensive list of ChainIDs at [https://chainlist.org/](https://chainlist.org/).
Note the network name in `customChains` must match the network name in the `apiKey` object.
```ts theme={null}
import { HardhatUserConfig, vars } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";
import "@nomicfoundation/hardhat-verify";
const PRIVATE_KEY = vars.get("PRIVATE_KEY");
// Get a free key at https://dev.blockscout.com/
const BLOCKSCOUT_API_KEY = vars.get("BLOCKSCOUT_API_KEY");
const CHAIN_ID = 11155420;
const config: HardhatUserConfig = {
solidity: "0.8.24",
networks: {
'optimism-sepolia': {
url: 'https://sepolia.optimism.io',
accounts: [PRIVATE_KEY],
chainId: CHAIN_ID,
},
},
etherscan: {
apiKey: {
'optimism-sepolia': BLOCKSCOUT_API_KEY
},
customChains: [
{
network: "optimism-sepolia",
chainId: CHAIN_ID,
urls: {
apiURL: `https://api.blockscout.com/${CHAIN_ID}/api`,
browserURL: "https://optimism-sepolia.blockscout.com/",
}
}
]
},
sourcify: {
enabled: false
}
};
export default config;
```
### Verifying on multiple chains
If you deploy to more than one network, you don't need a separate config block per chain. Define your chains once in an array and generate `networks`, `etherscan.apiKey`, and `customChains` from it:
```ts theme={null}
import { HardhatUserConfig, vars } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";
import "@nomicfoundation/hardhat-verify";
const PRIVATE_KEY = vars.get("PRIVATE_KEY");
// Get a free key at https://dev.blockscout.com/
const BLOCKSCOUT_API_KEY = vars.get("BLOCKSCOUT_API_KEY");
// Add a new chain by adding one line here.
const CHAINS = [
{ network: "optimism-sepolia", chainId: 11155420, rpc: "https://sepolia.optimism.io", explorer: "optimism-sepolia" },
{ network: "base-sepolia", chainId: 84532, rpc: "https://sepolia.base.org", explorer: "base-sepolia" },
{ network: "optimism", chainId: 10, rpc: "https://mainnet.optimism.io", explorer: "optimism" },
{ network: "base", chainId: 8453, rpc: "https://mainnet.base.org", explorer: "base" },
{ network: "arbitrum-one", chainId: 42161, rpc: "https://arb1.arbitrum.io/rpc", explorer: "arbitrum" },
];
const config: HardhatUserConfig = {
solidity: "0.8.24",
networks: Object.fromEntries(
CHAINS.map(({ network, chainId, rpc }) => [
network,
{ url: rpc, accounts: [PRIVATE_KEY], chainId },
])
),
etherscan: {
apiKey: Object.fromEntries(
CHAINS.map(({ network }) => [network, BLOCKSCOUT_API_KEY])
),
customChains: CHAINS.map(({ network, chainId, explorer }) => ({
network,
chainId,
urls: {
apiURL: `https://api.blockscout.com/${chainId}/api`,
browserURL: `https://${explorer}.blockscout.com/`,
},
})),
},
sourcify: {
enabled: false,
},
};
export default config;
```
Run `npx hardhat verify --list-networks` at any time to confirm which network identifiers are registered in your config.
## Deploy and Verify
For deployment we will use [Hardhat Ignition](https://hardhat.org/ignition/docs/getting-started#overview) - built-in Hardhat deployment system.
### Deploy
```txt theme={null}
> npx hardhat ignition deploy ./ignition/modules/Lock.ts --network optimism-sepolia
β Confirm deploy to network optimism-sepolia (11155420)? β¦ yes
Compiled 1 Solidity file successfully (evm target: paris).
Hardhat Ignition π
Deploying [ LockModule ]
Batch #1
Executed LockModule#Lock
[ LockModule ] successfully deployed π
Deployed Addresses
LockModule#Lock - 0xFE826b33e425f99ce962ACB91752DB41F302EFEA
```
### Verify
The plugin requires you to include constructor arguments with the verify task and ensures that they correspond to expected ABI signature. However, Blockscout ignores those arguments, so you may specify any values that correspond to the ABI.
```sh theme={null}
npx hardhat verify --network DEPLOYED_CONTRACT_ADDRESS "Constructor argument 1"
```
Optimism Sepolia example.
```sh theme={null}
> npx hardhat verify --network optimism-sepolia 0xFE826b33e425f99ce962ACB91752DB41F302EFEA 1234
Successfully submitted source code for contract
contracts/Lock.sol:Lock at 0xFE826b33e425f99ce962ACB91752DB41F302EFEA
for verification on the block explorer. Waiting for verification result...
Successfully verified contract Lock on the block explorer.
https://optimism-sepolia.blockscout.com/address/0xFE826b33e425f99ce962ACB91752DB41F302EFEA#code
```
If you're using the multi-chain config, the same command works unchanged for any chain in your `CHAINS` array β just swap `--network optimism-sepolia` for `--network base`, `--network arbitrum-one`, etc.
### Automatically verified contracts
Sometimes the contract may be automatically verified via [Ethereum Bytecode Database](https://docs.blockscout.com/about/features/ethereum-bytecode-database-microservice#solution-ethereum-bytecode-database-blockscout-ebd) service. In that case you may see the following response:
```txt theme={null}
The contract 0xFE826b33e425f99ce962ACB91752DB41F302EFEA has already been verified on Etherscan.
https://optimism-sepolia.blockscout.com/address/0xFE826b33e425f99ce962ACB91752DB41F302EFEA#code
```
In that case, you may try to enforce using `--force` flag\*.
It prevents Hardhat from checking if the contract is already verified, and forces it to send a verification request anyway. Notice, that it is helpful only if the contract was automatically verified **partially**. That way, new verification sources would be saved. If the contract was **fully** verified already, that just returns an error.
```sh theme={null}
npx hardhat verify --network DEPLOYED_CONTRACT_ADDRESS "Constructor argument 1" --force
```
* The flag is available starting from `@nomicfoundation/hardhat-verify@2.0.7`
## Confirm Verification on BlockScout
Go to your BlockScout instance and paste the contract address into the search bar.
Scroll down to see verified status. A green checkmark β means the contract is verified.
If your screen size is limited, you may need to click the 3 dots to view and click through to the contract.
Scroll down to see and interact with the contract code.
## Video example
Community video created by Carlos Rodriguez for the Soneium Minato testnet, but can be applicable to any chain.
## FAQ
Although you receive an error, the contracts should be verified during the previous steps and you can ignore. Check in the explorer to make sure the contracts have been verified.
Yes, but one Pro API key covers every hosted chain. On Hardhat 2, each network still needs its own entry in the `apiKey` object (the network name in `customChains` must match a key in `apiKey`), but the value should be the same real key repeated for every network.
Yes, on both. Hardhat 3's `hardhat-verify@3.1.0+` has a native shortcut β pass your key via `verify.blockscout.apiKey` and the plugin handles routing for you. Hardhat 2 (`@hh2`) has no such shortcut, but reaches the same Pro API by configuring `customChains` manually. Point `apiURL` at `https://api.blockscout.com/CHAIN_ID/api` (replacing `CHAIN_ID` with the target chain's numeric ID) and set a real key under `etherscan.apiKey`, as shown above.
No. A self-hosted Blockscout instance, or one you've spun up with Autoscout, runs its own singular API and isn't part of the Pro API network β no key required. Point `apiURL` at that instance's own address (e.g. `https://your-instance.example/api`) instead of `api.blockscout.com`.
## Resources
Learn more about plugin configs, troubleshooting etc. at [https://hardhat.org/hardhat-runner/plugins/nomicfoundation-hardhat-verify](https://hardhat.org/hardhat-runner/plugins/nomicfoundation-hardhat-verify) (Hardhat 2) or [https://hardhat.org/docs/plugins/hardhat-verify](https://hardhat.org/docs/plugins/hardhat-verify) (Hardhat 3).
# Sourcify plugin for Hardhat
Source: https://docs.blockscout.com/devs/verification/hardhat-verification-plugin/sourcify-plugin-for-hardhat
Submit deployed contract sources to Sourcify from your Hardhat project so Blockscout can display verified metadata alongside on-chain contracts.
Similar to the [hardhat verification plugin](/devs/verification/hardhat-verification-plugin), this plugin submits the contract source and other info of all deployed contracts to Sourcify.
### Verify
Similar to the verification approach described in the [hardhat verification plugin](/devs/verification/hardhat-verification-plugin), you can verify the contract source code in Sourcify as well by setting the following in the hardhat config file:
```javascript theme={null}
// ...
const config: HardhatUserConfig = {
// ...
sourcify: {
enabled: true
},
// ...
};
export default config;
```
```sh theme={null}
npx hardhat verify --network DEPLOYED_CONTRACT_ADDRESS "Constructor argument 1"
```
Optimism Sepolia example:
```sh theme={null}
> npx hardhat verify --network optimism-sepolia 0xCD562a6426b474390A9E7e554b9B4f9f62Ea38Ba 1234
Successfully submitted source code for contract
contracts/Lock.sol:Lock at 0xCD562a6426b474390A9E7e554b9B4f9f62Ea38Ba
for verification on the block explorer. Waiting for verification result...
Successfully verified contract Lock on the block explorer.
https://optimism-sepolia.blockscout.com/address/0xCD562a6426b474390A9E7e554b9B4f9f62Ea38Ba#code
Successfully verified contract Lock on Sourcify.
https://repo.sourcify.dev/contracts/full_match/11155420/0xCD562a6426b474390A9E7e554b9B4f9f62Ea38Ba/
```
## Confirm Verification on Blockscout
Go to your BlockScout instance and paste the contract address into the search bar.
Scroll down to see verified status. A green checkmark β means the contract is verified.
If your screen size is limited, you may need to click the 3 dots to view and click through to the contract.
Scroll down to see and interact with the contract code.
# Interacting with Smart Contracts
Source: https://docs.blockscout.com/devs/verification/interacting-with-smart-contracts
Read from and write to verified smart contracts directly in the Blockscout UI by connecting a web3 wallet like MetaMask to any supported chain.
Once a contract is verified, contract methods are exposed and contract interaction is possible directly from Blockscout.
In the following examples we use Blockscout on Gnosis Chain. You can interact with verified contracts on any supported chain. Make sure your web3 wallet (like MetaMask) is also connected to that chain when reading / writing to a contract.
## Read Contract
Read actions let you check various contract attributes. You will need to connect a web3 wallet to make a query, though a query does not require a transaction or any gas costs.
1\) Find the contract address you want to interact with and enter it into the search bar. In this example we search for USDC on Gnosis Chain.
2\) We select the first option in search and are taken to the token page. We can interact from here, but would prefer to see more information about the contract, so we click through to the contract page.
3\) Scrolling down past the contract details we see the code is verified by the checkmarkβ . If the code is not verified, it is not possible to read or write to a contract (unless a verified contract with the same bytecode is located in the Blockscout database. In this case read/write will also be available).
4\) We know this is a proxy implementation by the fact that there are options to either read/write to the contract or to the proxy. Proxy means that the contract is upgradeable, and the admin can set a new implementation address for the proxy contract if upgrades are required.
We will choose to **Read Proxy**, since it contains all the relevant methods for the current contract implementation.
5\) We can see the various methods within the proxy contract. Some show current values and others are queryable. An easy example to query is 8) `balanceOf` method.
6\) This method expects an address and will output an integer. Simply paste in an 0x address and press **Query** to see the balance in USDC held by that particular address. If your web3 wallet is not connected at this point, you will be prompted to connect.
The result shows this address holds 1,000,000 of the token, which converts to 1 USDC. *(Note ERC20 tokens allow for custom decimal point precision. USDC uses 6 decimal precision. Many others use 18 (to denote wei) so be sure to check the token implementation for conversion info).*
## Write Contract
Many write functions can only be performed by an approved owner. Connect the owner wallet when performing gated functions.
1\) We'll use Blockscout to transfer 0.50 USDC from 1 address to another. You can perform this action directly through a wallet UI, we use the Blockscout interface here for demonstration purposes. See steps 1-3 above for accessing USDC on Gnosis Chain, or simply type the contract address (*0xDDAfbb505ad214D7b80b1f830fcCc89B60fb7A83*) into the search bar. Scroll down and select **Write Proxy**.
2\) We scroll down to find the `transferFrom` method.
Boxes are filled with the following information:
1. `_sender(address)`: The `0x` address sending the USDC. Note this account is the one to connect to Blockscout to write to the contract.
2. `_recipient(address)`: The `0x` address receiving the USDC.
3. `_amount(uint256)`: Amount to transfer. We use 6 decimals of precision for USDC - for other tokens this can differ. Here we enter 500000 to denote \$0.50.
3\) We press the **Write** button, and MetaMask or another web3 wallet takes us through the transaction. If a wallet is not connected, there will be several prompts to connect an account to Blockscout. Once connected, we confirm the transaction.
The connected wallet must contain enough native tokens (in this case xDai) to pay gas for the transaction.
4\) We can check our wallet to confirm the transaction, and can view tx details in Blockscout (or return to the [Read Contract](/devs/verification/interacting-with-smart-contracts#read-contract) `balanceOf` method to view new balances for the addresses).
Transaction hash: [0x2c93c4e6618b30c552b95ce2eef16b6e663d99aa2f4a8ea55a70b693de70f113](https://gnosis.blockscout.com/tx/0x2c93c4e6618b30c552b95ce2eef16b6e663d99aa2f4a8ea55a70b693de70f113)
# Verify contracts with the Remix IDE plugin
Source: https://docs.blockscout.com/devs/verification/remix-verification
Verify smart contracts on Blockscout directly from Remix IDE using the built-in contract verification plugin available since Remix v0.56.0.
Since [v0.56.0](https://github.com/remix-project-org/remix-project/releases/tag/v0.56.0) Remix IDE comes with a built-in verification plugin that allows you to verify your contracts on multiple verifiers.
To verify your contracts on Remix:
* Turn on the plugin "CONTRACT VERIFICATION" from the plugin manager.
* On the File Explorer, select and compile the contract you want to verify.
* On the Contract Verification plugin, select the Contract Name, Chain, and input the contract address. Add constructor arguments if needed.
* Click "Verify". You can see the process on the "Receipts" tab.
You can find more information about the plugin in the [Remix documentation](https://remix-ide.readthedocs.io/en/latest/contract_verification.html#verify-page).
# Stylus Verification
Source: https://docs.blockscout.com/devs/verification/stylus-verification
Verify Arbitrum Stylus smart contracts located in public GitHub repositories using the Blockscout verification API and Stylus verifier endpoint.
The original article appeared in the [Stylus Saturdays blog](https://stylus-saturdays.com/p/how-to-verify-your-stylus-contracts)
## **How to verify your Stylus contracts using Blockscout's API**
We support verifying Stylus contracts located in public GitHub repositories. The swagger file for our API endpoint to request the verification can be found [here](https://app.swaggerhub.com/apis/blockscout-f58/stylus-verifier/v1#/StylusSdkRsVerifier/StylusSdkRsVerifier_VerifyGithubRepository). The endpoint accepts the following fields: `deployment_transaction`, `rpc_endpoint`, `cargo_stylus_version`, `repository_url`, `commit`, and `path_prefix`
Stylus verification runs against a specific chain's own verifier service β it isn't part of the multichain PRO API. Call it directly against your target chain's own Blockscout instance, the same way the example below queries `arbitrum.blockscout.com` for Arbitrum One. Swap the host for whichever chain your contract is deployed on.
The `path_prefix` is required so that repositories with several contract crates inside can be used. The repository [https://github.com/blockscout/cargo-stylus-test-examples](https://github.com/blockscout/cargo-stylus-test-examples) contains some great examples.
When a user visits the verification UI, they provide the `cargo_stylus_version`, `repository_url`, `commit`, and `path_prefix` values. These values, along with the address of the contract being verified, are sent to an Elixir backend. The backend retrieves the `deployment_transaction` from the internal database, and sends the data it collected so far, and the `rpc_endpoint`, to a separate verification service.
The service validates the repository, clones the repo the user provided, and checks out the commit hash. If `path_prefix` is provided, it enters the corresponding `prefix`, which is calculated relative to the repository root directory.
Stylus requires the Rust toolchain version to be specified in a `rust-toolchain.toml` file. The file has to be located inside the working directory.
For verification, Blockscout uses the command `cargo stylus verify --no-verify --endpoint {rpc_endpoint} --deployment-tx {deployment_transaction}`.
We opt out of running verification inside in-stylus docker container by adding the `--no-verify` flag. We opt out because `cargo-stylus` requires the docker daemon to be run locally, but we would like to run the service and docker daemon on different machines. We implemented our own docker container startup process which allows us to run containers on the remote docker daemon.
`cargo stylus verify` prints the result into console. We parse the `stdout` and look for the line: "`Verified - contract matches local project's file hashes`". If found, the verification is considered successful, otherwise the verification fails.
If successful, we also attempt to retrieve the contract ABI as it is not returned by the verify command. To get the ABI, we run the `cargo stylus export-abi` command, and parse its result. It prints the ABIs of all included contracts, and the verified contract ABI is printed as the last one. The name of this ABI is also used as a contract name inside a response.
If you need the code, the main function is implemented here: [https://github.com/blockscout/blockscout-rs/blob/main/stylus-verifier/stylus-verifier-logic/src/stylus\_sdk\_rs.rs#L76](https://github.com/blockscout/blockscout-rs/blob/main/stylus-verifier/stylus-verifier-logic/src/stylus_sdk_rs.rs#L76)
An example of making a request to the Blockscout API for verification (Arbitrum One shown here β swap `arbitrum.blockscout.com` for your target chain's own instance):
```bash theme={null}
curl 'https://arbitrum.blockscout.com/api/v2/smart-contracts//verification/via/stylus-github-repository' -H 'Content-type: application/json' -d '{"cargo_stylus_version":"v0.5.6","repository_url":"https://github.com/OffchainLabs/stylus-erc20","commit":"d109002ffff3df7589cbbc92f8f104567a84f085","path_prefix":"","license_type":"none"}'
```
# Verify contracts via thirdweb on Blockscout
Source: https://docs.blockscout.com/devs/verification/verification-via-thirdweb
Deploy prebuilt contracts across many chains with thirdweb and verify them on Blockscout using the Blockscout contract verification API.
[Thirdweb](https://thirdweb.com/) offers a complete web3 development kit including the ability to quickly deploy prebuilt contracts and start interacting with them on many chains. During this process flow it is also easy to verify contracts using Blockscout APIs.
[Follow these instructions to verify your contracts via the Blockscout API with thirdweb.](https://support.thirdweb.com/other-faqs/tFbbEYCSbJ1GTeXoPs4QFw/blockscout-api-contract-verification/qpa9r79QkgH31HFsvGissC)
# Smart contract verification websocket events
Source: https://docs.blockscout.com/devs/verification/websocket-notifications
Subscribe to Blockscout websocket notifications for smart contract verification results and automated source lookup lifecycle events on V2 and legacy sockets.
# Smart Contract Verification Websocket Events
This guide explains how to subscribe to websocket notifications related to smart contract verification.
It covers:
* verification result notifications
* automated source lookup lifecycle notifications
* legacy and V2 websocket namespaces
## 1. Which Socket To Use
Blockscout exposes two websocket endpoints:
* Legacy UI socket: `/socket`
* V2 socket: `/socket/v2`
For new integrations, use the V2 socket.
## 2. Topic Format
Subscribe to an address topic.
* Legacy topic: `addresses_old:`
* V2 topic: `addresses:`
Examples:
* `addresses_old:0xabc123...`
* `addresses:0xabc123...`
The join validates the address hash and access restrictions. Join may fail with:
* `Invalid address hash`
* `Restricted access`
## 3. Events You Can Receive
### 3.1 `verification_result`
Purpose:
* Final result of a verification attempt (success or validation errors).
Emitted to topics:
* `addresses:`
* `addresses_old:`
Broadcast type in event bus:
* `:on_demand`
#### V2 payload
Success:
```json theme={null}
{
"status": "success"
}
```
Error:
```json theme={null}
{
"status": "error",
"errors": {
"field_name": [
"error message"
]
}
}
```
Notes:
* `errors` is generated from changeset errors.
* Field names and messages depend on verification flow and validator results.
#### Legacy behavior
Legacy notifier broadcasts an internal payload with `result`, but the legacy address channel intercepts `verification_result` and pushes event `verification` to clients.
Legacy client-facing event:
* `verification`
Legacy client payload:
```json theme={null}
{
"verification_result": "ok"
}
```
or
```json theme={null}
{
"verification_result": ""
}
```
Important legacy nuance:
* If the intercepted result is `{:error, %Ecto.Changeset{}}`, the channel does not push a websocket message for that event.
### 3.2 `eth_bytecode_db_lookup_started`
Purpose:
* Signals that automated lookup in Ethereum Bytecode DB started.
Emitted to topics:
* `addresses:`
* `addresses_old:`
Payload:
```json theme={null}
{}
```
### 3.3 `smart_contract_was_verified`
Purpose:
* Signals that automated lookup/verification finished with a verified result.
Emitted to topics:
* `addresses:`
* `addresses_old:`
Payload:
```json theme={null}
{}
```
### 3.4 `smart_contract_was_not_verified`
Purpose:
* Signals that automated lookup/verification finished without verification.
Emitted to topics:
* `addresses:`
* `addresses_old:`
Payload:
```json theme={null}
{}
```
## 4. Event Producers (Server-Side)
### `contract_verification_result` chain event
Produced by verification workers/helpers and then mapped to websocket `verification_result`:
* Solidity verification worker
* Vyper verification worker
* Stylus verification worker
* Solidity publish helper (including some error paths)
### Automated source lookup lifecycle chain events
Produced by on-demand source lookup fetcher and mapped 1:1 to websocket event names:
* `eth_bytecode_db_lookup_started`
* `smart_contract_was_verified`
* `smart_contract_was_not_verified`
## 5. Subscription Example (Phoenix JS)
### V2 (recommended)
```javascript theme={null}
import { Socket } from "phoenix";
const socket = new Socket("https://your-blockscout.example/socket/v2", {
params: {}
});
socket.connect();
const addressHash = "0x...";
const channel = socket.channel(`addresses:${addressHash}`, {});
channel
.join()
.receive("ok", () => console.log("joined"))
.receive("error", (err) => console.error("join failed", err));
channel.on("verification_result", (payload) => {
// { status: "success" } OR { status: "error", errors: {...} }
console.log("verification_result", payload);
});
channel.on("eth_bytecode_db_lookup_started", () => {
console.log("lookup started");
});
channel.on("smart_contract_was_verified", () => {
console.log("verified via automatic lookup");
});
channel.on("smart_contract_was_not_verified", () => {
console.log("not verified via automatic lookup");
});
```
### Legacy
```javascript theme={null}
import { Socket } from "phoenix";
const socket = new Socket("https://your-blockscout.example/socket", {
params: { locale: "en" }
});
socket.connect();
const addressHash = "0x...";
const channel = socket.channel(`addresses_old:${addressHash}`, {});
channel.join();
// Legacy verification result event name is "verification"
channel.on("verification", (payload) => {
// payload.verification_result is "ok" or rendered html error string
console.log("verification", payload);
});
// Automatic lookup lifecycle events are forwarded with original names
channel.on("eth_bytecode_db_lookup_started", () => {
console.log("lookup started");
});
channel.on("smart_contract_was_verified", () => {
console.log("verified");
});
channel.on("smart_contract_was_not_verified", () => {
console.log("not verified");
});
```
## 6. Practical Client Flow
Recommended for automation clients:
1. Submit verification request via HTTP API.
2. Immediately subscribe to `addresses:` on `/socket/v2`.
3. Wait for `verification_result` for final API-style outcome.
4. Optionally track automated lookup lifecycle with:
* `eth_bytecode_db_lookup_started`
* `smart_contract_was_verified`
* `smart_contract_was_not_verified`
Notes:
* API response like "verification started" means the job was accepted, not completed.
* Final state should be taken from websocket events.
* Server currently broadcasts to both legacy and V2 address namespaces for backward compatibility.
# Show wallet history with the Blockscout REST API
Source: https://docs.blockscout.com/devs/wallet-history
Fetch balances, transactions, token transfers, and NFT activity for a wallet or portfolio tracker using Blockscout REST API and PRO endpoints.
## Showing wallet history with Blockscout REST API
This example uses REST methods with the PRO API. See the [PRO API overview](/devs/pro-api) for information on creating and using an API key.
Creating a simple portfolio tracker or wallet UI requires fetching and displaying address, account, and transaction information. At a minimum you may want to display:
* Native token and ERC20/NFT balances
* All Transaction activity and status
* Human-readable method summaries
In this brief guide we show the methods you would prioritize for display, pagination formatting, and a Typescript example that fetches wallet transactions and a summary of each transaction, then prints a human-readable activity list.
## Endpoint Summary
The following REST calls can be used to get data for a wallet app:
| Load data | API Call | Purpose |
| - | - | - |
| 1. Wallet overview | `GET /{chainid}/api/v2/addresses/{address}` | Get wallet metadata and native balance for the header or overview |
| 2. Wallet transactions | `GET /{chainid}/api/v2/addresses/{address}/transactions` | Get the main wallet activity feed |
| 3. Token transfers | `GET /{chainid}/api/v2/addresses/{address}/token-transfers` | Show ERC-20 / NFT movement alongside native transfers |
| 4. Human-readable summaries | `GET /{chainid}/api/v2/transactions/{hash}/summary` | Display raw transactions in human-readable format |
### 1. Load wallet overview
```bash theme={null}
curl "https://api.blockscout.com/1/api/v2/addresses/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045?apikey=YOUR_KEY"
```
Use this for:
* native balance
* ENS / tags / address metadata
* wallet header
### 2. Load wallet transactions
```bash theme={null}
curl "https://api.blockscout.com/1/api/v2/addresses/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045/transactions?apikey=YOUR_KEY"
```
Use this for:
* wallet activity list
* transaction status
* value, timestamp, method, counterparty
### 3. Load token transfers
```bash theme={null}
curl "https://api.blockscout.com/1/api/v2/addresses/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045/token-transfers?apikey=YOUR_KEY"
```
Use this for:
* ERC-20 transfers
* NFT transfers
* token activity tabs or merged activity feeds
### 4. Load human-readable summaries
```bash theme={null}
curl "https://api.blockscout.com/1/api/v2/transactions/0x4b03d69654a965de6a2fe907856a0e39a51a8ae25d9ddb8d97aa16ba5c1835e1/summary?apikey=YOUR_KEY"
```
Use this when you want to show something better than raw method names.
Instead of displaying:
* `transfer`
* `multicall`
* `execute`
you can display:
* βSent 12.5 USDCβ
* βSwapped ETH for USDTβ
* βApproved USDC spendingβ
That is the fastest way to make wallet history human-readable.
***
## Pagination
REST responses use keyset pagination.
When a response includes `next_page_params`, copy that object and append its fields to the next request.
Example:
```json theme={null}
{
"items": [ ... ],
"next_page_params": {
"block_number": 18678766,
"index": 119,
"items_count": 50
}
}
```
Next request:
```bash theme={null}
curl "https://api.blockscout.com/1/api/v2/addresses/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045/transactions?block_number=18678766&index=119&items_count=50&apikey=YOUR_KEY"
```
Then repeat the same pattern with the new `next_page_params` from that response.
***
## TypeScript example
This example:
* fetches wallet transactions
* fetches a summary for each transaction
* prints a human-readable activity list
```ts theme={null}
const API_KEY = process.env.BLOCKSCOUT_API_KEY ?? "YOUR_KEY";
const CHAIN_ID = "1";
const ADDRESS = "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045";
const baseUrl = `https://api.blockscout.com/${CHAIN_ID}/api/v2`;
type AddressTx = {
hash: string;
timestamp?: string;
method?: string;
status?: string;
};
type TransactionsResponse = {
items: AddressTx[];
next_page_params?: Record;
};
type SummaryVariable =
| { type: "string"; value: string }
| { type: "currency"; value: string }
| { type: "token"; value: { symbol?: string; name?: string } };
type SummaryItem = {
summary_template: string;
summary_template_variables: Record;
};
type SummaryResponse = {
success: boolean;
data?: {
summaries?: SummaryItem[];
};
};
async function getJson(url: string): Promise {
const res = await fetch(url, {
headers: {
Authorization: API_KEY,
},
});
if (!res.ok) {
throw new Error(`Request failed: ${res.status} ${res.statusText} for ${url}`);
}
return res.json() as Promise;
}
function renderSummary(item: SummaryItem): string {
return item.summary_template.replace(/\{(.*?)\}/g, (_, key: string) => {
const variable = item.summary_template_variables[key];
if (!variable) return `{${key}}`;
if (variable.type === "token") {
return variable.value.symbol || variable.value.name || "token";
}
return String(variable.value);
});
}
async function main() {
const txsUrl = `${baseUrl}/addresses/${ADDRESS}/transactions`;
const txs = await getJson(txsUrl);
const actions = await Promise.all(
txs.items.slice(0, 10).map(async (tx) => {
const summaryUrl = `${baseUrl}/transactions/${tx.hash}/summary`;
try {
const summary = await getJson(summaryUrl);
const first = summary.data?.summaries?.[0];
const text = first ? renderSummary(first) : tx.method || "Transaction";
return {
hash: tx.hash,
timestamp: tx.timestamp || "",
text,
status: tx.status || "unknown",
};
} catch {
return {
hash: tx.hash,
timestamp: tx.timestamp || "",
text: tx.method || "Transaction",
status: tx.status || "unknown",
};
}
})
);
for (const action of actions) {
console.log(
`${action.timestamp} | ${action.status} | ${action.text} | ${action.hash}`
);
}
}
main().catch((err) => {
console.error(err);
process.exit(1);
});
```
***
# x402 payments for the Blockscout Pro API
Source: https://docs.blockscout.com/devs/x402-payments
Use the x402 HTTP payment protocol to pay per call for the Blockscout Pro API with stablecoins, letting autonomous agents access data without an API key.
x402 turns the HTTP 402 status code into a stablecoin payment rail. An agent requests a resource, receives payment terms, signs an authorization, and retries with proof of payment attached. This does not require an account or API key for usage.
Blockscout's Pro API supports x402 as an alternative to key-based billing. Both options read from the same underlying data, so you can choose whichever fits your agent's setup.
Governance of the x402 protocol moved to the Linux Foundation in April 2026, with 22 launch members including Google, Visa, Mastercard, Stripe, AWS, and Circle. The reference implementation is Apache 2.0 licensed with SDKs for TypeScript, Python, and Go.
## How x402 works
x402 is a four-step loop layered on top of a standard HTTP request:
1. **Request.** A client (human or agent) sends a standard HTTP request to a protected endpoint.
2. **402 response.** If payment is required, the server replies with a `402` status and a payment-terms object: accepted token (usually USDC), network, recipient address, amount, and expiry.
3. **Signature.** The client signs an **EIP-3009 `transferWithAuthorization`** message with its wallet, then resends the original request with the signed payload attached in a `PAYMENT-SIGNATURE` header.
4. **Verify and settle.** A facilitator (a service that handles onchain verification and settlement) checks the signature and submits the transfer onchain. The server returns a `200` with the requested data and a `PAYMENT-RESPONSE` header confirming settlement.
**The client never submits a transaction.** Signing an EIP-3009 authorization is an off-chain, gasless action β it's a message that says "I authorize this transfer," not a broadcast transaction. The facilitator is the one that takes that signed authorization and submits it onchain, paying the gas itself. This is why the client wallet only needs USDC, not ETH (see [Requirements](#requirements) below).
The current spec (v2) organizes payment terms around CAIP-2 network identifiers, so the same payment envelope can work across chains. Blockscout's x402 implementation currently supports the **Base network**.
x402 is trust-minimizing. A payment payload is signed by the buyer, and any facilitator that tampers with a transaction will fail signature verification, so it can't redirect funds. Anyone can run a facilitator; Coinbase currently runs the first production one.
## Key-based vs. x402 requests
A standard Pro API request includes a key in the query string and is billed against your account. This is the most cost-effective way to use the Pro API and includes a free tier.
```http theme={null}
GET https://api.blockscout.com/8453/api/v2/tokens/0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913?apikey=proapi_xxx
```
The same endpoint also accepts a request with no key, charged per call via x402:
```http theme={null}
GET https://api.blockscout.com/8453/api/v2/tokens/0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913
HTTP/1.1 402 Payment Required
PAYMENT-REQUIRED:
```
## Walkthrough: pay-per-call with a Hermes agent
This walkthrough sets up a burner wallet, funds it, and configures a [Hermes agent](https://github.com/NousResearch/hermes-agent) to sign x402 payments automatically when calling the Pro API on Base.
## Requirements
* A wallet funded with **USDC** on Base. No ETH is required β the client only signs an off-chain EIP-3009 authorization, and the facilitator pays gas to settle it onchain.
* The x402 Python SDK (`pip install "x402[requests]" eth_account`), or one of the [reference SDKs](https://github.com/coinbase/x402) for TypeScript or Go. See below for [additional Python reference info](#additional-python-reference-info).
* An agent runtime capable of storing a private key and signing messages (see the walkthrough below for a Hermes-based example).
## Steps
Follow the setup steps in the [Hermes agent repo](https://github.com/NousResearch/hermes-agent). Any x402-aware agent runtime works; this walkthrough uses Hermes with an OpenAI key and Telegram as the interface, but any agent interface or LLM provider is compatible.
Generate a new wallet for testing. Using [Foundry](https://www.getfoundry.sh/):
```bash theme={null}
cast wallet new
```
Use a burner wallet for testing, not a wallet holding significant funds.
Send a small amount of **USDC** to the burner wallet address on Base. You can send this from any wallet, such as MetaMask. No ETH is needed β the facilitator covers gas when it settles the signed authorization onchain.
Add the private key to your agent's local environment. Never share this key or commit it to version control.
```bash theme={null}
echo 'X402_PRIVATE_KEY=0xYOUR_PRIVATE_KEY_HERE' >> ~/.hermes/.env
```
```bash theme={null}
pip install "x402[requests]" eth_account
```
Rather than describing the payment protocol in prose inside `AGENTS.md` and hoping the model executes it correctly step by step, give the agent an actual script it can invoke as a tool. Save this as `~/.hermes/skills/x402_pay.py`:
```python theme={null}
#!/usr/bin/env python3
"""
Usage: x402_pay.py
Calls a Blockscout Pro API URL, paying via x402 with the wallet in
$X402_PRIVATE_KEY if the endpoint returns a 402. Prints a single JSON
object to stdout with the response body and payment settlement info.
"""
import json
import os
import sys
from eth_account import Account
from x402 import x402ClientSync
from x402.http import x402HTTPClientSync
from x402.http.clients import x402_requests
from x402.mechanisms.evm import EthAccountSigner
from x402.mechanisms.evm.exact.register import register_exact_evm_client
def call_with_safe_retry(session, url, max_retries=2):
response = session.get(url)
signature = response.request.headers.get("PAYMENT-SIGNATURE")
attempt = 0
while (
response.status_code >= 500
and "PAYMENT-RESPONSE" not in response.headers
and signature
and attempt < max_retries
):
attempt += 1
response = session.get(url, headers={"PAYMENT-SIGNATURE": signature})
return response
def main():
if len(sys.argv) != 2:
print(json.dumps({"error": "usage: x402_pay.py "}))
sys.exit(1)
url = sys.argv[1]
client = x402ClientSync()
account = Account.from_key(os.environ["X402_PRIVATE_KEY"])
register_exact_evm_client(client, EthAccountSigner(account))
http_client = x402HTTPClientSync(client)
with x402_requests(client) as session:
response = call_with_safe_retry(session, url)
settle_response = None
if response.ok:
settle_response = http_client.get_payment_settle_response(
lambda name: response.headers.get(name)
)
print(json.dumps({
"status": response.status_code,
"body": response.text,
"payment": settle_response,
}))
if __name__ == "__main__":
main()
```
Make it executable:
```bash theme={null}
chmod +x ~/.hermes/skills/x402_pay.py
```
Instead of asking the agent to hand-roll the 402/sign/retry flow, tell it to run the script:
```bash theme={null}
cat >> ~/.hermes/AGENTS.md << 'EOF'
## x402 Payments
To call a Blockscout Pro API endpoint that may require payment, run:
python3 ~/.hermes/skills/x402_pay.py ""
This handles the 402 challenge, EIP-3009 signing, safe 5xx retries, and
payment verification. Parse its JSON stdout for `status`, `body`, and
`payment` (null if no payment was required).
EOF
```
Send the agent a request that targets the multichain Pro API endpoint directly, not a per-instance endpoint, so the call routes through x402:
> "Run the x402 payment script against `https://api.blockscout.com/8453/api/v2/tokens/0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913` and tell me if it settled."
Some agent configurations may resolve a query like "get token info on Base" to a free, per-instance endpoint instead of the Pro API's multichain endpoint, which won't trigger a 402. Reference the full Pro API URL directly, as shown above, to confirm you're testing the x402 path.
A successful run prints the settlement details from the `PAYMENT-RESPONSE` header, including the transaction hash:
```json theme={null}
{
"status": 200,
"body": "{...token data...}",
"payment": {
"success": true,
"transaction": "0x339bccd1664bd7398add3df2450c9ca0acab9abf748f86dbbd6de1b78b9bbe04",
"network": "eip155:8453",
"payer": "0xe7878baE142Ef38B557540Ae62E5118A0da4a13D"
}
}
```
Look up the transaction hash on the [Base explorer](https://base.blockscout.com) to confirm the USDC transfer settled onchain.
## Limitations
* Agents need a funded wallet (with USDC) before they can make their first call; there's no prepaid or trial mode for x402 specifically (use the free key-based tier for testing without a funded wallet).
* Most production traffic currently routes through a single facilitator (Coinbase's), though the protocol is permissionless and additional facilitators are expected.
* Per-call billing means a stream of micro-settlements rather than a single invoice. Factor this into cost tracking if you're running high call volumes.
## Additional Python Reference Info
This uses the current v2 Python SDK surface (`x402ClientSync` / `x402HTTPClientSync`), which replaces the older `x402.clients.x402_requests(session, account=...)` shape:
```python theme={null}
import os
from eth_account import Account
from x402 import x402ClientSync
from x402.http import x402HTTPClientSync
from x402.http.clients import x402_requests
from x402.mechanisms.evm import EthAccountSigner
from x402.mechanisms.evm.exact.register import register_exact_evm_client
TOKEN_URL = "https://api.blockscout.com/8453/api/v2/tokens/0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
# Build the client and register the EVM "exact" payment scheme
client = x402ClientSync()
account = Account.from_key(os.getenv("X402_PRIVATE_KEY"))
register_exact_evm_client(client, EthAccountSigner(account))
http_client = x402HTTPClientSync(client)
with x402_requests(client) as session:
response = session.get(TOKEN_URL)
print(response.status_code, response.text)
if response.ok:
settle_response = http_client.get_payment_settle_response(
lambda name: response.headers.get(name)
)
if settle_response:
print("Payment settled, tx:", settle_response.get("transaction"))
```
`x402_requests(client)` catches the `402` automatically, signs an EIP-3009 authorization with the registered signer, and resends the request with the `PAYMENT-SIGNATURE` header attached β similar to how a browser follows a redirect.
The SDK's automatic wrapper signs a fresh authorization every time it sees a `402`. That's the wrong behavior for a `5xx` on retry: if the facilitator already settled the payment and the origin server then failed before responding, resigning would attempt to charge the wallet again. If a `5xx` comes back **without** a `PAYMENT-RESPONSE` header, replay the request with the *same* `PAYMENT-SIGNATURE` you already sent, instead of letting the client sign a new one:
```python theme={null}
def call_with_safe_retry(session, url, max_retries=2):
response = session.get(url)
signature = response.request.headers.get("PAYMENT-SIGNATURE")
attempt = 0
while (
response.status_code >= 500
and "PAYMENT-RESPONSE" not in response.headers
and signature
and attempt < max_retries
):
attempt += 1
response = session.get(url, headers={"PAYMENT-SIGNATURE": signature})
return response
```
The facilitator treats a replayed authorization idempotently: if it was already settled, it won't double-charge; if it wasn't, this retry is what finally gets it processed. Once a response comes back with a `PAYMENT-RESPONSE` header, stop retrying β payment succeeded or definitively failed, and either way a new attempt would need a fresh signature.
A `200` alone doesn't confirm payment was actually collected β check the `PAYMENT-RESPONSE` header and the settlement transaction hash it carries:
```python theme={null}
response = call_with_safe_retry(session, TOKEN_URL)
if response.ok:
settle_response = http_client.get_payment_settle_response(
lambda name: response.headers.get(name)
)
if settle_response:
print("Payment settled")
print("Network:", settle_response.get("network"))
print("Transaction:", settle_response.get("transaction"))
else:
print("200 with no PAYMENT-RESPONSE header β check if this hit a free/cached path")
```
## Additional Reference Info
For key-based billing and access to the free tier
Install web3-dev or blockscout-analysis, or add x402\_pay.py alongside them
Query Blockscout data through MCP-aware agents
SDKs for TypeScript, Python, and Go
# Discord Channel
Source: https://docs.blockscout.com/discord-channel
Join the Blockscout Discord server to get community support, ask questions about explorer setup, and chat with the Blockscout team and contributors.
# Discussion
Source: https://docs.blockscout.com/discussion
Start or join conversations in Blockscout GitHub Discussions to share ideas, request features, and troubleshoot block explorer deployments.
# API quick reference
Source: https://docs.blockscout.com/endpoint-overview
Every Blockscout REST, RPC, ETH RPC and service endpoint at a glance: method, path or action, and a one-line description.
A compact list of every Blockscout API endpoint. For parameters and example responses, see the API reference.
**Base URLs.** Replace `{chain_id}` with the chain's numeric ID (for example `1` for Ethereum).
* REST API: `https://api.blockscout.com/{chain_id}/api/v2`. REST paths are relative to it. Legacy routes show their full path after `https://api.blockscout.com/{chain_id}`.
* RPC API: `https://api.blockscout.com/v2/api?chain_id={chain_id}`. Add the `module` and `action` shown in the tables.
* ETH RPC API: `POST https://api.blockscout.com/{chain_id}/json-rpc` with a JSON-RPC 2.0 body. The method name goes in the `method` field.
* Services (name service, address metadata, multichain search, stats): `https://api.blockscout.com`. Service paths show their full path after it. Replace `{cluster_id}` with a cluster ID.
Send your API key as the `apikey` query parameter or as an `Authorization: Bearer YOUR_KEY` header. REST list endpoints return `next_page_params`; pass those values back as query parameters to get the next page.
175 REST endpoints, 43 RPC actions, 16 ETH RPC methods and 38 service endpoints.
Endpoint names link to their API reference page where one exists.
Endpoints marked **(spec only)** come from the API specifications and have not been verified against a live API. Endpoints marked **(requires a logged-in account)** need an account session as well as an API key.
## REST API
### Blocks
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/blocks`](/api-reference/blocks/list-blocks-with-optional-filtering-by-block-type#list-blocks-with-optional-filtering-by-block-type) | get blocks |
| **GET** | [`/blocks/{block_hash_or_number}`](/api-reference/blocks/retrieves-detailed-information-for-a-specific-block-identified-by-its-number-or-hash#retrieves-detailed-information-for-a-specific-block-identified-by-its-number-or-hash) | get block |
| **GET** | [`/blocks/{block_hash_or_number}/internal-transactions`](/api-reference/blocks/list-internal-transactions-in-a-specific-block#list-internal-transactions-in-a-specific-block) | get block internal transactions |
| **GET** | [`/blocks/{block_hash_or_number}/transactions`](/api-reference/blocks/list-transactions-and-tx-details-included-in-a-specific-block#list-transactions-and-tx-details-included-in-a-specific-block) | get block transactions |
| **GET** | [`/blocks/{block_hash_or_number}/withdrawals`](/api-reference/blocks/list-validator-withdrawals-including-amounts-index-and-receiver-details-processed-in-a-specific-block#list-validator-withdrawals-including-amounts-index-and-receiver-details-processed-in-a-specific-block) | get block withdrawals |
| **GET** | [`/blocks/{block_number}/countdown`](/api-reference/blocks/get-countdown-information-for-a-target-block-number#get-countdown-information-for-a-target-block-number) | get block countdown |
### Transactions
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/transactions`](/api-reference/transactions/list-blockchain-transactions-with-filtering-options-for-status-type-and-method#list-blockchain-transactions-with-filtering-options-for-status-type-and-method) | get transactions |
| **GET** | [`/transactions/stats`](/api-reference/transactions/get-transaction-statistics#get-transaction-statistics) | get transactions stats |
| **GET** | [`/transactions/watchlist`](/api-reference/transactions/list-transactions-in-a-users-watchlist#list-transactions-in-a-users-watchlist) | get transactions watchlist (requires a logged-in account) |
| **GET** | [`/transactions/{transaction_hash}`](/api-reference/transactions/retrieve-detailed-information-about-a-specific-transaction#retrieve-detailed-information-about-a-specific-transaction) | get transaction |
| **GET** | [`/transactions/{transaction_hash}/internal-transactions`](/api-reference/transactions/list-internal-transactions-triggered-during-a-specific-transaction#list-internal-transactions-triggered-during-a-specific-transaction) | get transaction internal transactions |
| **GET** | [`/transactions/{transaction_hash}/logs`](/api-reference/transactions/list-event-logs-emitted-during-a-specific-transaction#list-event-logs-emitted-during-a-specific-transaction) | get transaction logs |
| **GET** | `/transactions/{transaction_hash}/preview` | get transaction preview (new in v12) |
| **GET** | [`/transactions/{transaction_hash}/raw-trace`](/api-reference/transactions/get-step-by-step-execution-trace-for-a-specific-transaction#get-step-by-step-execution-trace-for-a-specific-transaction) | get transaction raw trace |
| **GET** | [`/transactions/{transaction_hash}/state-changes`](/api-reference/transactions/get-on-chain-state-changes-caused-by-a-specific-transaction#get-on-chain-state-changes-caused-by-a-specific-transaction) | get transaction state changes |
| **GET** | [`/transactions/{transaction_hash}/summary`](/api-reference/transactions/get-a-human-readable-llm-based-transaction-summary#get-a-human-readable-llm-based-transaction-summary) | get transaction summary |
| **GET** | [`/transactions/{transaction_hash}/token-transfers`](/api-reference/transactions/list-token-transfers-within-a-specific-transaction#list-token-transfers-within-a-specific-transaction) | get transaction token transfers |
### Addresses
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/addresses`](/api-reference/addresses/list-addresses-holding-native-coins-sorted-by-balance--top-accounts#list-addresses-holding-native-coins-sorted-by-balance--top-accounts) | get addresses |
| **GET** | [`/addresses/{address_hash}`](/api-reference/addresses/retrieve-detailed-information-about-a-specific-address-or-contract#retrieve-detailed-information-about-a-specific-address-or-contract) | get address |
| **GET** | [`/addresses/{address_hash}/blocks-validated`](/api-reference/addresses/list-blocks-validated-mined-by-a-specific-validatorminer-address#list-blocks-validated-mined-by-a-specific-validatorminer-address) | get address blocks validated |
| **GET** | [`/addresses/{address_hash}/coin-balance-history`](/api-reference/addresses/get-native-coin-balance-history-for-an-address-showing-all-balance-changes#get-native-coin-balance-history-for-an-address-showing-all-balance-changes) | get address coin balance history |
| **GET** | [`/addresses/{address_hash}/coin-balance-history-by-day`](/api-reference/addresses/get-daily-native-coin-balance-snapshots-for-an-address-from-previous-10-days#get-daily-native-coin-balance-snapshots-for-an-address-from-previous-10-days) | get address coin balance history by day |
| **GET** | [`/addresses/{address_hash}/counters`](/api-reference/addresses/get-activity-count-stats-for-a-specific-address#get-activity-count-stats-for-a-specific-address) | get address counters |
| **GET** | [`/addresses/{address_hash}/internal-transactions`](/api-reference/addresses/list-all-internal-transactions-involving-a-specific-address#list-all-internal-transactions-involving-a-specific-address) | get address internal transactions |
| **GET** | [`/addresses/{address_hash}/internal-transactions/csv`](/api-reference/addresses/export-internal-transactions-as-csv#export-internal-transactions-as-csv) | export address internal transactions csv |
| **GET** | [`/addresses/{address_hash}/logs`](/api-reference/addresses/list-event-logs-emitted-by-or-involving-a-specific-address#list-event-logs-emitted-by-or-involving-a-specific-address) | get address logs |
| **GET** | [`/addresses/{address_hash}/logs/csv`](/api-reference/addresses/export-logs-as-csv#export-logs-as-csv) | export address logs csv |
| **GET** | [`/addresses/{address_hash}/nft`](/api-reference/addresses/list-nfts-owned-by-a-specific-address-with-optional-type-filtering#list-nfts-owned-by-a-specific-address-with-optional-type-filtering) | get address nft |
| **GET** | [`/addresses/{address_hash}/nft/collections`](/api-reference/addresses/list-nfts-owned-by-an-address-grouped-by-collectionproject#list-nfts-owned-by-an-address-grouped-by-collectionproject) | get address nft collections |
| **GET** | [`/addresses/{address_hash}/tabs-counters`](/api-reference/addresses/get-counters-for-address-tabs#get-counters-for-address-tabs) | get address tabs counters |
| **GET** | [`/addresses/{address_hash}/token-balances`](/api-reference/addresses/list-all-token-balances-held-by-a-specific-address#list-all-token-balances-held-by-a-specific-address) | get address token balances |
| **GET** | [`/addresses/{address_hash}/token-transfers`](/api-reference/addresses/list-token-transfers-involving-a-specific-address-with-filtering-options#list-token-transfers-involving-a-specific-address-with-filtering-options) | get address token transfers |
| **GET** | [`/addresses/{address_hash}/token-transfers/csv`](/api-reference/addresses/export-token-transfers-as-csv#export-token-transfers-as-csv) | export address token transfers csv |
| **GET** | [`/addresses/{address_hash}/tokens`](/api-reference/addresses/list-token-balances-for-an-address-with-pagination-and-type-filtering#list-token-balances-for-an-address-with-pagination-and-type-filtering) | get address tokens |
| **GET** | [`/addresses/{address_hash}/transactions`](/api-reference/addresses/list-transactions-involving-a-specific-address-with-to-from-filtering#list-transactions-involving-a-specific-address-with-to-from-filtering) | get address transactions |
| **GET** | [`/addresses/{address_hash}/transactions/csv`](/api-reference/addresses/export-transactions-as-csv#export-transactions-as-csv) | export address transactions csv |
| **GET** | [`/addresses/{address_hash}/withdrawals`](/api-reference/addresses/list-validator-withdrawals-involving-a-specific-address#list-validator-withdrawals-involving-a-specific-address) | get address withdrawals |
### Internal transactions
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/internal-transactions`](/api-reference/internal-transactions/list-internal-transactions-generated-during-smart-contract-execution#list-internal-transactions-generated-during-smart-contract-execution) | get internal transactions |
### Token transfers
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/token-transfers`](/api-reference/token-transfers/list-token-transfers-across-all-token-types-erc-20-erc-721-erc-1155#list-token-transfers-across-all-token-types-erc-20-erc-721-erc-1155) | get token transfers |
### Tokens
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/tokens`](/api-reference/tokens/list-tokens-with-optional-filtering-by-name-symbol-or-type#list-tokens-with-optional-filtering-by-name-symbol-or-type) | get tokens |
| **POST** | `/tokens/batch` | get tokens by address (batch) (spec only) (new in v12) |
| **GET** | [`/tokens/{address_hash}`](/api-reference/tokens/retrieve-detailed-information-about-a-specific-token#retrieve-detailed-information-about-a-specific-token) | get token |
| **GET** | [`/tokens/{address_hash}/counters`](/api-reference/tokens/get-holder-and-transfer-count-statistics-for-a-specific-token#get-holder-and-transfer-count-statistics-for-a-specific-token) | get token counters |
| **GET** | [`/tokens/{address_hash}/holders`](/api-reference/tokens/list-addresses-holding-a-specific-token-sorted-by-balance#list-addresses-holding-a-specific-token-sorted-by-balance) | get token holders |
| **GET** | [`/tokens/{address_hash}/holders/csv`](/api-reference/tokens/export-token-holders-as-csv#export-token-holders-as-csv) | export token holders csv |
| **GET** | [`/tokens/{address_hash}/instances`](/api-reference/tokens/list-individual-nft-instances-for-a-token-contract#list-individual-nft-instances-for-a-token-contract) | get token instances |
| **PATCH** | `/tokens/{address_hash}/instances/refetch-metadata` | refetch collection metadata (spec only) (new in v12) |
| **GET** | [`/tokens/{address_hash}/instances/{token_id}`](/api-reference/tokens/retrieve-detailed-information-about-a-specific-nft#retrieve-detailed-information-about-a-specific-nft) | get token instance |
| **GET** | [`/tokens/{address_hash}/instances/{token_id}/holders`](/api-reference/tokens/list-current-holders-of-a-specific-nft#list-current-holders-of-a-specific-nft) | get token instance holders |
| **GET** | [`/tokens/{address_hash}/instances/{token_id}/media-type`](/api-reference/tokens/fetch-media-type-for-a-specific-nft-instance#fetch-media-type-for-a-specific-nft-instance) | get token instance media type (spec only) |
| **PATCH** | `/tokens/{address_hash}/instances/{token_id}/refetch-metadata` | refetch NFT metadata (spec only) (new in v12) |
| **GET** | [`/tokens/{address_hash}/instances/{token_id}/transfers`](/api-reference/tokens/list-token-transfers-for-a-specific-token-instance#list-token-transfers-for-a-specific-token-instance) | get token instance transfers |
| **GET** | [`/tokens/{address_hash}/instances/{token_id}/transfers-count`](/api-reference/tokens/get-total-number-of-ownership-transfers-for-a-specific-nft#get-total-number-of-ownership-transfers-for-a-specific-nft) | get token instance transfers count |
| **GET** | [`/tokens/{address_hash}/transfers`](/api-reference/tokens/list-ownership-transfer-history-for-a-specific-nft#list-ownership-transfer-history-for-a-specific-nft) | get token transfers |
| **GET** | [`/tokens/{address_hash}/transfers/csv`](/api-reference/tokens/export-token-transfers-as-csv#export-token-transfers-as-csv) | export token transfers csv (spec only) |
| **GET** | `/tokens/{address_hash}/ui-multiplier-changes` | get token ui multiplier changes (spec only) (new in v12) |
### Smart contracts
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/smart-contracts`](/api-reference/smart-contracts/list-verified-smart-contracts-with-optional-filtering-options#list-verified-smart-contracts-with-optional-filtering-options) | get smart contracts |
| **GET** | [`/smart-contracts/counters`](/api-reference/smart-contracts/get-count-statistics-new-&-newly-verified-for-deployed-smart-contracts#get-count-statistics-new-&-newly-verified-for-deployed-smart-contracts) | get smart contracts counters |
| **GET** | [`/smart-contracts/{address_hash}`](/api-reference/smart-contracts/retrieve-detailed-information-about-a-verified-smart-contract#retrieve-detailed-information-about-a-verified-smart-contract) | get smart contract |
| **GET** | [`/smart-contracts/{address_hash}/audit-reports`](/api-reference/smart-contracts/audit-reports-list#audit-reports-list) | get smart contract audit reports (spec only) |
| **POST** | `/smart-contracts/{address_hash}/audit-reports` | submit audit report (spec only) (new in v12) |
### Search
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/search`](/api-reference/search/search-for-tokens-addresses-contracts-blocks-or-transactions-by-identifier-1#search-for-tokens-addresses-contracts-blocks-or-transactions-by-identifier-1) | search |
| **GET** | [`/search/check-redirect`](/api-reference/search/check-if-search-query-should-redirect-to-a-specific-entity-page#check-if-search-query-should-redirect-to-a-specific-entity-page) | search redirect |
| **GET** | [`/search/quick`](/api-reference/search/quick-unpaginated-search#quick-unpaginated-search) | quick search |
### Stats
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/stats`](/api-reference/stats/retrieve-blockchain-network-statistics-and-metrics#retrieve-blockchain-network-statistics-and-metrics) | get stats counters |
| **GET** | [`/stats/charts/market`](/api-reference/stats/get-daily-closing-price-and-market-cap-for-native-coin#get-daily-closing-price-and-market-cap-for-native-coin) | get stats charts market |
| **GET** | [`/stats/charts/secondary-coin-market`](/api-reference/stats/secondary-coin-market-history-chart-data#secondary-coin-market-history-chart-data) | get stats charts secondary coin market |
| **GET** | [`/stats/charts/transactions`](/api-reference/stats/get-daily-transaction-counts#get-daily-transaction-counts) | get stats charts transactions |
| **GET** | [`/stats/hot-smart-contracts`](/api-reference/stats/retrieve-hot-smart-contracts#retrieve-hot-smart-contracts) | get stats hot smart contracts |
### Main page
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/main-page/blocks`](/api-reference/main-page/retrieve-recent-blocks-as-displayed-on-blockscout-homepage#retrieve-recent-blocks-as-displayed-on-blockscout-homepage) | get main page blocks |
| **GET** | [`/main-page/indexing-status`](/api-reference/main-page/check-if-indexing-is-finished-with-indexing-ratio#check-if-indexing-is-finished-with-indexing-ratio) | get indexing status |
| **GET** | [`/main-page/transactions`](/api-reference/main-page/retrieve-recent-transactions-as-displayed-on-blockscout-homepage#retrieve-recent-transactions-as-displayed-on-blockscout-homepage) | get main page transactions |
| **GET** | [`/main-page/transactions/watchlist`](/api-reference/main-page/last-6-transactions-from-the-current-users-watchlist#last-6-transactions-from-the-current-users-watchlist) | get main page transactions watchlist (requires a logged-in account) |
### Advanced filters
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/advanced-filters`](/api-reference/advanced-filters/list-transactions-internal-transactions-and-token-transfers-matching-the-advanced-filter-criteria#list-transactions-internal-transactions-and-token-transfers-matching-the-advanced-filter-criteria) | get advanced filters |
| **GET** | [`/advanced-filters/csv`](/api-reference/advanced-filters/export-advanced-filter-results-as-csv#export-advanced-filter-results-as-csv) | export advanced filters csv |
| **GET** | [`/advanced-filters/methods`](/api-reference/advanced-filters/list-known-contract-methods#list-known-contract-methods) | get advanced filters methods |
### CSV exports
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/csv-exports/{uuid}`](/api-reference/csv-export/get-csv-export#get-csv-export) | get csv export (spec only) |
### Withdrawals
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/withdrawals`](/api-reference/withdrawals/list-validator-withdrawal-details-on-proof-of-stake-networks#list-validator-withdrawal-details-on-proof-of-stake-networks) | get withdrawals |
| **GET** | [`/withdrawals/counters`](/api-reference/withdrawals/withdrawals-counters#withdrawals-counters) | get withdrawals counters |
### Config
| Method | Endpoint | Description |
| - | - | - |
| **GET** | `/config/backend` | get config backend (new in v12) |
| **GET** | `/config/backend-version` | get config backend version (new in v12) |
| **GET** | `/config/csv-export` | get config csv export (new in v12) |
| **GET** | `/config/db-background-migrations` | get config db background migrations (new in v12) |
| **GET** | `/config/indexer` | get config indexer (new in v12) |
| **GET** | `/config/public-metrics` | get config public metrics (new in v12) |
| **GET** | `/config/smart-contracts/languages` | get config smart contracts languages (new in v12) |
### Chain-specific endpoints
These endpoints only exist on chains of the matching type, or where the feature is enabled. On other chains they return a 404 or an empty result.
#### Account Abstraction (ERC-4337)
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/proxy/account-abstraction/accounts`](/api-reference/account-abstraction/list-of-account-abstraction-wallets#list-of-account-abstraction-wallets) | get proxy account abstraction accounts |
| **GET** | [`/proxy/account-abstraction/accounts/{address_hash}`](/api-reference/account-abstraction/get-an-account-abstraction-wallet-by-address-hash#get-an-account-abstraction-wallet-by-address-hash) | get proxy account abstraction account |
| **GET** | [`/proxy/account-abstraction/bundlers`](/api-reference/account-abstraction/list-of-top-bundlers#list-of-top-bundlers) | get proxy account abstraction bundlers (spec only) |
| **GET** | [`/proxy/account-abstraction/bundlers/{address_hash}`](/api-reference/account-abstraction/get-a-bundler-by-address-hash#get-a-bundler-by-address-hash) | get proxy account abstraction bundler |
| **GET** | [`/proxy/account-abstraction/bundles`](/api-reference/account-abstraction/list-of-recent-bundles#list-of-recent-bundles) | get proxy account abstraction bundles |
| **GET** | [`/proxy/account-abstraction/factories`](/api-reference/account-abstraction/list-of-top-wallet-factories#list-of-top-wallet-factories) | get proxy account abstraction factories (spec only) |
| **GET** | [`/proxy/account-abstraction/factories/{address_hash}`](/api-reference/account-abstraction/get-a-factory-by-address-hash#get-a-factory-by-address-hash) | get proxy account abstraction factory (spec only) |
| **GET** | [`/proxy/account-abstraction/operations`](/api-reference/account-abstraction/list-of-recent-user-operations#list-of-recent-user-operations) | get proxy account abstraction operations |
| **GET** | [`/proxy/account-abstraction/operations/{operation_hash}`](/api-reference/account-abstraction/get-a-user-operation-by-hash#get-a-user-operation-by-hash) | get proxy account abstraction operation |
| **GET** | [`/proxy/account-abstraction/operations/{operation_hash}/summary`](/api-reference/account-abstraction/get-a-human-readable-llm-based-user-operation-summary#get-a-human-readable-llm-based-user-operation-summary) | get proxy account abstraction operation summary |
| **GET** | [`/proxy/account-abstraction/paymasters`](/api-reference/account-abstraction/list-of-top-paymasters#list-of-top-paymasters) | get proxy account abstraction paymasters (spec only) |
| **GET** | [`/proxy/account-abstraction/paymasters/{address_hash}`](/api-reference/account-abstraction/get-a-paymaster-by-address-hash#get-a-paymaster-by-address-hash) | get proxy account abstraction paymaster |
| **GET** | [`/proxy/account-abstraction/status`](/api-reference/account-abstraction/get-the-status-of-the-account-abstraction-microservice#get-the-status-of-the-account-abstraction-microservice) | get proxy account abstraction status |
#### Ethereum (beacon chain and blobs)
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/addresses/{address_hash}/beacon/deposits`](/api-reference/addresses/list-beacon-deposits-for-a-specific-address#list-beacon-deposits-for-a-specific-address) | get address beacon deposits |
| **GET** | [`/beacon/deposits`](/api-reference/beacon_deposits/lists-all-beacon-deposits#lists-all-beacon-deposits) | get beacon deposits |
| **GET** | [`/beacon/deposits/count`](/api-reference/beacon_deposits/gets-total-count-of-beacon-deposits#gets-total-count-of-beacon-deposits) | get beacon deposits count |
| **GET** | [`/blocks/{block_hash_or_number}/beacon/deposits`](/api-reference/blocks/list-beacon-deposits-in-a-specific-block#list-beacon-deposits-in-a-specific-block) | get block beacon deposits |
| **GET** | [`/transactions/{transaction_hash}/beacon/deposits`](/api-reference/transactions/list-beacon-deposits-in-a-transaction#list-beacon-deposits-in-a-transaction) | get transaction beacon deposits |
| **GET** | [`/transactions/{transaction_hash}/blobs`](/api-reference/transactions/list-blobs-for-a-transaction#list-blobs-for-a-transaction) | get transaction blobs |
#### Arbitrum
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/arbitrum/batches`](/api-reference/arbitrum/list-batches#list-batches) | get arbitrum batches |
| **GET** | [`/arbitrum/batches/count`](/api-reference/arbitrum/get-batches-count#get-batches-count) | get arbitrum batches count |
| **GET** | [`/arbitrum/batches/da/anytrust/{data_hash}`](/api-reference/arbitrum/get-batch-by-anytrust-data-hash#get-batch-by-anytrust-data-hash) | get arbitrum batches da anytrust (spec only) |
| **GET** | [`/arbitrum/batches/da/celestia/{height}/{transaction_commitment}`](/api-reference/arbitrum/get-batch-by-celestia-blob-reference#get-batch-by-celestia-blob-reference) | get arbitrum batches da celestia (spec only) |
| **GET** | [`/arbitrum/batches/da/eigenda/{data_hash}`](/api-reference/arbitrum/get-batch-by-eigenda-data-hash#get-batch-by-eigenda-data-hash) | get arbitrum batches da eigenda (spec only) |
| **GET** | [`/arbitrum/batches/{batch_number}`](/api-reference/arbitrum/get-batch-by-number#get-batch-by-number) | get arbitrum batch |
| **GET** | [`/arbitrum/messages/claim/{message_id}`](/api-reference/arbitrum/get-claim-data-for-a-withdrawal#get-claim-data-for-a-withdrawal) | get arbitrum messages claim (spec only) |
| **GET** | [`/arbitrum/messages/withdrawals/{transaction_hash}`](/api-reference/arbitrum/get-withdrawal-messages-for-a-transaction#get-withdrawal-messages-for-a-transaction) | get arbitrum messages withdrawal |
| **GET** | [`/arbitrum/messages/{direction}`](/api-reference/arbitrum/list-cross-chain-messages#list-cross-chain-messages) | get arbitrum message |
| **GET** | [`/arbitrum/messages/{direction}/count`](/api-reference/arbitrum/get-cross-chain-messages-count#get-cross-chain-messages-count) | get arbitrum message count |
| **GET** | [`/blocks/arbitrum-batch/{batch_number}`](/api-reference/blocks/list-l2-blocks-in-an-arbitrum-batch#list-l2-blocks-in-an-arbitrum-batch) | get blocks arbitrum batch |
| **GET** | [`/main-page/arbitrum/batches/committed`](/api-reference/arbitrum/list-committed-batches-on-the-main-page#list-committed-batches-on-the-main-page) | get main page arbitrum batches committed |
| **GET** | [`/main-page/arbitrum/batches/latest-number`](/api-reference/arbitrum/get-the-latest-batch-number#get-the-latest-batch-number) | get main page arbitrum batches latest number |
| **GET** | [`/main-page/arbitrum/messages/to-rollup`](/api-reference/arbitrum/list-recent-parent-chain-to-rollup-messages-on-the-main-page#list-recent-parent-chain-to-rollup-messages-on-the-main-page) | get main page arbitrum messages to rollup |
| **GET** | [`/transactions/arbitrum-batch/{batch_number}`](/api-reference/transactions/list-l2-transactions-in-an-arbitrum-batch#list-l2-transactions-in-an-arbitrum-batch) | get transactions arbitrum batch |
#### Optimism
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/blocks/optimism-batch/{batch_number}`](/api-reference/blocks/list-l2-blocks-in-an-optimism-batch#list-l2-blocks-in-an-optimism-batch) | get blocks optimism batch |
| **GET** | [`/main-page/optimism-deposits`](/api-reference/optimism/list-deposits-on-the-main-page#list-deposits-on-the-main-page) | get main page optimism deposits |
| **GET** | [`/optimism/batches`](/api-reference/optimism/list-batches#list-batches) | get optimism batches |
| **GET** | [`/optimism/batches/count`](/api-reference/optimism/number-of-batches-in-the-list#number-of-batches-in-the-list) | get optimism batches count |
| **GET** | [`/optimism/batches/da/celestia/{height}/{commitment}`](/api-reference/optimism/batch-by-celestia-blob#batch-by-celestia-blob) | get optimism batches da celestia (spec only) |
| **GET** | [`/optimism/batches/{number}`](/api-reference/optimism/batch-by-its-number#batch-by-its-number) | get optimism batch |
| **GET** | [`/optimism/deposits`](/api-reference/optimism/list-deposits#list-deposits) | get optimism deposits |
| **GET** | [`/optimism/deposits/count`](/api-reference/optimism/number-of-deposits-in-the-list#number-of-deposits-in-the-list) | get optimism deposits count |
| **GET** | [`/optimism/games`](/api-reference/optimism/list-games#list-games) | get optimism games |
| **GET** | [`/optimism/games/count`](/api-reference/optimism/number-of-games-in-the-list#number-of-games-in-the-list) | get optimism games count |
| **GET** | [`/optimism/output-roots`](/api-reference/optimism/list-output-roots#list-output-roots) | get optimism output roots |
| **GET** | [`/optimism/output-roots/count`](/api-reference/optimism/number-of-output-roots-in-the-list#number-of-output-roots-in-the-list) | get optimism output roots count |
| **GET** | [`/optimism/withdrawals`](/api-reference/optimism/list-withdrawals#list-withdrawals) | get optimism withdrawals |
| **GET** | [`/optimism/withdrawals/count`](/api-reference/optimism/number-of-withdrawals-in-the-list#number-of-withdrawals-in-the-list) | get optimism withdrawals count |
| **GET** | [`/transactions/optimism-batch/{batch_number}`](/api-reference/transactions/list-l2-transactions-in-an-optimism-batch#list-l2-transactions-in-an-optimism-batch) | get transactions optimism batch |
#### Scroll
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/blocks/scroll-batch/{batch_number}`](/api-reference/blocks/list-l2-blocks-in-a-scroll-batch#list-l2-blocks-in-a-scroll-batch) | get blocks scroll batch |
| **GET** | [`/scroll/batches`](/api-reference/scroll/list-batches#list-batches) | get scroll batches |
| **GET** | [`/scroll/batches/count`](/api-reference/scroll/number-of-batches-in-the-list#number-of-batches-in-the-list) | get scroll batches count |
| **GET** | [`/scroll/batches/{number}`](/api-reference/scroll/batch-by-its-number#batch-by-its-number) | get scroll batch |
| **GET** | [`/scroll/deposits`](/api-reference/scroll/list-deposits#list-deposits) | get scroll deposits |
| **GET** | [`/scroll/deposits/count`](/api-reference/scroll/number-of-deposits-in-the-list#number-of-deposits-in-the-list) | get scroll deposits count |
| **GET** | [`/scroll/withdrawals`](/api-reference/scroll/list-withdrawals#list-withdrawals) | get scroll withdrawals |
| **GET** | [`/scroll/withdrawals/count`](/api-reference/scroll/number-of-withdrawals-in-the-list#number-of-withdrawals-in-the-list) | get scroll withdrawals count |
| **GET** | [`/transactions/scroll-batch/{batch_number}`](/api-reference/transactions/list-l2-transactions-in-a-scroll-batch#list-l2-transactions-in-a-scroll-batch) | get transactions scroll batch |
#### zkSync
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/main-page/zksync/batches/confirmed`](/api-reference/zksync/list-confirmed-batches-on-the-main-page#list-confirmed-batches-on-the-main-page) | get main page zksync batches confirmed (spec only) |
| **GET** | [`/main-page/zksync/batches/latest-number`](/api-reference/zksync/get-the-latest-batch-number#get-the-latest-batch-number) | get main page zksync batches latest number (spec only) |
| **GET** | [`/transactions/zksync-batch/{batch_number}`](/api-reference/transactions/list-l2-transactions-in-a-zksync-batch#list-l2-transactions-in-a-zksync-batch) | get transactions zksync batch (spec only) |
| **GET** | [`/zksync/batches`](/api-reference/zksync/list-batches#list-batches) | get zksync batches (spec only) |
| **GET** | [`/zksync/batches/count`](/api-reference/zksync/get-batches-count#get-batches-count) | get zksync batches count (spec only) |
| **GET** | [`/zksync/batches/{batch_number}`](/api-reference/zksync/get-batch-by-number#get-batch-by-number) | get zksync batch (spec only) |
#### Shibarium
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/shibarium/deposits`](/api-reference/shibarium/list-shibarium-deposits#list-shibarium-deposits) | get shibarium deposits (spec only) |
| **GET** | [`/shibarium/deposits/count`](/api-reference/shibarium/number-of-shibarium-deposits#number-of-shibarium-deposits) | get shibarium deposits count (spec only) |
| **GET** | [`/shibarium/withdrawals`](/api-reference/shibarium/list-shibarium-withdrawals#list-shibarium-withdrawals) | get shibarium withdrawals (spec only) |
| **GET** | [`/shibarium/withdrawals/count`](/api-reference/shibarium/number-of-shibarium-withdrawals#number-of-shibarium-withdrawals) | get shibarium withdrawals count (spec only) |
#### Celo
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/addresses/{address_hash}/celo/election-rewards`](/api-reference/addresses/list-celo-election-rewards-for-a-specific-address#list-celo-election-rewards-for-a-specific-address) | get address celo election rewards (spec only) |
| **GET** | [`/addresses/{address_hash}/celo/election-rewards/csv`](/api-reference/addresses/export-celo-election-rewards-as-csv#export-celo-election-rewards-as-csv) | export address celo election rewards csv (spec only) |
| **GET** | [`/celo/epochs`](/api-reference/celo/list-celo-epochs#list-celo-epochs) | get celo epochs |
| **GET** | [`/celo/epochs/{number}`](/api-reference/celo/get-celo-epoch-details#get-celo-epoch-details) | get celo epoch |
| **GET** | [`/celo/epochs/{number}/election-rewards/{type}`](/api-reference/celo/list-celo-epoch-election-rewards#list-celo-epoch-election-rewards) | get celo epoch election reward |
| **GET** | `/config/celo` | get config celo (new in v12) |
#### Stability
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/validators/stability`](/api-reference/stability/list-stability-validators#list-stability-validators) | get validators stability (spec only) |
| **GET** | [`/validators/stability/counters`](/api-reference/stability/get-stability-validators-counters#get-stability-validators-counters) | get validators stability counters (spec only) |
#### Zilliqa
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/validators/zilliqa`](/api-reference/zilliqa/zilliqa-validators-list#zilliqa-validators-list) | get validators zilliqa |
| **GET** | [`/validators/zilliqa/{bls_public_key}`](/api-reference/zilliqa/zilliqa-validator-by-its-bls-public-key#zilliqa-validator-by-its-bls-public-key) | get validators zilliqa |
#### Neon
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/transactions/{transaction_hash}/external-transactions`](/api-reference/transactions/list-external-transactions-linked-to-a-transaction#list-external-transactions-linked-to-a-transaction) | get transaction external transactions |
#### FHE chains
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/transactions/{transaction_hash}/fhe-operations`](/api-reference/transactions/list-fhe-operations-for-a-specific-transaction#list-fhe-operations-for-a-specific-transaction) | get transaction fhe operations (spec only) |
#### Execution nodes
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/transactions/execution-node/{execution_node_hash}`](/api-reference/transactions/list-transactions-executed-on-a-specific-execution-node#list-transactions-executed-on-a-specific-execution-node) | get transactions execution node (spec only) |
### Legacy and JSON-RPC routes
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/api/legacy/block/get-block-number-by-time`](/api-reference/legacy/get-block-number-by-time-stamp#get-block-number-by-time-stamp) | get block number by time (spec only) |
| **POST** | `/api/legacy/eth/eth-block-number` | eth\_blockNumber (spec only) (new in v12) |
| **POST** | `/api/legacy/eth/eth-call` | eth\_call (spec only) (new in v12) |
| **POST** | `/api/legacy/eth/eth-get-balance` | eth\_getBalance (spec only) (new in v12) |
| **POST** | `/api/legacy/eth/eth-get-logs` | eth\_getLogs (spec only) (new in v12) |
| **POST** | `/api/legacy/eth/eth-get-storage-at` | eth\_getStorageAt (spec only) (new in v12) |
| **POST** | `/api/legacy/eth/eth-send-raw-transaction` | eth\_sendRawTransaction (spec only) (new in v12) |
| **GET** | [`/api/v1/search`](/api-reference/search/search-for-tokens-addresses-contracts-blocks-or-transactions-by-identifier#search-for-tokens-addresses-contracts-blocks-or-transactions-by-identifier) | search (legacy v1 alias) (spec only) |
## RPC API
Etherscan-compatible `module` and `action` calls. Requests go to `https://api.blockscout.com/v2/api?chain_id={chain_id}`; add the parameters shown, plus your `apikey`.
### Account
| Method | Action | Description |
| - | - | - |
| **GET** | [`module=account&action=balance`](/api-reference/account/get-native-token-balance-for-a-single-address#get-native-token-balance-for-a-single-address) | get native balance |
| **GET** | [`module=account&action=balancemulti`](/api-reference/account/get-balance-for-multiple-addresses-in-a-single-call#get-balance-for-multiple-addresses-in-a-single-call) | get native balances for multiple addresses |
| **GET** | [`module=account&action=eth_get_balance`](/api-reference/account/get-eth-balance-json-rpc-format#get-eth-balance-json-rpc-format) | get balance at a block (JSON-RPC format) |
| **GET** | [`module=account&action=txlist`](/api-reference/account/get-a-list-of-transactions-by-address#get-a-list-of-transactions-by-address) | get transactions by address |
| **GET** | [`module=account&action=pendingtxlist`](/api-reference/account/get-pending-transactions-for-an-address#get-pending-transactions-for-an-address) | get pending transactions by address |
| **GET** | [`module=account&action=txlistinternal`](/api-reference/account/get-a-list-of-internal-transactions#get-a-list-of-internal-transactions) | get internal transactions |
| **GET** | [`module=account&action=tokentx`](/api-reference/account/get-erc-20-token-transfer-events-by-address#get-erc-20-token-transfer-events-by-address) | get ERC-20 token transfers by address |
| **GET** | [`module=account&action=tokennfttx`](/api-reference/account/get-erc-721-token-transfer-events-by-address#get-erc-721-token-transfer-events-by-address) | get ERC-721 token transfers by address |
| **GET** | [`module=account&action=token1155tx`](/api-reference/account/get-erc-1155-token-transfer-events-by-address#get-erc-1155-token-transfer-events-by-address) | get ERC-1155 token transfers by address |
| **GET** | [`module=account&action=token404tx`](/api-reference/account/get-erc-404-token-transfer-events-by-address#get-erc-404-token-transfer-events-by-address) | get ERC-404 token transfers by address |
| **GET** | [`module=account&action=tokenbalance`](/api-reference/account/get-erc-20-token-balance-for-a-single-address#get-erc-20-token-balance-for-a-single-address) | get token balance of an address |
| **GET** | [`module=account&action=tokenlist`](/devs/apis/rpc/account) | get tokens owned by an address |
| **GET** | [`module=account&action=getminedblocks`](/api-reference/account/get-list-of-blocks-mined-by-address#get-list-of-blocks-mined-by-address) | get blocks validated by an address |
| **GET** | [`module=account&action=listaccounts`](/api-reference/account/list-accounts-and-native-balances#list-accounts-and-native-balances) | list accounts and balances |
### Block
| Method | Action | Description |
| - | - | - |
| **GET** | [`module=block&action=getblockreward`](/api-reference/block/get-block-reward-by-block-number#get-block-reward-by-block-number) | get block reward |
| **GET** | [`module=block&action=getblockcountdown`](/api-reference/block/get-estimated-block-countdown-time-by-block-number#get-estimated-block-countdown-time-by-block-number) | get block countdown |
| **GET** | [`module=block&action=getblocknobytime`](/api-reference/block/get-block-number-by-timestamp#get-block-number-by-timestamp) | get block number by timestamp |
| **GET** | [`module=block&action=eth_block_number`](/api-reference/block/get-latest-block-number-json-rpc-format#get-latest-block-number-json-rpc-format) | get latest block number (JSON-RPC format) |
### Contract
| Method | Action | Description |
| - | - | - |
| **GET** | [`module=contract&action=listcontracts`](/api-reference/contract/get-list-of-contracts#get-list-of-contracts) | list contracts |
| **GET** | [`module=contract&action=getabi`](/api-reference/contract/get-contract-abi-for-verified-contract#get-contract-abi-for-verified-contract) | get contract ABI |
| **GET** | [`module=contract&action=getsourcecode`](/api-reference/contract/get-contract-source-code-for-verified-contract#get-contract-source-code-for-verified-contract) | get contract source code |
| **GET** | [`module=contract&action=getcontractcreation`](/api-reference/contract/get-contract-creator-and-creation-transaction-hash#get-contract-creator-and-creation-transaction-hash) | get contract creator and creation transaction |
| **POST** | [`module=contract&action=verify`](/api-reference/contract/verify-contract-with-source-code#verify-contract-with-source-code) | verify a contract (source code) (spec only) |
| **POST** | [`module=contract&action=verifysourcecode`](/api-reference/contract/verify-contract-with-standard-json-input#verify-contract-with-standard-json-input) | verify a contract (standard JSON input) |
| **POST** | [`module=contract&action=verify_vyper_contract`](/api-reference/contract/verify-vyper-contract#verify-vyper-contract) | verify a Vyper contract (spec only) |
| **POST** | [`module=contract&action=verify_via_sourcify`](/api-reference/contract/verify-contract-via-sourcify#verify-contract-via-sourcify) | verify a contract through Sourcify (spec only) |
| **GET** | [`module=contract&action=verifyproxycontract`](/api-reference/contract/verify-proxy-contract#verify-proxy-contract) | verify a proxy contract (spec only) |
| **GET** | [`module=contract&action=checkverifystatus`](/api-reference/contract/check-verification-status#check-verification-status) | check verification status |
| **GET** | [`module=contract&action=checkproxyverification`](/api-reference/contract/check-proxy-verification-status#check-proxy-verification-status) | check proxy verification status |
### Logs
| Method | Action | Description |
| - | - | - |
| **GET** | [`module=logs&action=getLogs`](/api-reference/logs/get-event-logs-by-addresstopicsblock-range#get-event-logs-by-addresstopicsblock-range) | get event logs |
### Stats
| Method | Action | Description |
| - | - | - |
| **GET** | [`module=stats&action=tokensupply`](/api-reference/stats/get-erc-20-or-erc-721-token-total-supply#get-erc-20-or-erc-721-token-total-supply) | get token total supply |
| **GET** | [`module=stats&action=ethsupply`](/api-reference/stats/get-total-supply-of-native-token#get-total-supply-of-native-token) | get total supply (database) |
| **GET** | [`module=stats&action=ethsupplyexchange`](/api-reference/stats/get-total-supply-from-exchange#get-total-supply-from-exchange) | get total supply (exchange data) |
| **GET** | [`module=stats&action=coinsupply`](/api-reference/stats/get-total-coin-supply-from-db#get-total-coin-supply-from-db) | get coin supply minus burnt |
| **GET** | [`module=stats&action=ethprice`](/api-reference/stats/get-native-token-price#get-native-token-price) | get native coin price |
| **GET** | [`module=stats&action=coinprice`](/api-reference/stats/get-native-coin-price#get-native-coin-price) | get native coin price (chain-neutral fields) |
| **GET** | [`module=stats&action=totalfees`](/api-reference/stats/get-total-transaction-fees#get-total-transaction-fees) | get total transaction fees for a day |
### Token
| Method | Action | Description |
| - | - | - |
| **GET** | [`module=token&action=getToken`](/api-reference/token/get-token-info#get-token-info) | get token |
| **GET** | [`module=token&action=getTokenHolders`](/api-reference/token/get-token-holders#get-token-holders) | get token holders |
| **GET** | [`module=token&action=bridgedTokenList`](/api-reference/token/get-bridged-tokens-list#get-bridged-tokens-list) | get bridged tokens (where applicable) |
### Transaction
| Method | Action | Description |
| - | - | - |
| **GET** | [`module=transaction&action=gettxinfo`](/api-reference/transaction/get-transaction-info-by-transaction-hash#get-transaction-info-by-transaction-hash) | get transaction info |
| **GET** | [`module=transaction&action=gettxreceiptstatus`](/api-reference/transaction/get-transaction-receipt-status#get-transaction-receipt-status) | get receipt status |
| **GET** | [`module=transaction&action=getstatus`](/api-reference/transaction/get-transaction-execution-status#get-transaction-execution-status) | get execution status and error |
## ETH RPC API
Standard JSON-RPC 2.0 methods. Send each as a `POST` to `https://api.blockscout.com/{chain_id}/json-rpc`.
| Method | JSON-RPC method | Description |
| - | - | - |
| **POST** | [`eth_blockNumber`](/devs/apis/rpc/eth-rpc) | get latest block number |
| **POST** | [`eth_chainId`](/devs/apis/rpc/eth-rpc) | get chain ID |
| **POST** | [`eth_gasPrice`](/devs/apis/rpc/eth-rpc) | get gas price |
| **POST** | [`eth_maxPriorityFeePerGas`](/devs/apis/rpc/eth-rpc) | get max priority fee per gas |
| **POST** | [`eth_getBalance`](/devs/apis/rpc/eth-rpc) | get balance |
| **POST** | [`eth_getTransactionCount`](/devs/apis/rpc/eth-rpc) | get transaction count (nonce) |
| **POST** | [`eth_getCode`](/devs/apis/rpc/eth-rpc) | get contract bytecode |
| **POST** | [`eth_getStorageAt`](/devs/apis/rpc/eth-rpc) | get storage value |
| **POST** | [`eth_getTransactionByHash`](/devs/apis/rpc/eth-rpc) | get transaction by hash |
| **POST** | [`eth_getTransactionReceipt`](/devs/apis/rpc/eth-rpc) | get transaction receipt |
| **POST** | [`eth_sendRawTransaction`](/devs/apis/rpc/eth-rpc) | send signed transaction (spec only) |
| **POST** | [`eth_getBlockByNumber`](/devs/apis/rpc/eth-rpc) | get block by number |
| **POST** | [`eth_getBlockByHash`](/devs/apis/rpc/eth-rpc) | get block by hash |
| **POST** | [`eth_call`](/devs/apis/rpc/eth-rpc) | execute a call |
| **POST** | [`eth_estimateGas`](/devs/apis/rpc/eth-rpc) | estimate gas |
| **POST** | [`eth_getLogs`](/devs/apis/rpc/eth-rpc) | get event logs |
## Services
Name service, address metadata, multichain search and stats endpoints. Paths are shown in full, after `https://api.blockscout.com`.
### Name service (BENS): single chain
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/services/bens/api/v1/{chain_id}/addresses/{address}`](/api-reference/domainsextractor/get-detailed-information-about-main-domain-of-requested-address#get-detailed-information-about-main-domain-of-requested-address) | get main domain of an address |
| **POST** | [`/services/bens/api/v1/{chain_id}/addresses:batch-resolve-names`](/api-reference/domainsextractor/perform-batch-resolving-of-list-of-address-for-blockscout-backend-requests#perform-batch-resolving-of-list-of-address-for-blockscout-backend-requests) | resolve names for a batch of addresses |
| **GET** | [`/services/bens/api/v1/{chain_id}/addresses:lookup`](/api-reference/domainsextractor/get-basic-info-about-address-for-ens-lookup-and-blockscout-quick-search-sorted-by-%60registration_date%60#get-basic-info-about-address-for-ens-lookup-and-blockscout-quick-search-sorted-by-%60registration_date%60) | look up domains for an address (spec only) |
| **GET** | [`/services/bens/api/v1/{chain_id}/domains/{name}`](/api-reference/domainsextractor/get-detailed-information-about-domain-for-detailed-domain-page#get-detailed-information-about-domain-for-detailed-domain-page) | get domain details |
| **GET** | [`/services/bens/api/v1/{chain_id}/domains/{name}/events`](/api-reference/domainsextractor/get-list-of-events-of-domain-for-detailed-domain-page#get-list-of-events-of-domain-for-detailed-domain-page) | get domain events |
| **GET** | [`/services/bens/api/v1/{chain_id}/domains:lookup`](/api-reference/domainsextractor/get-basic-info-about-domain-for-ens-lookup-and-blockscout-quick-search-sorted-by-%60registration_date%60#get-basic-info-about-domain-for-ens-lookup-and-blockscout-quick-search-sorted-by-%60registration_date%60) | look up domains by name |
| **GET** | [`/services/bens/api/v1/{chain_id}/protocols`](/api-reference/domainsextractor/get-list-of-supported-protocols#get-list-of-supported-protocols) | get supported protocols |
### Name service (BENS): multichain
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/services/bens/api/v1/addresses/{address}`](/api-reference/multichaindomains/get-detailed-information-about-main-address-of-requested-name#get-detailed-information-about-main-address-of-requested-name) | get main domain of an address |
| **POST** | [`/services/bens/api/v1/addresses:batch-resolve`](/api-reference/multichaindomains/perform-batch-resolving-of-list-of-addresses-to-names-for-blockscout-backend-requests#perform-batch-resolving-of-list-of-addresses-to-names-for-blockscout-backend-requests) | resolve names for a batch of addresses |
| **GET** | [`/services/bens/api/v1/addresses:lookup`](/api-reference/multichaindomains/get-basic-info-about-address-for-ens-lookup-and-blockscout-quick-search-sorted-by-%60registration_date%60#get-basic-info-about-address-for-ens-lookup-and-blockscout-quick-search-sorted-by-%60registration_date%60) | look up domains for an address (spec only) |
| **GET** | [`/services/bens/api/v1/domains/{name}`](/api-reference/multichaindomains/get-detailed-information-about-name-for-detailed-name-page#get-detailed-information-about-name-for-detailed-name-page) | get domain details |
| **GET** | [`/services/bens/api/v1/domains/{name}/events`](/api-reference/multichaindomains/get-list-of-events-of-domain-for-detailed-domain-page#get-list-of-events-of-domain-for-detailed-domain-page) | get domain events |
| **GET** | [`/services/bens/api/v1/domains:lookup`](/api-reference/multichaindomains/get-basic-info-about-name-for-ens-lookup-and-blockscout-quick-search-sorted-by-%60registration_date%60#get-basic-info-about-name-for-ens-lookup-and-blockscout-quick-search-sorted-by-%60registration_date%60) | look up domains by name |
| **GET** | [`/services/bens/api/v1/protocols`](/api-reference/multichaindomains/get-list-of-supported-protocols#get-list-of-supported-protocols) | get supported protocols |
### Address metadata
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/services/metadata/api/v1/addresses`](/api-reference/metadata/get-servicesmetadataapiv1addresses#get-servicesmetadataapiv1addresses) | get addresses by public tag (spec only) |
| **POST** | [`/services/metadata/api/v1/addresses:submit`](/api-reference/metadata/post-servicesmetadataapiv1addresses:submit#post-servicesmetadataapiv1addresses:submit) | submit addresses for metadata extraction (spec only) |
| **GET** | [`/services/metadata/api/v1/metadata`](/api-reference/metadata/get-servicesmetadataapiv1metadata#get-servicesmetadataapiv1metadata) | get metadata for addresses |
| **GET** | [`/services/metadata/api/v1/public-tag-types`](/api-reference/metadata/get-servicesmetadataapiv1public-tag-types#get-servicesmetadataapiv1public-tag-types) | get public tag types |
| **GET** | [`/services/metadata/api/v1/reputation`](/api-reference/metadata/get-servicesmetadataapiv1reputation#get-servicesmetadataapiv1reputation) | get reputation for addresses |
| **GET** | [`/services/metadata/api/v1/tags:search`](/api-reference/metadata/get-servicesmetadataapiv1tags:search#get-servicesmetadataapiv1tags:search) | search public tags (spec only) |
### Multichain search
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/services/multichain/api/v1/clusters/{cluster_id}/chains`](/api-reference/clusterexplorerservice/lists-all-chains-in-the-cluster-optionally-sorted-by-a-metric-eg-active_accounts-tps#lists-all-chains-in-the-cluster-optionally-sorted-by-a-metric-eg-active_accounts-tps) | list chains in a cluster (spec only) |
| **GET** | [`/services/multichain/api/v1/clusters/{cluster_id}/search/addresses`](/api-reference/clusterexplorerservice/full-text-search-for-addresses-by-query-string;-optional-chain-filter-and-pagination#full-text-search-for-addresses-by-query-string;-optional-chain-filter-and-pagination) | search addresses in a cluster (spec only) |
| **GET** | [`/services/multichain/api/v1/clusters/{cluster_id}/search/block-numbers`](/api-reference/clusterexplorerservice/full-text-search-for-block-numbers-returns-chain-+-block-number;-optional-chain-filter-and-pagination#full-text-search-for-block-numbers-returns-chain-+-block-number;-optional-chain-filter-and-pagination) | search block numbers in a cluster (spec only) |
| **GET** | [`/services/multichain/api/v1/clusters/{cluster_id}/search/blocks`](/api-reference/clusterexplorerservice/full-text-search-for-blocks-returns-block-hashes;-optional-chain-filter-and-pagination#full-text-search-for-blocks-returns-block-hashes;-optional-chain-filter-and-pagination) | search blocks in a cluster (spec only) |
| **GET** | [`/services/multichain/api/v1/clusters/{cluster_id}/search/domains`](/api-reference/clusterexplorerservice/full-text-search-for-domains;-optional-chain-filter-and-pagination#full-text-search-for-domains;-optional-chain-filter-and-pagination) | search domains in a cluster (spec only) |
| **GET** | [`/services/multichain/api/v1/clusters/{cluster_id}/search/nfts`](/api-reference/clusterexplorerservice/full-text-search-for-nfts-by-query-string;-optional-chain-filter-and-pagination#full-text-search-for-nfts-by-query-string;-optional-chain-filter-and-pagination) | search NFTs in a cluster (spec only) |
| **GET** | [`/services/multichain/api/v1/clusters/{cluster_id}/search/tokens`](/api-reference/clusterexplorerservice/full-text-search-for-tokens;-optional-chain-filter-and-pagination#full-text-search-for-tokens;-optional-chain-filter-and-pagination) | search tokens in a cluster (spec only) |
| **GET** | [`/services/multichain/api/v1/clusters/{cluster_id}/search/transactions`](/api-reference/clusterexplorerservice/full-text-search-for-transactions-returns-transaction-hashes;-optional-chain-filter-and-pagination#full-text-search-for-transactions-returns-transaction-hashes;-optional-chain-filter-and-pagination) | search transactions in a cluster (spec only) |
| **GET** | [`/services/multichain/api/v1/clusters/{cluster_id}/search:quick`](/api-reference/clusterexplorerservice/unified-quick-search-across-addresses-blocks-transactions-block-numbers-dapps-tokens-nfts-and-domains;-supports-unlimited-results-per-chain#unified-quick-search-across-addresses-blocks-transactions-block-numbers-dapps-tokens-nfts-and-domains;-supports-unlimited-results-per-chain) | quick search in a cluster (spec only) |
| **GET** | [`/services/multichain/api/v1/search:quick`](/api-reference/multichainaggregatorservice/unified-quick-search-across-addresses-blocks-transactions-block-numbers-dapps-tokens-nfts-and-domains;-supports-unlimited-results-per-chain#unified-quick-search-across-addresses-blocks-transactions-block-numbers-dapps-tokens-nfts-and-domains;-supports-unlimited-results-per-chain) | quick search across chains |
### Stats service
| Method | Endpoint | Description |
| - | - | - |
| **GET** | [`/{chain_id}/stats-service/api/v1/counters`](/api-reference/statsservice/returns-all-available-counter-stats-for-the-stats-page#returns-all-available-counter-stats-for-the-stats-page) | get all counters |
| **GET** | [`/{chain_id}/stats-service/api/v1/lines`](/api-reference/statsservice/returns-metadata-title-description-available-resolutions-for-allline-charts-organized-into-sections#returns-metadata-title-description-available-resolutions-for-allline-charts-organized-into-sections) | list line charts |
| **GET** | [`/{chain_id}/stats-service/api/v1/lines/{name}`](/api-reference/statsservice/returns-data-points-for-a-specific-line-chart-with-optional-date-rangeand-resolution-filtering#returns-data-points-for-a-specific-line-chart-with-optional-date-rangeand-resolution-filtering) | get a line chart |
| **GET** | [`/{chain_id}/stats-service/api/v1/pages/contracts`](/api-reference/statsservice/returns-stats-to-be-displayed-on-the-contracts-page#returns-stats-to-be-displayed-on-the-contracts-page) | get contracts page stats |
| **GET** | [`/{chain_id}/stats-service/api/v1/pages/interchain/main`](/api-reference/statsservice/returns-interchain-messaging-stats-to-be-displayed-on-the-main-page-of-interchain-indexer#returns-interchain-messaging-stats-to-be-displayed-on-the-main-page-of-interchain-indexer) | get interchain stats (where enabled) |
| **GET** | [`/{chain_id}/stats-service/api/v1/pages/main`](/api-reference/statsservice/returns-stats-to-be-displayed-on-the-main-page-of-indexer#returns-stats-to-be-displayed-on-the-main-page-of-indexer) | get main page stats |
| **GET** | [`/{chain_id}/stats-service/api/v1/pages/multichain/main`](/api-reference/statsservice/returns-multichain-aggregated-stats-to-be-displayed-on-the-main-page-of-multichain-indexer#returns-multichain-aggregated-stats-to-be-displayed-on-the-main-page-of-multichain-indexer) | get multichain stats (where enabled) |
| **GET** | [`/{chain_id}/stats-service/api/v1/pages/transactions`](/api-reference/statsservice/returns-stats-to-be-displayed-on-the-transactions-page#returns-stats-to-be-displayed-on-the-transactions-page) | get transactions page stats |
# Developer FAQs
Source: https://docs.blockscout.com/faqs/developer-faqs
Developer FAQs for Blockscout: running a self-hosted explorer, memory tuning, indexer performance, contract verification, and API troubleshooting.
## Developer FAQs
The easiest way is by using [Autoscout](https://deploy.blockscout.com/). Other methods are listed in [https://docs.blockscout.com/setup/deployment](https://docs.blockscout.com/setup/deployment).
BlockScout can be resource intensive. If your instance is running slowly:
* clear the cache - the application cache is cleared on restart by running: `sudo systemctl restart explorer.service`
* increase the memory limit for indexers using the [INDEXER\_MEMORY\_LIMIT](/setup/env-variables/backend-env-variables#indexer-management:~:text=INDEXER%5FMEMORY%5FLIMIT) ENV if indexing is slow.
* increase the number of CPUs if CPU is running at 100% on the web app server
* increase the memory if memory consumption is high on the web app server
* increase the number of CPUs or/and increase the memory on the database server if consumption is high.
Instructions for accessing and upgrading CPUs/memory will differ based on your setup. If you are running BlockScout on AWS, these settings can be accessed through your AWS services portal.
Use `git clone https://github.com/blockscout/blockscout.git -b `
**Exchange Rates Coin Name**
* Specify coin name for exchange rates fetcher with the `COIN` [ENV variables](/setup/env-variables)
BlockScout utilizes the `COIN` environment variable which pulls the associated market data from the Coinmarketcap.com API or CoinGecko API to provide pricing data throughout the application.
**Displayed Coin Symbol**
In order to set displayed coin symbol, instance maintainer should set `COIN_NAME` runtime environment variable:
```text theme={null}
export COIN_NAME=
```
For instance, in case of POA instance of Blockscout:
```text theme={null}
export COIN_NAME=POA
```
1. Visit CodeDeploy in AWS. You will see a list of your deployments. Select the deployment id to view details `https://console.aws.amazon.com/codesuite/codedeploy/deployments?region=us-east-1`
2. Deployment status consists of several steps. Once step 2 is complete (application is installed on replacement instances), you manually reroute traffic. Click the `Reroute traffic` button to initiate.
3. Once traffic is rerouted, you'll be asked to terminate the original instance. Click the **Terminate** button to initiate.
4. Once complete, use the public DNS address of the Amazon EC2 instance to view in a web browser. (To get the public DNS value, choose your Amazon EC2 instance in the Amazon EC2 console, and look for the value in **Public DNS** in the **Description** tab).
Currently the best existing way is through docker compose [https://github.com/blockscout/blockscout/tree/master/docker-compose](https://github.com/blockscout/blockscout/tree/master/docker-compose).
We are currently working on deployment through Kubernetes (K8s) and other methods for easily spinning up an instance on AWS.
#### Missing Assets
1. Find the public ip of corresponding Blockscout instance in the EC2 -> Instances of AWS Dashboard.
2. Connect to the host via SSH `ssh -i ec2-user@`, where `` is host's private key file, `` is the public ip of the host, that can be found in the AWS dashboard.
3. Go to assets folder `cd /opt/app/apps/block_scout_web/priv/static`
4. Add missing assets there or to `./images` folder depending on what is missing. Refresh Blockscout instance page. For example, if `favicon.ico` is missing in `./images` folder, just copy it from the root assets folder `cp favicon.ico ./images/`. You should see now the missing assets.
#### Missing Version in Footer
The app version number should be in the footer of BlockScout instance.
1. Find the public ip of corresponding Blockscout instance in the EC2 -> Instances of AWS Dashboard.
2. Connect to the host via SSH `ssh -i ec2-user@`, where `` is host's private key file, `` is the public ip of the host, that can be found in the AWS dashboard.
3. Go to layout folder `/opt/app/apps/block_scout_web/lib/block_scout_web/templates/layout`
4. Open `_footer.html.eex` footer template in the favorite text editor. For example `nano ./_footer.html.eex` and fix the line `<% version = version() %>` (it is in the bottom of the file) with the hardcoded new version, for example, `<% version = 'v1.3.3-beta' %>` and save.
5. Restart the Blockscout instance with `sudo systemctl restart explorer.service`
You may receive this error after making changes to a specific BlockScout application.
`(Gettext.Error) translation with msgid '......' has a non-empty msgstr`
To update gettext, run the following command **in the app's folder where the changes were made**.
1. Go to the ./apps/name\_of\_app folder where the changes were made.
2. Run `mix gettext.extract --merge`
3. Repeat for other app folders as required.
More information on Gettext is [available here](https://hexdocs.pm/gettext/Mix.Tasks.Gettext.Extract.html).
See the [Configuration options](/setup/configuration-options) page for details related to different UI elements.
For updates like adding elements/links etc. you will need to change .eex templates. When changing .eex templates you don't need to rebuild. Run the application in dev mode (MIX\_ENV=dev), and change the template. You'll see changes on-the-fly. When changing js/scss while running the application, you need to run `mix phx.digest` to apply the changes.
Use the `listcontracts` action of the `contract` module. For example, to view verified contracts on Gnosis via the PRO API, use the following query. Pagination is available.
```sh theme={null}
curl "https://api.blockscout.com/v2/api?chain_id=100&module=contract&action=listcontracts&page=1&offset=50&filter=verified&apikey="
```
Running a self-hosted instance? Use its own API directly instead:
```sh theme={null}
curl -X GET "
https:///api?module=contract&action=listcontracts&page=1&offset=50&filter=verified
" -H "accept: application/json"
```
One reason may be related to the CoinGecko API refusing Blockscout requests without an API key.
If impacted, apply this pull request to your instance:
[https://github.com/blockscout/blockscout/pull/5613](https://github.com/blockscout/blockscout/pull/5613)
It implements CoinGecko API key management and alternative CoinMarketCap exchange rates.
There are several ways:
* Use the multichain [PRO API's contract verification actions](/devs/verification/blockscout-smart-contract-verification-api)
* Use the [Contract module RPC reference](/devs/apis/rpc/contract) for the per-instance version of the same calls
Change the Explorer.ExchangeRates variable from `enabled: true` to `enabled: false`.
* config :explorer, Explorer.ExchangeRates, `enabled: false`, store: :ets
[https://github.com/poanetwork/blockscout/blob/7aeecb2a04838cda0289a7fe432db74481cf575a/apps/explorer/config/config.exs#L32](https://github.com/poanetwork/blockscout/blob/7aeecb2a04838cda0289a7fe432db74481cf575a/apps/explorer/config/config.exs#L32)
You may want to do this if you are creating a new instance or resyncing a new node.
1. Backup the `smart_contracts` table
2. Restore this table following the resync.
Yes, you can. The `ethereum_json_rpc_http` variable can be set to any url. It does not need to be a localhost. Client variant env variable should be specified in either case.
No, it is not required. If ws is disabled, leave the `ETHEREUM_JSONRPC_WS_URL` env var empty or unset it.
Try increasing time for the `ETHEREUM_JSONRPC_DEBUG_TRACE_TRANSACTION_TIMEOUT` [ENV variable](/setup/env-variables#indexer-management). The default is 5 sec.
In a self-hosted or locally deployed instance, when attempting to do a **write transaction** on a verified contract, the following errors may appear:
**Unauthorized**
"You connected to Unknown Private Network chain in the wallet, but the current instance of Blockscout is for Unknown Private Network chain"
"No "from" address specified in neither the given options, nor the default options."
**To Troubleshoot:**
* Check that you set the correct `CHAIN_ID` env variable
* Check correct variable for `NETWORK_ID`
Yes, the [FAVICON\_MASTER\_URL](https://docs.blockscout.com/setup/env-variables/frontend-common-envs/envs#favicon:~:text=Version-,FAVICON_MASTER_URL,-string) ENV accepts a URL to a jpg/png/svg image.
Yes, Blockscout supports ERC-20, ERC-721, ERC-1155 and ERC-404 token standards.
Ubuntu 24.04 has been configured in Blockscout CI.
We recommend using ElixirLS: Elixir support and debugger.
Some customization is available by setting environment variables [https://docs.blockscout.com/setup/env-variables/backend-env-variables](https://docs.blockscout.com/setup/env-variables/backend-env-variables).
[https://blockscout.notion.site/OP-ENV-variable-values-defining-1003d73641f880b58e28ded1671256ab](https://blockscout.notion.site/OP-ENV-variable-values-defining-1003d73641f880b58e28ded1671256ab?source=copy_link)
Use the compatibility table to find the correct version. [https://docs.blockscout.com/setup/requirements/back-front-compatibility-matrix](https://docs.blockscout.com/setup/requirements/back-front-compatibility-matrix)
No, Blockscout uses a dedicated endpoint. Contact Cryptorank for an API key.
Use host.docker.internal instead of 127.0.0.1 e.g.
[http://host.docker.internal:8545/](http://host.docker.internal:8545/)
The footer can be customized with the [NEXT\_PUBLIC\_FOOTER\_LINKS](https://docs.blockscout.com/setup/env-variables/frontend-common-envs/envs#footer) ENV.
# User FAQs
Source: https://docs.blockscout.com/faqs/faqs
User FAQs for the Blockscout explorer covering transactions, addresses, tokens, verified contracts, My Account features, and common troubleshooting.
If you have a question that isn't answered here, please contact us in [our Discord](https://discord.gg/blockscout) and the team and community can help troubleshoot your issue.
## User FAQs
This label appears next to a transaction to signify whether a transaction was sent or received by a particular address.
* **In:** A transaction was sent to the address
* **Out:** A transaction was initiated from the address
**There are 3 transaction types which can be accessed from the tabs menu for an EOA (Externally Owned Address) or Smart Contract.**
**Transactions:**
An EOA, commonly known as a wallet address, initiates a transaction. Both incoming and outgoing transactions are recorded here, and include any transaction that requires a gas fee (in the native token ETH, xDai etc) for execution.
**Token Transfers:**
Transactions of ERC-20 or ERC-721 tokens. This can include DeFi transactions (like adding or removing liquidity), EOA transfers, airdrops or other transactions where non-native tokens are sent and received.
**Internal Transactions:**
Transactions initiated and executed between smart contracts. Internal transactions are the result of an external transaction (EOA to contract). This initial transaction can then trigger many internal transactions between contracts as functions are called.
If you request too much data at the same time you may receive a timeout. Decreasing the period of time for an export (**1 week timeframe** is recommended for addresses with lots of transactions) can reduce these errors.
Yes! The contract should be verified (or the bytecode matches an existing contract) to enable reading and writing to contracts and proxy contracts. [More info here](/devs/verification/interacting-with-smart-contracts).
There are multiple methods including options from the Blockscout UI as well as an integration directly with Hardhat.
**Blockscout UI:**
* [Via flattened source code (Solidity)](/devs/verification#via-flattened-source-code)
* [Via standard JSON input](/faqs/faqs#via-standard-json-input)
* [Via Sourcify: Sources and metadata JSON file](/devs/verification/contracts-verification-via-sourcify)
* [Vyper contract](/devs/verification#vyper-contract)
**Hardhat:**
* [Hardhat Verification Plugin](/devs/verification/hardhat-verification-plugin)
* [Sourcify Plugin for Hardhat](/devs/verification/hardhat-verification-plugin/sourcify-plugin-for-hardhat)
At [https://chains.blockscout.com](https://chains.blockscout.com)
Tokens can be swapped using [https://swap.blockscout.com](https://swap.blockscout.com)
# Integrating Blockscout into your Application
Source: https://docs.blockscout.com/get-started/integrating-data
Integrate Blockscout into your app using the PRO API, SDK notifications, MCP server for AI agents, and Chainscout multi-chain data endpoints.
Blockscout features integration points for different applications.
## APIs
* Blockscout's PRO API provides free and professional tiers for fast, wide-ranging API access.
* Get started immediately at [https://dev.blockscout.com/](https://dev.blockscout.com/)
* Learn more in our [dedicated API section](/devs/apis).
* [Additional microservice APIs](https://blockscout.github.io/swaggers/) include items like the Blockscout name service, Merits, Contract Verifier and others.
## SDK
* The [Blockscout SDK](/devs/blockscout-sdk) provides access to simple explorer-based notifications directly into an application.
## MCP
* The [MCP Server](/devs/mcp-server) wraps Blockscout APIs and exposes blockchain dataβbalances, tokens, NFTs, contract metadataβvia the Model Context Protocol (MCP) so that AI agents and tools (like Claude, Cursor, or IDEs) can access and analyze it contextually.
## Chainscout
* The [Chainscout list](/devs/chainscout-chains-list) provides a list of all known projects using Blockscout along with chain IDs and other relevant information.
# Migration Guide
Source: https://docs.blockscout.com/get-started/migration-guide
Migrate from Etherscan or other block explorers to Blockscout: switch links, APIs, and integrations for developers, projects, and end users.
* Blockscout is transparent, open-source software. Supported by the community for the community good.
* Blockscout adds new features regularly and offers support quickly.
* Blockscout provides fast and reliable chain information, and robust APIs for developers.
* Blockscout is a proven explorer with a long track record, ecosystem-wide support, high data availability, and a rich feature set other explorers do not offer.
* Deep Search
* Advanced Contract Interaction
* JSON RPC & REST APIs
* User Operations
* Dapp Marketplace
* Enhanced Metadata
* DEX tracker
* Interop explorer in progress
## Switching Links
Change links in your application to point to Blockscout.
* **Update primary links**. Update all code within an application by replacing the front part of the url. [Link Switch Guide](/devs/replace-links)
* **Update wallet links**: Many wallets can be updated manually to switch the primary explorer link to Blockscout. [Wallet Update Guide](https://www.blog.blockscout.com/changing-wallet-block-explorer-urls-to-blockscout/)
## API updates
Sign up for an API key at [https://dev.blockscout.com/](https://dev.blockscout.com/)
* API calls follow the same query structure as Etherscan. Blockscout supports most of the same calls. Replace the front part of the url from [**https://api.etherscan.io/v2/api?chainid=X**](https://api.etherscan.io/v2/api?chainid=X) to [**https://api.blockscout.com/v2/api?chain\_id=X**](https://api.blockscout.com/v2/api?chain_id=X)
* [API Docs](/devs/apis)
* [Microservice and related swagger definitions](https://blockscout.github.io/swaggers/)
* A **GraphQL** playground is built into the explorer. Explore queries and schemas from the interface by visiting [**https://your-instance-here/graphiql**](https://your-instance-here/graphiql)
### **1. Account/Address Endpoints**
`module=account`
| | Blockscout | Etherscan | Purpose |
| :- | :- | :- | :- |
| `action=eth_get_balance` | β | β | Mimics Ethereum JSON RPC's eth\_getBalance |
| `action=balance` | β | β | Get Ether Balance for Single Address |
| `action=balancemulti` | β | β | Get Ether Balance for Multiple Addresses |
| `action=pendingtxlist` | β | β | Get Pending Transactions by Address |
| `action=txlist` | β | β | Get Normal Transactions by Address |
| `action=txlistinternal` | β | β | Get Internal Transactions by Address |
| `action=tokentx` | β | β | Get ERC20 Token Transfers |
| `action=tokennfttx` | β | β | Get ERC721 Token Transfers |
| `action=token1155tx` | β | β | Get ERC1155 Token Transfers |
| `action=token404tx` | β | β | Get ERC-404 token transfer events by address |
| `action=tokenbalance` | β | β | Get Token Balance for Address |
| `action=tokenlist` | β | β | Get list of tokens owned by address |
| `action=getminedblocks` | β | β | Get list of blocks mined by address |
| `action=listaccounts` | β | β | Get a list of accounts and their balances |
| `action=txsBeaconWithdrawal` | β | β | Get Beacon Chain Withdrawals by Address and Block Range |
| `action=balancehistory` | β | β Β (PRO) | Get Historical Ether Balance for an Address By BlockNo |
### **2. Contract Endpoints**
### `module=contract`
| | Blockscout | Etherscan | Purpose |
| :- | :- | :- | :- |
| `action=listcontracts` | β | β | Get list of any deployed contract |
| `action=getabi` | β | β | Get Contract ABI for verified contracts |
| `action=getsourcecode` | β | β | Get contract source code for a verified contract |
| `action=getcontractcreation` | β | β | Get contract creator address hash and creation transaction hash |
| `action=verify` | β | β | Verify Contract with Source Code |
| `action=verifysourcecode` | β | β | Verify Contract with JSON file |
| `action=checkverifystatus` | β | β | Check Verification Status |
| `action=verifyproxycontract` | β | β | Get Internal Transactions by Address |
| `action=checkproxyverification` | β | β | Get ERC20 Token Transfers |
| `action=verify_via_sourcify` | β | β | Verify a contract through Sourcify |
| `action=verify_vyper_contract` | β | β | Verify a Vyper contract |
### **3. Transaction Endpoints**
### `module=transaction`
| | Blockscout | Etherscan | Purpose |
| :- | :- | :- | :- |
| `action=gettxinfo` | β | β | Get Transaction info including block number, sender, gas, +++ |
| `action=gettxreceiptstatus` | β | β | Get Transaction Receipt Status |
| `action=getstatus` | β | β | Get Transaction Execution Status |
### **4. Block Endpoints**
**module=block**
| | Blockscout | Etherscan | Purpose |
| :- | :- | :- | :- |
| `action=getblockreward` | β | β | Get Block Rewards |
| `action=getblockcountdown` | β | β | Get Block Countdown |
| `action=getblocknobytime` | β | β | Get Block Number by Time |
| `action=eth_block_number` | β | β | Mimics Ethereum JSON RPC's eth\_blockNumber. |
|
`, etc.) | - | - | `{"name":"Montserrat","url":"https://fonts.googleapis.com/css2?family=Montserrat:wght@400;500;600;700&display=swap"}` | v1.35.0+ |
| NEXT\_PUBLIC\_FONT\_FAMILY\_BODY | `FontFamily`, see full description [below](/setup/env-variables/frontend-common-envs/envs#font-family-configuration-properties) | Main typeface to use in page content elements. | - | - | `{"name":"Raleway","url":"https://fonts.googleapis.com/css2?family=Raleway:wght@400;500;600;700&display=swap"}` | v1.35.0+ |
| NEXT\_PUBLIC\_MAX\_CONTENT\_WIDTH\_ENABLED | `boolean` | Set to `true` to restrict the page content width on extra-large screens. | - | `true` | `false` | v1.34.1+ |
#### Network explorer configuration properties
| Variable | Type | Description | Compulsoriness | Default value | Example value |
| - | - | - | - | - | - |
| logo | `string` | URL to explorer logo file. Should be at least 40x40. | - | - | `https://foo.app/icon.png` |
| title | `string` | Displayed name of the explorer | Required | - | `Anyblock` |
| baseUrl | `string` | Base url of the explorer | Required | - | `https://explorer.anyblock.tools` |
| paths | `RecordβΉ"tx" \| "block" \| "address" \| "token", stringβΊ` | Map of explorer entities and their paths. Path can be a template with `:id` or `:id_lowercase` param, or a string (see note below) | Required | - | `{"tx":"/ethereum/poa/core/tx"}` |
*Note* If a path template contains `:id` or `:id_lowercase`, it will be replaced with the entity-id in its original case or lowercased respectively. If neither parameter is present, the entity-id will be appended to the end of the path in lowercase. For example, with baseUrl `https://explorer.anyblock.tools`:
* Path `{"tx":"/ethereum/poa/core/tx/:id/details"}` and entity-id `0x123...AbC` results in `https://explorer.anyblock.tools/ethereum/poa/core/tx/0x123...AbC/details`
* Path `{"tx":"/ethereum/poa/core/tx/:id_lowercase/details"}` and entity-id `0x123...AbC` results in `https://explorer.anyblock.tools/ethereum/poa/core/tx/0x123...abc/details`
* Path `{"tx":"/ethereum/poa/core/tx"}` and entity-id `0x123...AbC` results in `https://explorer.anyblock.tools/ethereum/poa/core/tx/0x123...abc`
#### Contract code IDE configuration properties
| Variable | Type | Description | Compulsoriness | Default value | Example value |
| - | - | - | - | - | - |
| title | `string` | Displayed name of the IDE | Required | - | `Remix IDE` |
| url | `string` | URL of the IDE with placeholders for contract hash (`{hash}`) and current domain (`{domain}`) | Required | - | `https://remix.blockscout.com/?address={hash}&blockscout={domain}` |
| icon\_url | `string` | URL of the IDE icon | Required | - | `https://example.com/icon.svg` |
#### Font family configuration properties
| Variable | Type | Description | Compulsoriness | Default value | Example value |
| - | - | - | - | - | - |
| name | `string` | Font family name; used to define the `font-family` CSS property. | Required | - | `Montserrat` |
| url | `string` | URL for external font. Ensure the font supports the following weights: 400, 500, 600, and 700. | Required | - | `https://fonts.googleapis.com/css2?family=Montserrat:wght@400;500;600;700&display=swap` |
## App features
*Note* The variables which are marked as required should be passed as described in order to enable the particular feature, but they are not required in the entire app context.
### My account
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_IS\_ACCOUNT\_SUPPORTED | `boolean` | Set to true if network has account feature | Required | - | `true` | v1.0.x+ |
| NEXT\_PUBLIC\_RE\_CAPTCHA\_APP\_SITE\_KEY | `boolean` | See [below](https://github.com/blockscout/docs/blob/master/setup/env-variables/frontend-common-envs/ENVS.md#google-recaptcha) | Required | - | `` | v1.0.x+ |
| NEXT\_PUBLIC\_AUTH0\_CLIENT\_ID | `string` | **DEPRECATED** Client id for [Auth0](https://auth0.com/) provider | - | - | `` | v1.0.x+ |
| NEXT\_PUBLIC\_AUTH\_URL | `string` | **DEPRECATED** Account auth base url; it is used for building login URL (`${ NEXT_PUBLIC_AUTH_URL }/auth/auth0`) and logout return URL (`${ NEXT_PUBLIC_AUTH_URL }/auth/logout`); if not provided the base app URL will be used instead | - | - | `https://blockscout.com` | v1.0.x+ |
| NEXT\_PUBLIC\_LOGOUT\_URL | `string` | **DEPRECATED** Account logout url. Required if account is supported for the app instance. | - | - | `https://blockscoutcom.us.auth0.com/v2/logout` | v1.0.x+ |
### Gas tracker
This feature is **enabled by default**. To switch it off pass `NEXT_PUBLIC_GAS_TRACKER_ENABLED=false`.
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_GAS\_TRACKER\_ENABLED | `boolean` | Set to true to enable "Gas tracker" in the app | Required | `true` | `false` | v1.25.0+ |
| NEXT\_PUBLIC\_GAS\_TRACKER\_UNITS | `ArrayβΉ"usd" \| "gwei"βΊ` | Array of units for displaying gas prices on the Gas Tracker page, in the stats snippet on the Home page, and in the top bar. The first value in the array will take priority over the second one in all mentioned views. If only one value is provided, gas prices will be displayed only in that unit. | - | `[ "usd", "gwei" ]` | `[ "gwei" ]` | v1.25.0+ |
### Advanced filter
This feature is **enabled by default**. To switch it off pass `NEXT_PUBLIC_ADVANCED_FILTER_ENABLED=false`.
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_ADVANCED\_FILTER\_ENABLED | `boolean` | Set to true to enable "Advanced filter" page in the app | Required | `true` | `false` | v1.37.0+ |
### Address verification in "My account"
*Note* all ENV variables required for [My account](https://github.com/blockscout/docs/blob/master/setup/env-variables/frontend-common-envs/ENVS.md#my-account) feature should be passed alongside the following ones:
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_CONTRACT\_INFO\_API\_HOST | `string` | Contract Info API endpoint url | Required | - | `https://contracts-info.services.blockscout.com` | v1.1.0+ |
| NEXT\_PUBLIC\_ADMIN\_SERVICE\_API\_HOST | `string` | Admin Service API endpoint url | Required | - | `https://admin-rs.services.blockscout.com` | v1.1.0+ |
### Blockchain interaction (writing to contract, etc.)
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_WALLET\_CONNECT\_PROJECT\_ID | `string` | Project id for [WalletConnect](https://cloud.walletconnect.com/) integration | Required | - | `` | v1.0.x+ |
| NEXT\_PUBLIC\_NETWORK\_RPC\_URL | `string` | See in [Blockchain parameters](https://github.com/blockscout/docs/blob/master/setup/env-variables/frontend-common-envs/ENVS.md#blockchain-parameters) section | Required | - | `https://core.poa.network` | v1.0.x+ |
| NEXT\_PUBLIC\_NETWORK\_NAME | `string` | See in [Blockchain parameters](https://github.com/blockscout/docs/blob/master/setup/env-variables/frontend-common-envs/ENVS.md#blockchain-parameters) section | Required | - | `Gnosis Chain` | v1.0.x+ |
| NEXT\_PUBLIC\_NETWORK\_ID | `number` | See in [Blockchain parameters](https://github.com/blockscout/docs/blob/master/setup/env-variables/frontend-common-envs/ENVS.md#blockchain-parameters) section | Required | - | `99` | v1.0.x+ |
| NEXT\_PUBLIC\_NETWORK\_CURRENCY\_NAME | `string` | See in [Blockchain parameters](https://github.com/blockscout/docs/blob/master/setup/env-variables/frontend-common-envs/ENVS.md#blockchain-parameters) section | Required | - | `Ether` | v1.0.x+ |
| NEXT\_PUBLIC\_NETWORK\_CURRENCY\_SYMBOL | `string` | See in [Blockchain parameters](https://github.com/blockscout/docs/blob/master/setup/env-variables/frontend-common-envs/ENVS.md#blockchain-parameters) section | Required | - | `ETH` | v1.0.x+ |
| NEXT\_PUBLIC\_NETWORK\_CURRENCY\_DECIMALS | `string` | See in [Blockchain parameters](https://github.com/blockscout/docs/blob/master/setup/env-variables/frontend-common-envs/ENVS.md#blockchain-parameters) section | - | `18` | `6` | v1.0.x+ |
### Banner ads
Ads are enabled by default on all self-hosted instances. If you would like to disable ads, you can disable using the [Autoscout hosted service](/using-blockscout/autoscout).
### Text ads
Ads are enabled by default on all self-hosted instances. If you would like to disable ads, you can disable using the [Autoscout hosted service](/using-blockscout/autoscout).
### Beacon chain
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_HAS\_BEACON\_CHAIN | `boolean` | Set to true for networks with the beacon chain | Required | - | `true` | v1.0.x+ |
| NEXT\_PUBLIC\_BEACON\_CHAIN\_CURRENCY\_SYMBOL | `string` | Beacon network currency symbol | - | `NEXT_PUBLIC_NETWORK_CURRENCY_SYMBOL` | `ETH` | v1.0.x+ |
### User operations (ERC-4337)
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_HAS\_USER\_OPS | `boolean` | Set to true to show user operations related data and pages | - | - | `true` | v1.23.0+ |
### Rollup chain
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_ROLLUP\_TYPE | `"optimistic" \| "arbitrum" \| "shibarium" \| "zkEvm" \| "zkSync" \| "scroll"` | Rollup chain type | Required | - | `"optimistic"` | v1.24.0+ |
| NEXT\_PUBLIC\_ROLLUP\_L1\_BASE\_URL | `string` | Blockscout base URL for L1 network. **DEPRECATED** **`Use NEXT_PUBLIC_ROLLUP_PARENT_CHAIN instead`** | Required | - | `http://eth-goerli.blockscout.com` | v1.24.0+ |
| NEXT\_PUBLIC\_ROLLUP\_L2\_WITHDRAWAL\_URL | `string` | URL for L2 -> L1 withdrawals (Optimistic stack only) | Required for `optimistic` rollups | - | `https://app.optimism.io/bridge/withdraw` | v1.24.0+ |
| NEXT\_PUBLIC\_ROLLUP\_STAGE\_INDEX | `"1" \| "2"` | Reflects the maturity and decentralization level of the chain based on [L2BEAT's framework](https://medium.com/l2beat/introducing-stages-a-framework-to-evaluate-rollups-maturity-d290bb22befe). The label will be added to the sidebar according to the provided stage index. Not applicable for testnets. | - | - | `"1"` | v2.1.0+ |
| NEXT\_PUBLIC\_FAULT\_PROOF\_ENABLED | `boolean` | Set to `true` for chains with fault proof system enabled (Optimistic stack only) | - | - | `true` | v1.31.0+ |
| NEXT\_PUBLIC\_HAS\_MUD\_FRAMEWORK | `boolean` | Set to `true` for instances that use MUD framework (Optimistic stack only) | - | - | `true` | v1.33.0+ |
| NEXT\_PUBLIC\_INTEROP\_ENABLED | `boolean` | Enables "Interop messages" page (Optimistic stack only) | - | `false` | `true` | v1.39.0+ |
| NEXT\_PUBLIC\_ROLLUP\_HOMEPAGE\_SHOW\_LATEST\_BLOCKS | `boolean` | Set to `true` to display "Latest blocks" widget instead of "Latest batches" on the home page | - | - | `true` | v1.36.0+ |
| NEXT\_PUBLIC\_ROLLUP\_OUTPUT\_ROOTS\_ENABLED | `boolean` | Enables "Output roots" page (Optimistic stack only) | - | `false` | `true` | v1.37.0+ |
| NEXT\_PUBLIC\_ROLLUP\_PARENT\_CHAIN\_NAME | `string` | Set to customize L1 transaction status labels in the UI (e.g., "Sent to "). This setting is applicable only for Arbitrum-based chains. **DEPRECATED** **`Use NEXT_PUBLIC_ROLLUP_PARENT_CHAIN instead`** | - | - | `DuckChain` | v1.37.0+ |
| NEXT\_PUBLIC\_ROLLUP\_PARENT\_CHAIN | `ParentChain`, see details [below](/setup/env-variables/frontend-common-envs/envs#parent-chain-configuration-properties) | Configuration parameters for the parent chain. | - | - | `{"baseUrl":"https://explorer.duckchain.io"}` | v1.38.0+ |
| NEXT\_PUBLIC\_ROLLUP\_DA\_CELESTIA\_NAMESPACE | `string` | Hex-string for creating a link to the transaction batch on the Celenium explorer. "0x"-format and 60 symbol length. Available only for Arbitrum roll-ups. | - | - | `0x00000000000000000000000000000000000000ca1de12a9905be97beaf` | v1.38.0+ |
| NEXT\_PUBLIC\_ROLLUP\_DA\_CELESTIA\_CELENIUM\_URL | `string` | URL for the Celenium explorer. It is used to create links to the Data Availability Blobs page. The URL should contain the full path without any search parameters related to the blob, as these will be constructed at runtime for each blob separately. Available only for Optimistic or Arbitrum roll-ups. | - | - | `https://mocha.celenium.io/blob` | v2.0.2+ |
#### Parent chain configuration properties
| Variable | Type | Description | Compulsoriness | Default value | Example value |
| - | - | - | - | - | - |
| id | `number` | Chain id, see [https://chainlist.org](https://chainlist.org) for the reference. | - | - | `42` |
| name | `string` | Displayed name of the chain. Set to customize L1 transaction status labels in the UI (e.g., "Sent to "). Currently, this setting is applicable only for Arbitrum-based chains. | - | - | `DuckChain` |
| baseUrl | `string` | Base url of the chain explorer. | Required | - | `https://explorer.duckchain.io` |
| rpcUrls | `ArrayβΉstringβΊ` | Chain public RPC server urls, see [https://chainlist.org](https://chainlist.org) for the reference. | - | - | `["https://rpc.duckchain.io"]` |
| currency | `{ name: string; symbol: string; decimals: number; }` | Chain currency config. | - | - | `{ name: Quack, symbol: QUA, decimals: 18 }` |
| isTestnet | `boolean` | Set to true if network is testnet. | - | - | `true` |
### Export data to CSV file
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_RE\_CAPTCHA\_APP\_SITE\_KEY | `string` | See [below](https://github.com/blockscout/docs/blob/master/setup/env-variables/frontend-common-envs/ENVS.md#google-recaptcha) | true | - | `` | v1.0.x+ |
### Google analytics
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_GOOGLE\_ANALYTICS\_PROPERTY\_ID | `string` | Property ID for [Google Analytics](https://analytics.google.com/) service | true | - | `UA-XXXXXX-X` | v1.0.x+ |
### Mixpanel analytics
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_MIXPANEL\_PROJECT\_TOKEN | `string` | Project token for [Mixpanel](https://mixpanel.com/) analytics service | true | - | `` | v1.1.0+ |
### GrowthBook feature flagging and A/B testing
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_GROWTH\_BOOK\_CLIENT\_KEY | `string` | Client SDK key for [GrowthBook](https://www.growthbook.io/) service | true | - | `` | v1.22.0+ |
### GraphQL API documentation
This feature is **always enabled**, but you can disable it by passing `none` value to `NEXT_PUBLIC_GRAPHIQL_TRANSACTION` variable.
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_GRAPHIQL\_TRANSACTION | `string` | Txn hash for default query at GraphQl playground page. Pass `none` to disable the feature. | - | - | `0x4a0ed8ddf751a7cb5297f827699117b0f6d21a0b2907594d300dc9fed75c7e62` | v1.0.x+ |
### REST API documentation
This feature is **always enabled**, but you can disable it by passing `none` value to `NEXT_PUBLIC_API_SPEC_URL` variable.
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_API\_SPEC\_URL | `string` | Spec to be displayed on `/api-docs` page. Pass `none` to disable the feature. | - | `https://raw.githubusercontent.com/blockscout/blockscout-api-v2-swagger/main/swagger.yaml` | `https://raw.githubusercontent.com/blockscout/blockscout-api-v2-swagger/main/swagger.yaml` | v1.0.x+ |
### Marketplace
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_MARKETPLACE\_ENABLED | `boolean` | `true` means that the marketplace page will be enabled | Required | - | `true` | v1.24.1+ |
| NEXT\_PUBLIC\_MARKETPLACE\_CONFIG\_URL | `string` | URL of configuration file (`.json` format only) which contains list of apps that will be shown on the marketplace page. See [below](/setup/env-variables/frontend-common-envs/envs#marketplace-app-configuration-properties) list of available properties for an app. Can be replaced with NEXT\_PUBLIC\_ADMIN\_SERVICE\_API\_HOST | Required | - | `https://example.com/marketplace_config.json` | v1.0.x+ |
| NEXT\_PUBLIC\_ADMIN\_SERVICE\_API\_HOST | `string` | Admin Service API endpoint url. Can be used instead of NEXT\_PUBLIC\_MARKETPLACE\_CONFIG\_URL | - | - | `https://admin-rs.services.blockscout.com` | v1.1.0+ |
| NEXT\_PUBLIC\_MARKETPLACE\_SUBMIT\_FORM | `string` | Link to form where authors can submit their dapps to the marketplace | Required | - | `https://airtable.com/shrqUAcjgGJ4jU88C` | v1.0.x+ |
| NEXT\_PUBLIC\_MARKETPLACE\_SUGGEST\_IDEAS\_FORM | `string` | Link to form where users can suggest ideas for the marketplace | - | - | `https://airtable.com/appiy5yijZpMMSKjT/pag3t82DUCyhGRZZO/form` | v1.24.0+ |
| NEXT\_PUBLIC\_NETWORK\_RPC\_URL | `string` | See in [Blockchain parameters](https://github.com/blockscout/docs/blob/master/setup/env-variables/frontend-common-envs/ENVS.md#blockchain-parameters) section | Required | - | `https://core.poa.network` | v1.0.x+ |
| NEXT\_PUBLIC\_MARKETPLACE\_CATEGORIES\_URL | `string` | URL of configuration file (`.json` format only) which contains the list of categories to be displayed on the marketplace page in the specified order. If no URL is provided, then the list of categories will be compiled based on the `categories` fields from the marketplace (apps) configuration file | - | - | `https://example.com/marketplace_categories.json` | v1.23.0+ |
| NEXT\_PUBLIC\_MARKETPLACE\_SECURITY\_REPORTS\_URL | `string` | URL of configuration file (`.json` format only) which contains app security reports for displaying security scores on the Marketplace page | - | - | `https://example.com/marketplace_security_reports.json` | v1.28.0+ |
| NEXT\_PUBLIC\_MARKETPLACE\_FEATURED\_APP | `string` | ID of the featured application to be displayed on the banner on the Marketplace page | - | - | `uniswap` | v1.29.0+ |
| NEXT\_PUBLIC\_MARKETPLACE\_BANNER\_CONTENT\_URL | `string` | URL of the banner HTML content | - | - | `https://example.com/banner` | v1.29.0+ |
| NEXT\_PUBLIC\_MARKETPLACE\_BANNER\_LINK\_URL | `string` | URL of the page the banner leads to | - | - | `https://example.com` | v1.29.0+ |
| NEXT\_PUBLIC\_MARKETPLACE\_RATING\_AIRTABLE\_API\_KEY | `string` | Airtable API key | - | - | - | v1.33.0+ |
| NEXT\_PUBLIC\_MARKETPLACE\_RATING\_AIRTABLE\_BASE\_ID | `string` | Airtable base ID with dapp ratings | - | - | - | v1.33.0+ |
| NEXT\_PUBLIC\_MARKETPLACE\_GRAPH\_LINKS\_URL | `string` | URL of the file (`.json` format only) which contains the list of The Graph links to be displayed on the Marketplace page | - | - | `https://example.com/graph_links.json` | v1.36.0+ |
#### Marketplace app configuration properties
| Property | Type | Description | Compulsoriness | Example value |
| - | - | - | - | - |
| id | `string` | Used as slug for the app. Must be unique in the app list. | Required | `app` |
| external | `boolean` | `true` means that the application opens in a new window, but not in an iframe. | - | `true` |
| title | `string` | Displayed title of the app. | Required | `The App` |
| logo | `string` | URL to logo file. Should be at least 288x288. | Required | `https://foo.app/icon.png` |
| shortDescription | `string` | Displayed only in the app list. | Required | `Awesome app` |
| categories | `ArrayβΉstringβΊ` | Displayed category. | Required | `[Security, Tools]` |
| author | `string` | Displayed author of the app | Required | `Bob` |
| url | `string` | URL of the app which will be launched in the iframe. | Required | `https://foo.app/launch` |
| description | `string` | Displayed only in the modal dialog with additional info about the app. | Required | `The best app` |
| site | `string` | Displayed site link | - | `https://blockscout.com` |
| twitter | `string` | Displayed twitter link | - | `https://twitter.com/blockscoutcom` |
| telegram | `string` | Displayed telegram link | - | `https://t.me/poa_network` |
| github | `string` | Displayed github link | - | `https://github.com/blockscout` |
| internalWallet | `boolean` | `true` means that the application can automatically connect to the Blockscout wallet. | - | `true` |
| priority | `number` | The higher the priority, the higher the app will appear in the list on the Marketplace page. | - | `7` |
### Solidity to UML diagrams
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_VISUALIZE\_API\_HOST | `string` | Visualize API endpoint url | Required | - | `https://visualizer.services.blockscout.com` | v1.0.x+ |
| NEXT\_PUBLIC\_VISUALIZE\_API\_BASE\_PATH | `string` | Base path for Visualize API endpoint url | - | - | `/poa/core` | v1.29.0+ |
### Blockchain statistics
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_STATS\_API\_HOST | `string` | Stats API endpoint url | Required | - | `https://stats.services.blockscout.com` | v1.0.x+ |
| NEXT\_PUBLIC\_STATS\_API\_BASE\_PATH | `string` | Base path for Stats API endpoint url | - | - | `/poa/core` | v1.29.0+ |
### Web3 wallet integration (add token or network to the wallet)
This feature is **enabled by default** with the `[metamask]` value. To switch it off pass `NEXT_PUBLIC_WEB3_WALLETS=none`.
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_WEB3\_WALLETS | `ArrayβΉ"metamask" \| "coinbase" \| "token_pocket"βΊ` | Array of Web3 wallets which will be used to add tokens or chain to. The first wallet which is enabled in user's browser will be shown. | - | `[ "metamask" ]` | `[ "coinbase" ]` | v1.10.0+ |
| NEXT\_PUBLIC\_WEB3\_DISABLE\_ADD\_TOKEN\_TO\_WALLET | `boolean` | Set to `true` to hide icon "Add to your wallet" next to token addresses | - | - | `true` | v1.0.x+ |
### Transaction interpretation
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_TRANSACTION\_INTERPRETATION\_PROVIDER | `"blockscout" \| "noves" \| "none"` | Transaction interpretation provider that displays human readable transaction description | - | `none` | `blockscout` | v1.21.0+ |
### External transactions
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_TX\_EXTERNAL\_TRANSACTIONS\_CONFIG | `{ chain_name: string; chain_logo_url: string; explorer_url_template: string; }` | Configuration of the external transactions links that should be added to the transaction details. | - | - | `{ "chain_name": "ethereum", "chain_logo_url": "https://example.com/logo.png", "explorer_url_template": "https://explorer.com/tx/{hash}" }` | v1.38.0+ |
### Verified tokens info
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_CONTRACT\_INFO\_API\_HOST | `string` | Contract Info API endpoint url | Required | - | `https://contracts-info.services.blockscout.com` | v1.0.x+ |
### Name service integration
This feature allows resolving blockchain addresses using human-readable domain names.
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_NAME\_SERVICE\_API\_HOST | `string` | Name Service API endpoint url | Required | - | `https://bens.services.blockscout.com` | v1.22.0+ |
### Metadata service integration
This feature allows name tags and other public tags for addresses.
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_METADATA\_SERVICE\_API\_HOST | `string` | Metadata Service API endpoint url | Required | - | `https://metadata.services.blockscout.com` | v1.30.0+ |
### Public tag submission
This feature allows you to submit an application with a public address tag.
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_METADATA\_SERVICE\_API\_HOST | `string` | Metadata Service API endpoint url | Required | - | `https://metadata.services.blockscout.com` | v1.30.0+ |
| NEXT\_PUBLIC\_ADMIN\_SERVICE\_API\_HOST | `string` | Admin Service API endpoint url | Required | - | `https://admin-rs.services.blockscout.com` | v1.1.0+ |
| NEXT\_PUBLIC\_RE\_CAPTCHA\_APP\_SITE\_KEY | `string` | See [below](https://github.com/blockscout/docs/blob/master/setup/env-variables/frontend-common-envs/ENVS.md#google-recaptcha) | true | - | `` | v1.0.x+ |
### Data Availability
This feature enables views related to blob transactions (EIP-4844), such as the Blob Txns tab on the Transactions page and the Blob details page.
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_DATA\_AVAILABILITY\_ENABLED | `boolean` | Set to true to enable blob transactions views. | Required | - | `true` | v1.28.0+ |
### Bridged tokens
This feature allows users to view tokens that have been bridged from other EVM chains. Additional tab "Bridged" will be added to the tokens page and the link to the original token will be displayed on the token page.
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_BRIDGED\_TOKENS\_CHAINS | `ArrayβΉBridgedTokenChainβΊ` where `BridgedTokenChain` can have following [properties](/setup/env-variables/frontend-common-envs/envs#bridged-token-chain-configuration-properties) | Used for displaying filter by the chain from which tokens were bridged. Also, used for creating links to original tokens in other explorers. | Required | - | `[{"id":"1","title":"Ethereum","short_title":"ETH","base_url":"https://eth.blockscout.com/token"}]` | v1.14.0+ |
| NEXT\_PUBLIC\_BRIDGED\_TOKENS\_BRIDGES | `ArrayβΉTokenBridgeβΊ` where `TokenBridge` can have following [properties](/setup/env-variables/frontend-common-envs/envs#token-bridge-configuration-properties) | Used for displaying text about bridges types on the tokens page. | Required | - | `[{"type":"omni","title":"OmniBridge","short_title":"OMNI"}]` | v1.14.0+ |
#### Bridged token chain configuration properties
| Variable | Type | Description | Compulsoriness | Default value | Example value |
| - | - | - | - | - | - |
| id | `string` | Base chain id, see [https://chainlist.org](https://chainlist.org) for the reference | Required | - | `1` |
| title | `string` | Displayed name of the chain | Required | - | `Ethereum` |
| short\_title | `string` | Used for displaying chain name in the list view as tag | Required | - | `ETH` |
| base\_url | `string` | Base url to original token in base chain explorer | Required | - | `https://eth.blockscout.com/token` |
*Note* The url to the original token will be constructed as `/`, e.g. `https://eth.blockscout.com/token/`
#### Token bridge configuration properties
| Variable | Type | Description | Compulsoriness | Default value | Example value |
| - | - | - | - | - | - |
| type | `string` | Bridge type; should be matched to `bridge_type` field in API response | Required | - | `omni` |
| title | `string` | Bridge title | Required | - | `OmniBridge` |
| short\_title | `string` | Bridge short title for displaying in the tags | Required | - | `OMNI` |
### SafeCore address tags
For the smart contract addresses which are [Safe accounts](https://safe.global/) public tag "Multisig: Safe" will be displayed in the address page header alongside the Safe logo.
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_SAFE\_TX\_SERVICE\_URL | `string` | The Safe transaction service URL. See full list of supported networks [here](https://docs.safe.global/api-supported-networks). | - | - | `uniswap` | v1.26.0+ |
### Address profile API
This feature allows the integration of an external API to fetch user info for addresses or contracts. When configured, if the API returns a username, a public tag with a custom link will be displayed in the address page header.
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_ADDRESS\_USERNAME\_TAG | `{api_url: string; tag_link_template: string; tag_icon: string; tag_bg_color: string; tag_text_color: string}` | Address profile API tag configuration properties. See [below](/setup/env-variables/frontend-common-envs/envs#user-profile-api-configuration-properties). | - | - | `uniswap` | v1.35.0+ |
#### Address profile API configuration properties
| Variable | Type | Description | Compulsoriness | Default value | Example value |
| - | - | - | - | - | - |
| api\_url\_template | `string` | User profile API URL. Should be a template with `{address}` variable | Required | - | `https://example-api.com/{address}` |
| tag\_link\_template | `string` | External link to the profile. Should be a template with `{username}` variable | - | - | `https://example.com/{address}` |
| tag\_icon | `string` | Public tag icon (.svg) url | - | - | `https://example.com/icon.svg` |
| tag\_bg\_color | `string` | Public tag background color (escape "#" symbol if you use HEX color codes or use rgba-value instead) | - | - | `\\#000000` |
| tag\_text\_color | `string` | Public tag text color (escape "#" symbol if you use HEX color codes or use rgba-value instead) | - | - | `\\#FFFFFF` |
### Address XStar XHS score
This feature allows the integration of an XStar API to fetch XHS score for addresses. When configured, if the API returns a score, a public tag with that score will be displayed in the address page header.
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_XSTAR\_SCORE\_URL | `string` | XStar XHS score documentation URL for the address tag. Enables the XStar score feature. | - | - | `https://docs.xname.app/the-solution-adaptive-proof-of-humanity-on-blockchain/xhs-scoring-algorithm` | v1.36.0+ |
### SUAVE chain
For blockchains that implement SUAVE architecture additional fields will be shown on the transaction page ("Allowed peekers", "Kettle"). Users also will be able to see the list of all transactions for a particular Kettle in the separate view.
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_IS\_SUAVE\_CHAIN | `boolean` | Set to true for blockchains with [SUAVE architecture](https://writings.flashbots.net/mevm-suave-centauri-and-beyond) | Required | - | `true` | v1.14.0+ |
### Celo chain
For blockchains that use the Celo platform. *Note*, that once the Celo mainnet becomes an L2 chain, these variables will be migrated to the Rollup configuration section.
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_CELO\_ENABLED | `boolean` | Indicates that it is a Celo-based chain. | - | - | `true` | v1.37.0+ |
| NEXT\_PUBLIC\_CELO\_L2\_UPGRADE\_BLOCK | `number` | Indicates the block number when the Celo-type chain transitioned to L2. This is used to display links to the Epoch block page from a regular block page. | - | - | `26369280` | v1.37.0+ |
### Ton Application Chain (TAC)
For Ton Application Chains, this feature enables additional views, such as a list of cross-chain operations and a detailed page for a specific cross-chain operation, as well as extra fields on the transaction page.
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_TAC\_OPERATION\_LIFECYCLE\_API\_HOST | `string` | URL for the TAC Operation Lifecycle service. | Required | - | `https://tac-operation-lifecycle.blockscout.com` | v2.1.0+ |
| NEXT\_PUBLIC\_TAC\_TON\_EXPLORER\_URL | `string` | URL of the Ton chain explorer. This is used to build links to transactions and addresses on the Ton chain. | Required | - | `https://tonscan.org` | v2.1.0+ |
### MetaSuites extension
Enables [MetaSuites browser extension](https://github.com/blocksecteam/metasuites) to integrate with the app views.
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_METASUITES\_ENABLED | `boolean` | Set to true to enable integration | Required | - | `true` | v1.26.0+ |
### Validators list
The feature enables the Validators page which provides detailed information about the validators of the PoS chains.
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_VALIDATORS\_CHAIN\_TYPE | `"stability" \| "blackfort" \| "zilliqa"` | Chain type | Required | - | `"stability"` | v1.25.0+ |
### Sentry error monitoring
*Note* This feature is **deprecated**. All ENV variables will be removed in the future releases.
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_SENTRY\_DSN | `string` | Client key for your Sentry.io app | Required | - | `` | v1.0.x+ |
| SENTRY\_CSP\_REPORT\_URI | `string` | URL for sending CSP-reports to your Sentry.io app | - | - | `` | v1.0.x+ |
| NEXT\_PUBLIC\_SENTRY\_ENABLE\_TRACING | `boolean` | Enables tracing and performance monitoring in Sentry.io | - | `false` | `true` | v1.17.0+ |
### Rollbar error monitoring
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_ROLLBAR\_CLIENT\_TOKEN | `string` | Client token for your Rollbar project | Required | - | `` | v1.37.x+ |
### OpenTelemetry
OpenTelemetry SDK for Node.js app could be enabled by passing `OTEL_SDK_ENABLED=true` variable. Configure the OpenTelemetry Protocol Exporter by using the generic environment variables described in the [OT docs](https://opentelemetry.io/docs/specs/otel/protocol/exporter/#configuration-options). Note that this Next.js feature is currently experimental. The Docker image should be built with the `NEXT_OPEN_TELEMETRY_ENABLED=true` argument to enable it.
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| OTEL\_SDK\_ENABLED | `boolean` | Run-time flag to enable the feature | Required | `false` | `true` | v1.18.0+ |
### DeFi dropdown
If the feature is enabled, a single button or a dropdown (if more than 1 item is provided) will be displayed at the top of the explorer page, which will take a user to the specified application in the marketplace or to an external site.
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_DEFI\_DROPDOWN\_ITEMS | `[{ text: string; icon: string; dappId?: string, url?: string }]` | An array of dropdown items containing the button text, icon name and dappId in DAppscout or an external url | - | - | `[{"text":"Swap","icon":"swap","dappId":"uniswap"},{"text":"Payment link","icon":"payment_link","dappId":"peanut-protocol"}]` | v1.31.0+ |
### Multichain balance button
If the feature is enabled, a Multichain balance button will be displayed on the address page, which will take you to the portfolio application in the marketplace or to an external site.
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_MULTICHAIN\_BALANCE\_PROVIDER\_CONFIG | `[{ name: string; url_template: string; dapp_id?: string; logo: string }]` | Multichain portfolio application config See [below](/setup/env-variables/frontend-common-envs/envs#multichain-button-configuration-properties) | - | - | `[{ "name": "zerion", "url_template": "https://app.zerion.io/{address}/overview", "logo": "https://example.com/icon.svg"}]` | v1.31.0+ |
#### Multichain button configuration properties
| Variable | Type | Description | Compulsoriness | Default value | Example value |
| - | - | - | - | - | - |
| name | `string` | Multichain portfolio application name | Required | - | `zerion` |
| url\_template | `string` | Url template to the portfolio. Should be a template with `{address}` variable | Required | - | `https://app.zerion.io/{address}/overview` |
| dapp\_id | `string` | Set to open a Blockscout dapp page with the portfolio instead of opening external app page | - | - | `zerion` |
| logo | `string` | Multichain portfolio application logo (.svg) url | - | - | `https://example.com/icon.svg` |
### Get gas button
If the feature is enabled, a Get gas button will be displayed in the top bar, which will take you to the gas refuel application in the marketplace or to an external site.
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_GAS\_REFUEL\_PROVIDER\_CONFIG | `{ name: string; url_template: string; dapp_id?: string; logo?: string }` | Get gas button config. See [below](/setup/env-variables/frontend-common-envs/envs#get-gas-button-configuration-properties) | - | - | `{ "name": "Need gas?", "dapp_id": "smol-refuel", "url_template": "https://smolrefuel.com/?outboundChain={chainId}", "logo": "https://example.com/icon.png" }` | v1.33.0+ |
#### Get gas button configuration properties
| Variable | Type | Description | Compulsoriness | Default value | Example value |
| - | - | - | - | - | - |
| name | `string` | Text on the button | Required | - | `Need gas?` |
| url\_template | `string` | Url template, may contain `{chainId}` variable | Required | - | `https://smolrefuel.com/?outboundChain={chainId}` |
| dapp\_id | `string` | Set to open a Blockscout dapp page instead of opening external app page | - | - | `smol-refuel` |
| logo | `string` | Gas refuel application logo url | - | - | `https://example.com/icon.png` |
### Save on gas with GasHawk
The feature enables a "Save with GasHawk" button next to the "Gas used" value on the address page.
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_SAVE\_ON\_GAS\_ENABLED | `boolean` | Set to "true" to enable the feature | - | - | `true` | v1.35.0+ |
### Rewards service API
This feature enables the Blockscout Merits program. It requires that the [My account](https://github.com/blockscout/docs/blob/master/setup/env-variables/frontend-common-envs/ENVS.md#my-account) and [Blockchain interaction](https://github.com/blockscout/docs/blob/master/setup/env-variables/frontend-common-envs/ENVS.md#blockchain-interaction-writing-to-contract-etc) features are also enabled.
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_REWARDS\_SERVICE\_API\_HOST | `string` | API URL | - | - | `https://example.com` | v1.36.0+ |
### DEX pools
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_DEX\_POOLS\_ENABLED | `boolean` | Set to true to enable the feature | Required | - | `true` | v1.37.0+ |
| NEXT\_PUBLIC\_CONTRACT\_INFO\_API\_HOST | `string` | Contract Info API endpoint url | Required | - | `https://contracts-info.services.blockscout.com` | v1.0.x+ |
### Badge claim link
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_GAME\_BADGE\_CLAIM\_LINK | `string` | Provide to enable the easter egg badge feature | - | - | `https://example.com` | v1.37.0+ |
## External services configuration
### Google ReCaptcha
To obtain the variable values, please refer to the [reCAPTCHA documentation](https://developers.google.com/recaptcha) and check the [Blockscout reCAPTCHA config docs](https://docs.blockscout.com/setup/configuration-options/recaptcha). Please note that we currently support only **reCAPTCHA v2 in invisible mode**, read more [here](https://developers.google.com/recaptcha/docs/versions#recaptcha_v2_invisible_recaptcha_badge).
| Variable | Type | Description | Compulsoriness | Default value | Example value | Version |
| - | - | - | - | - | - | - |
| NEXT\_PUBLIC\_RE\_CAPTCHA\_V3\_APP\_SITE\_KEY | `string` | **DEPRECATED** Google reCAPTCHA v3 site key | - | - | `` | v1.36.x |
| NEXT\_PUBLIC\_RE\_CAPTCHA\_APP\_SITE\_KEY | `string` | Google reCAPTCHA v2 site key | - | - | `` | v1.0.x+ |
# Indexing
Source: https://docs.blockscout.com/setup/indexing
Understand how Blockscout indexes blocks and internal transactions, monitor progress with SQL queries, and troubleshoot indexing issues.
π [Autoscout is now available](/using-blockscout/autoscout), providing a simple one-click explorer deployment with Blockscout's optimized hosting infrastructure. Use it for early testing, modifications, and launching a full production-grade explorer. [**Get Started Now**](/using-blockscout/autoscout) **and have your explorer up-and-running in minutes.**
BlockScout can take some time to fully index a chain. Larger chains require more time. Indexing starts from the head of the chain (the current block) and goes backwards towards the genesis block. The genesis block is the final block indexed during this process.
### Messages during indexing
1. **n% Blocks Indexed - We're indexing this chain right now. Some of the counts may be inaccurate.** This means blocks are still being collected and processed by BlockScout. The message should disappear once the genesis block is indexed.
2. **Blocks With Internal Transactions Indexed - We're indexing this chain right now. Some of the counts may be inaccurate.** This means BlockScout has collected all blocks but is still indexing internal transactions using the archive node tracing api. This message will disappear when `INDEXER_DISABLE_INTERNAL_TRANSACTIONS_FETCHER=true` is provided.
### Monitoring indexing processes
#### Monitoring blocks/transactions indexing
1. Block count should be close to the number of the blocks in the chain. Query using `SELECT COUNT(1) FROM blocks;` \~= num of blocks in the chain.
2. The number of missing blocks in the chain can be monitored with this query:
```sql theme={null}
SELECT COUNT(DISTINCT b1.number)
FROM generate_series(0, (SELECT MAX(number) FROM blocks)) AS b1(number)
WHERE NOT EXISTS (
SELECT 1 FROM blocks b2 WHERE b2.number=b1.number AND b2.consensus
);
```
#### Monitoring internal transactions indexing
Internal transaction fetching can be monitored with this query: `SELECT COUNT(1) FROM pending_block_operations;` It should move towards zero during internal transaction processing.
# How Do I Fix Indexer Timeouts?
Source: https://docs.blockscout.com/setup/indexing/how-do-i-fix-indexer-timeouts
Tune Blockscout indexer fetcher batch size and concurrency to resolve JSON-RPC timeout errors and reduce load on the underlying archive node.
BlockScout utilizes two separate indexers in order to index the network history as well as keep up with new incoming blocks. Due to this process, a node may become overloaded and not respond to BlockScout's RPC requests within the designated timeout period.
The indexer umbrella application can be tweaked to meet your node's size and responsiveness. Outlined below are the locations and adjustments that can be made to each fetcher.
Fetchers are available at [https://github.com/blockscout/blockscout/tree/master/apps/indexer/lib/indexer/fetcher](https://github.com/blockscout/blockscout/tree/master/apps/indexer/lib/indexer/fetcher)
| Fetcher | Description | Batch size | Concurrency |
| - | - | - | - |
| [Catchup Block Fetcher](https://github.com/blockscout/blockscout/blob/1475e3bfd002d9397efd0f0cc29c20f39a70d023/apps/indexer/lib/indexer/block/catchup/fetcher.ex#L24) | This fetcher indexes blocks, transactions and receipts starting from the tip of the chain working backward to the Genesis block. | 10 `INDEXER_CATCHUP_BLOCKS_BATCH_SIZE` | 10 `INDEXER_CATCHUP_BLOCKS_CONCURRENCY` |
| [Transaction Receipts Fetcher](https://github.com/blockscout/blockscout/blob/4b272cf61dc14da76416be63f1f1df044b03a4b9/apps/indexer/lib/indexer/block/fetcher.ex#L85-L86) | Transaction receipts fetcher. | 250 `INDEXER_RECEIPTS_BATCH_SIZE` | 10 `INDEXER_RECEIPTS_CONCURRENCY` |
| [Internal Transaction Fetcher](https://github.com/blockscout/blockscout/blob/1475e3bfd002d9397efd0f0cc29c20f39a70d023/apps/indexer/lib/indexer/internal_transaction/fetcher.ex#L20) | This fetcher indexes internal transactions. For the real-time fetcher this process is done synchronously and for the catchup fetcher, this process is done asynchronously. | 10 `INDEXER_INTERNAL_TRANSACTIONS_BATCH_SIZE` | 4 `INDEXER_INTERNAL_TRANSACTIONS_CONCURRENCY` |
| [Coin Balance Fetcher](https://github.com/blockscout/blockscout/blob/1475e3bfd002d9397efd0f0cc29c20f39a70d023/apps/indexer/lib/indexer/coin_balance/fetcher.ex#L22) | This fetcher indexes each coin balance at the block height the address was interacted with. | 100 `INDEXER_COIN_BALANCES_BATCH_SIZE` | 4 `INDEXER_COIN_BALANCES_CONCURRENCY` |
| [Uncle Block Fetcher](https://github.com/blockscout/blockscout/blob/1475e3bfd002d9397efd0f0cc29c20f39a70d023/apps/indexer/lib/indexer/block/uncle/fetcher.ex#L22) | This fetcher indexes non-consensus blocks, transactions, and receipts. | 10 | 10 |
| [Token Balance Fetcher](https://github.com/blockscout/blockscout/blob/1475e3bfd002d9397efd0f0cc29c20f39a70d023/apps/indexer/lib/indexer/token_balance/fetcher.ex#L29) | This fetcher indexes token balances. Note you may experience some token balances that cannot be fetched due to a malformed smart contract or other functions that do not allow a balance to be fetched. | 100 `INDEXER_TOKEN_BALANCES_BATCH_SIZE` | 10 `INDEXER_TOKEN_BALANCES_CONCURRENCY` |
| [Token Fetcher](https://github.com/blockscout/blockscout/blob/1475e3bfd002d9397efd0f0cc29c20f39a70d023/apps/indexer/lib/indexer/token/fetcher.ex#L18) | This indexer fetches the metadata for a token contract | 1 | 10 |
| [Block Reward Fetcher](https://github.com/blockscout/blockscout/blob/4b272cf61dc14da76416be63f1f1df044b03a4b9/apps/indexer/lib/indexer/fetcher/block_reward.ex#L28-L29) | Block reward fetcher. | 10 `INDEXER_BLOCK_REWARD_BATCH_SIZE` | 10 `INDEXER_BLOCK_REWARD_CONCURRENCY` |
| [Token Instance Realtime Fetcher](https://github.com/blockscout/blockscout/blob/4b272cf61dc14da76416be63f1f1df044b03a4b9/apps/indexer/lib/indexer/fetcher/token_instance/realtime.ex#L16-L17) | Token instance realtime fetcher. | 1 `INDEXER_TOKEN_INSTANCE_REALTIME_BATCH_SIZE` | 10 `INDEXER_TOKEN_INSTANCE_REALTIME_CONCURRENCY` |
| [Token Instance Retry Fetcher](https://github.com/blockscout/blockscout/blob/4b272cf61dc14da76416be63f1f1df044b03a4b9/apps/indexer/lib/indexer/fetcher/token_instance/retry.ex#L16-L17) | Token instance retry fetcher. | 10 `INDEXER_TOKEN_INSTANCE_RETRY_CONCURRENCY` | 10 `INDEXER_TOKEN_INSTANCE_RETRY_BATCH_SIZE` |
| [Token Instance Sanitize Fetcher](https://github.com/blockscout/blockscout/blob/4b272cf61dc14da76416be63f1f1df044b03a4b9/apps/indexer/lib/indexer/fetcher/token_instance/sanitize.ex#L16-L17) | Token instance sanitize fetcher. | 10 `INDEXER_TOKEN_INSTANCE_SANITIZE_BATCH_SIZE` | 10 `INDEXER_TOKEN_INSTANCE_SANITIZE_CONCURRENCY` |
## Understanding Errors and Timeouts
`application=indexer fetcher=coin_balance count=500 error_count=500 [error] failed to fetch: :timeout`
In the error provided above, we can tell that the **indexer** application failed to fetch **500** **coin balances** due to a **timeout** error. Usually, when an indexer starts to receive timeouts, many more timeouts from other fetchers will occur as well.
### Resolving Timeout Issues
The best action to take when fetchers start to receive timeouts is to lower the batch size and concurrency of a few fetchers which will put less pressure on the node.
The two indexers that cause the most strain to the node are the block fetcher and the internal transactions fetcher. It would be advised to cut these fetchers' values in half and restart the application. A restart of the node may also be required.
### Other Actions
BlockScout comes equipped with functionality to automatically stop sending requests for `n` seconds if timeouts are detected. You may adjust these settings by setting a different value for `wait_per_timeout`.
[https://github.com/poanetwork/blockscout/blob/1475e3bfd002d9397efd0f0cc29c20f39a70d023/apps/ethereum\_jsonrpc/config/config.exs#L3-L9](https://github.com/poanetwork/blockscout/blob/1475e3bfd002d9397efd0f0cc29c20f39a70d023/apps/ethereum_jsonrpc/config/config.exs#L3-L9)
Content moved from [https://forum.poa.network/t/faq-how-do-i-fix-indexer-timeouts/1829](https://forum.poa.network/t/faq-how-do-i-fix-indexer-timeouts/1829)
# Fix indexer memory errors by adjusting memory usage
Source: https://docs.blockscout.com/setup/indexing/how-do-i-update-memory-consumption-to-fix-indexer-memory-errors
Configure INDEXER_MEMORY_LIMIT and understand how the Blockscout indexer memory monitor shrinks work queues to prevent BEAM memory errors.
During the indexing phase, many fetching processes are run asynchronously due to the load placed on trying to fetch all of the block content at once. These processes are stored in memory to be fetched at set intervals defined in each asynchronous fetcher.
`Indexer.Memory.Monitor` checks if the BEAM memory usage exceeds a set limit (defaults to 1 GiB) and if it does, it asks the process with the most memory that is registered as shrinkable to shrink.
Memory usage is checked once per minute. If the soft-limit is reached, the shrinkable work queues will shed half their load. The shed load will be restored from the database, the same as when a restart of the server occurs, so rebuilding the work queue will be slower, but use less memory.
If all queues are at their minimum size, then no more memory can be reclaimed and an error will be logged.
### Future Work
As mentioned above, future work is entered into memory to be processed later. These same processes are imported into the database to be checked on a server restart and reentered into memory to be processed.
### Updating Memory Consumption
The default Memory limit is 1 GiB and can be edited by setting `INDEXER_MEMORY_LIMIT` environment variable. See [Memory Usage](/setup/configuration-options/memory-usage) for more info.
### Left Bitshift Conversion Table
To perform a left bitshift conversion yourself open the interactive shell.
1\. `iex`
2\. `import Bitwise`
3\. `1 <<< 30` //1073741824
| | | | |
| - | - | - | - |
| `INDEXER_MEMORY_LIMIT` environment variable value | Left Bitshift | Bytes | GiB |
| `1` or `1gb` or `1g` regardless of the case of the letters | `1 <<< 30` | 1073741824 | 1 |
| `5` or `5gb` or `5g` | `5 <<< 30` | 5368709120 | 5.3 |
| `10` or `10gb` or `10g` | `10 <<< 30` | 10737418240 | 10.7 |
| `15` or `15gb` or `15g` | `15 <<< 30` | 16106127360 | 16.1 |
| `20` or `20gb` or `20g` | `20 <<< 30` | 21474836480 | 21.4 |
| `25` or `25gb` or `25g` | `25 <<< 30` | 26843545600 | 26.8 |
| `30` or `30gb` or `30g` | `30 <<< 30` | 32212254720 | 32.2 |
| `35` or `35gb` or `35g` | `35 <<< 30` | 37580963840 | 37.6 |
| `40` or `40gb` or `40g` | `40 <<< 30` | 42949672960 | 43 |
| `45` or `45gb` or `45g` | `45 <<< 30` | 48318382080 | 48.3 |
| `50` or `50gb` or `50g` | `50 <<< 30` | 53687091200 | 53.7 |
| `100mb` or `100m` regardless of the case of the letters | `100 <<< 20` | 104857600 | 0.105 |
| `500mb` or `500m` | `500 <<< 20` | 524288000 | 0.52 |
| `1500mb` or `1500m` | `1500 <<< 20` | 1572864000 | 1.57 |
| `9536mb` or `9536m` | `9536 <<< 20` | 9999220736 | \~10 |
| `28610mb` or `28610m` | `28610 <<< 20` | 29999759360 | \~30 |
# Blockscout architecture overview
Source: https://docs.blockscout.com/setup/information-and-settings
Explore Blockscout architecture and organization including indexer, web app, API modes, umbrella project layout, ShareLock, and EVM versions.
π [Autoscout is now available](/using-blockscout/autoscout), providing a simple one-click explorer deployment with Blockscout's optimized hosting infrastructure. Use it for early testing, modifications, and launching a full production-grade explorer. [**Get Started Now**](/using-blockscout/autoscout) **and have your explorer up-and-running in minutes.**
The following pages detail Blockscout architecture and organization:
* [Indexer, Web App, API](/setup/information-and-settings/separate-indexer-web-app-and-api)
* [Umbrella Project Organization](/setup/information-and-settings/umbrella-project)
* [Indexer Architecture Overview](/setup/information-and-settings/indexer-architecture-overview)
* [ShareLock](/setup/information-and-settings/sharelock)
* [EVM Version Information](/setup/information-and-settings/evm-version-information)
# EVM Version Information
Source: https://docs.blockscout.com/setup/information-and-settings/evm-version-information
Reference table of EVM hard forks (Prague, Cancun, Shanghai, London, Berlin, and more) with mainnet blocks, opcode changes, and EIPs.
You are asked to provide the EVM version the contract uses during the verification process. If the bytecode does not match the version, we try to verify using the latest EVM version.
For more information, see the [Solidity docs on specifying the EVM version when compiling a contract](https://docs.soliditylang.org/en/v0.8.25/using-the-compiler.html#target-options). Note that backward compatibility is not guaranteed between each version.
| | | | | |
| - | - | - | - | - |
| Name | Date | Mainnet Block # | Relevant changes / opcode specs | EIP details |
| Prague (Pectra) | 07 May 2025 | Block [22,431,084](https://eth.blockscout.com/block/22431084)
Epoch [364032](https://beaconcha.in/epoch/364032) | EIP-7702 enables externally owned accounts (EOAs) to temporarily execute smart contract code, allowing transaction batching, gas sponsorship, and alternative authentication methods. EIP-7251 raises maximum validator balance from 32 ETH to 2048 ETH for reward compounding. EIP-7691 doubles blob throughput (target: 3β6, max: 6β9 blobs per block) to enhance Layer 2 scaling. EIP-2537 adds BLS12-381 curve operations for efficient cryptographic verification. EIP-7002 enables execution layer triggerable validator exits. EIP-6110 reduces validator deposit processing delay from \~9 hours to \~13 minutes. | β’ [EIP-2537](https://eips.ethereum.org/EIPS/eip-2537)
β’ [EIP-7840](https://eips.ethereum.org/EIPS/eip-7840) |
| Cancun | 13 Mar 2024 | [19,426,587](https://eth.blockscout.com/block/19426587) | The block's blob base fee ([EIP-7516](https://eips.ethereum.org/EIPS/eip-7516) and [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844)) can be accessed via the global `block.blobbasefee` or `blobbasefee()` in inline assembly. Introduces `blobhash()` in inline assembly and a corresponding global function to retrieve versioned hashes of blobs associated with the transaction (see [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844)). Opcode `mcopy` is available in assembly (see [EIP-5656](https://eips.ethereum.org/EIPS/eip-5656)). Opcodes `tstore` and `tload` are available in assembly (see [EIP-1153](https://eips.ethereum.org/EIPS/eip-1153)). | β’ [EIP-1153](https://eips.ethereum.org/EIPS/eip-1153)
β’ [EIP-7516](https://eips.ethereum.org/EIPS/eip-7516) |
| Shanghai | 12 Apr 2023 | [17,034,870](https://eth.blockscout.com/block/17034870) | Smaller code size and gas savings due to the introduction of `push0` (see [EIP-3855](https://eips.ethereum.org/EIPS/eip-3855)). | β’ [EIP-3651](https://eips.ethereum.org/EIPS/eip-3651)
β’ [EIP-6049](https://eips.ethereum.org/EIPS/eip-6049) |
| Paris (The Merge) | 15 Sep 2022 | [15,537,394](https://eth.blockscout.com/block/15537394) | Introduces `prevrandao()` and `block.prevrandao`, and changes the semantics of the now deprecated `block.difficulty`, disallowing `difficulty()` in inline assembly (see [EIP-4399](https://eips.ethereum.org/EIPS/eip-4399)). | β’ [EIP-3675](https://eips.ethereum.org/EIPS/eip-3675)
β’ [EIP-4399](https://eips.ethereum.org/EIPS/eip-4399) |
| *Gray Glacier\** | 30 June 2022 | [15,050,000](https://eth.blockscout.com/block/15050000) | Delays the difficulty bomb by an additional 3 months to September 2022. | [https://eips.ethereum.org/EIPS/eip-5133](https://eips.ethereum.org/EIPS/eip-5133) |
| *Arrow Glacier\** | 09 Aug 2021 | [13,773,000](https://eth.blockscout.com/block/13773000) | Delays the difficulty bomb until June 2022. | [https://eips.ethereum.org/EIPS/eip-4345](https://eips.ethereum.org/EIPS/eip-4345) |
| London | 05 Aug 2021 | [12,965,000](https://eth.blockscout.com/block/12965000) | The block's base fee ([EIP-3198](https://eips.ethereum.org/EIPS/eip-3198) and [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559)) can be accessed via the global `block.basefee` or `basefee()` in inline assembly. | β’ [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559)
β’ [EIP-3554](https://eips.ethereum.org/EIPS/eip-3554) |
| Berlin | 14 Apr 2021 | [12,244,000](https://eth.blockscout.com/block/12244000) | Gas costs for `SLOAD`, `*CALL`, `BALANCE`, `EXT*` and `SELFDESTRUCT` increased. The compiler assumes cold gas costs for such operations. This is relevant for gas estimation and the optimizer. | [https://eips.ethereum.org/EIPS/eip-2070](https://eips.ethereum.org/EIPS/eip-2070) |
| Istanbul | 08 Dec 2019 | [9,069,000](https://eth.blockscout.com/block/9069000) | Opcodes `chainid` and `selfbalance` are available in assembly. | [https://eips.ethereum.org/EIPS/eip-1679](https://eips.ethereum.org/EIPS/eip-1679) |
| Constantinople / Petersburg | 28 Feb 2019 | [7,280,000](https://eth.blockscout.com/block/7280000) | Opcodes `create2`, `extcodehash`, `shl`, `shr` and `sar` are available in assembly. Bitwise shifting operators use shifting opcodes (`shl`,`shr`,`sar`), requiring less gas. | [http://eips.ethereum.org/EIPS/eip-1013](http://eips.ethereum.org/EIPS/eip-1013) |
| Byzantium | 16 Oct 2017 | [4,370,000](https://eth.blockscout.com/block/4370000) | Opcodes `returndatacopy`, `returndatasize` and `staticcall` available in assembly. `staticcall` opcode used when calling non-library view or pure functions, which prevents the functions from modifying state at the EVM level, this even applies to invalid type conversions. Ability to access dynamic data returned from function calls. `revert` opcode introduced, `revert()` will not waste gas. | [http://eips.ethereum.org/EIPS/eip-609](http://eips.ethereum.org/EIPS/eip-609) |
| Spurious Dragon | 22 Nov 2016 | [2,675,000](https://eth.blockscout.com/block/2675000) | Gas cost for the `exp` opcode increased, impacts gas estimation and optimization. | [http://eips.ethereum.org/EIPS/eip-607](http://eips.ethereum.org/EIPS/eip-607) |
| Tangerine Whistle | 18 Oct 2016 | [2,463,000](https://eth.blockscout.com/block/2463000) | Gas cost to access other accounts increased, impacts gas estimation and optimization. All gas sent by default for external calls, previously a certain amount had to be retained. | [http://eips.ethereum.org/EIPS/eip-608](http://eips.ethereum.org/EIPS/eip-608) |
| Homestead | 14 Mar 2016 | [1,150,000](https://eth.blockscout.com/block/1150000) | Oldest version | [http://eips.ethereum.org/EIPS/eip-606](http://eips.ethereum.org/EIPS/eip-606) |
# Indexer Architecture Overview
Source: https://docs.blockscout.com/setup/information-and-settings/indexer-architecture-overview
Overview of Blockscout indexer architecture: realtime and catchup indexers, secondary and on-demand fetchers, and chain-specific integrations.
## Presentation Highlights
The following presentation describes the past, present and future iterations of Blockscout along with details about how block imports work both synchronously and asynchronously, and a description of the regular and on-demand fetchers.
1MB pdf
## Blockscout indexers
See the pdf β¬οΈ for more details about the Blockscout indexer. The indexing architecture includes all of the following indexers and fetchers
### Primary Indexers
Both indexers utilize synchronous and asynchronous operations.
* Realtime: Imports new block data from the head of the chain.
* Catchup: Imports data down the chain (starting from the head and moving backwards towards the genesis block).
### Secondary fetchers
### Regular
* Internal transactions
* Pending transactions
* Dropped/Replaced transactions
* Contract bytecodes
* Block rewards
* Token catalog
* Token/coin balances
* NFT instances
* Uncles
### On Demand
* Coin/token balances update
* Contract bytecodes fetch/re-check
* Contract source codes lookup
* NFT instance metadata re-fetch
* Token total supply
### Off-chain integrations
* Coin / token price, market cap, tvl sources: CMC, Coingecko, Cryptorank, Defillama
* Smart contract verification: ETH bytecode DB, Sourcify
* Data enrichment: ENS names, public tags, AI interpreters (own, Noves Fi), sc security scanners (Solidityscan), assets portfolio (Zerion)
* Chain initialization data import: pre-mined coins, precompiled smart-contracts
### Chain-specific fetchers
* There are more than a dozen chain-specific data fetchers to account for chain differences including arbitrum, optimism, polygon zkevm, zksync etc.
### Temporary fetchers
* Used once to resolve possible data inconsistencies.
# Separate Indexer, Web App, And API
Source: https://docs.blockscout.com/setup/information-and-settings/separate-indexer-web-app-and-api
Run Blockscout components independently using DISABLE_INDEXER, DISABLE_WEBAPP, and API method env variables to scale services separately.
Blockscout supports several modes which run in a single all-in-one application by default.
**Modes**
* [Indexer](/setup/information-and-settings/separate-indexer-web-app-and-api#indexer-mode)
* [Web UI](/setup/information-and-settings/separate-indexer-web-app-and-api#web-application-mode)
* [API](/setup/information-and-settings/separate-indexer-web-app-and-api#api-mode)
* All-in-one (default)
It is possible to run modes separately or in different combinations. For example, you may want to run the `indexer mode + API` to create an indexed db with programmatic access and no UI, or `indexer mode + UI` to leverage Blockscout as a read-only explorer.
Note that the application is limited to 1 running indexer per 1 Blockscout instance. However, the indexer automatically reruns child processes within the Elixir architecture, making it quite fault-tolerant.
To run these modes separately, adjust ENV variables as follows:
After extending the set of environment variables for the instance, recompile the application (or rebuild the docker image, if this is a Docker version) to enable mode settings.
## Indexer mode
To run Blockscout in indexer mode, disable the web application and API:
```javascript theme={null}
export DISABLE_WEBAPP=true
export API_V1_READ_METHODS_DISABLED=true
export API_V1_WRITE_METHODS_DISABLED=true
```
## Web application mode
To run Blockscout in web application mode only, disable the indexer and API read methods (API write functionality is not disabled to support smart contracts verification in the UI).
```javascript theme={null}
export DISABLE_INDEXER=true
export API_V1_READ_METHODS_DISABLED=true
```
If you have a separate web application and indexer and they are connected to the same database (via DATABASE\_URL), you will see new incoming items on the web UI like in the all-in-one mode. This configuration allows you to scale the web UI separately from indexer.
## API mode
To run in API mode, disable the indexer and webapp.
```javascript theme={null}
export DISABLE_INDEXER=true
export DISABLE_WEBAPP=true
```
In API mode the web UI will show the API docs page at the default path (/). In the default all-in-one mode, it is located on the /api-docs page.
## Web UI + API mode
```javascript theme={null}
export DISABLE_INDEXER=true
```
# ShareLock
Source: https://docs.blockscout.com/setup/information-and-settings/sharelock
Understand PostgreSQL ShareLock behavior in Blockscout and how consistent lock acquisition ordering with Ecto prevents database deadlocks.
### Deadlocks and prevention
When several DB transactions are acting on multiple rows of the same table, it's possible to incur in a deadlock and so into an error. This can be prevented by enforcing the same consistent order of lock acquisition on *all* the transactions performing `INSERT`, `UPDATE` or `DELETE` on a given table.
On top of this, if multiple DB transactions act on multiple tables a deadlock will occur, even if they follow the order on each table described above, if they acquire locks on said tables in a different order. This can also be prevented by using a consistent order of lock acquisition *between* different tables.
### Imposing the lock acquisition order on a table with Ecto
When `INSERT`ing a list of rows Postgres will respect the order in which they appear in the query, so the reordering can happen beforehand.
For example, this will work:
```python theme={null}
entries = [...]
ordered_entries = Enum.sort_by(entries, & &1.id)
Repo.insert_all(__MODULE__, ordered_entries)
```
Performing `UPDATE`s is trickier because there is no `ORDER BY` clause. The solution to this is to `JOIN` on a subquery that `SELECT`s with the option `FOR UPDATE`.
Using Ecto this can be done, for example, like this:
```csharp theme={null}
query =
from(
entry in Entry,
where: not is_nil(entry.value),
order_by: entry.id,
lock: "FOR UPDATE"
)
Repo.update_all(
from(e in Entry, join: s in subquery(query), on: e.id == s.id),
[set: [value: nil]],
timeout: timeout)
```
`DELETE` has the same quirks as `UPDATE` and it too is solved in the same way.
For example:
```csharp theme={null}
query =
from(
entry in Entry,
where: is_nil(entry.value),
order_by: entry.id,
lock: "FOR UPDATE"
)
Repo.delete_all(from(e in Entry, join: s in subquery(query), on: e.id == s.id))
```
### Imposing the lock acquisition order between tables with Ecto
When using an `Ecto.Multi` to perform `INSERT`, `UPDATE` or `DELETE` on multiple tables the order to keep is between different operations. For example, supposing `EntryA` was established to be modified before `EntryB`, this is not correct:
```ruby theme={null}
Multi.new()
|> Multi.run(:update_b, fn repo, _ ->
# operations with ordered locks on `EntryB`
end)
|> Multi.run(:update_a, fn repo, _ ->
# operations with ordered locks on `EntryA`
end)
|> Repo.transaction()
```
When possible, the simple solution is to move `:update_a` to be before `:update_b`. When not possible, for instance if `:update_a` depends on the result of `:update_b`, this can be solved by acquiring the locks in a separate operation.
For example:
```python theme={null}
Multi.new()
|> Multi.run(:acquire_a, fn repo, _ ->
# acquire locks in order on `EntryA`
end)
|> Multi.run(:update_b, fn repo, _ ->
# operations with ordered locks on `EntryB`
end)
|> Multi.run(:update_a, fn repo, %{acquire_a: values} ->
# operations (no need to enforce order again) on `EntryA`
end)
|> Repo.transaction()
```
Note also that for the same reasons multiple operations on the same table in the same transaction are not safe to perform if they each acquire locks in order, because locks are not released until the transaction is committed.
### Order used for Explorer's tables
This is a complete list of the ordering currently in use on each table. It also specifies the order between tables in the same transaction: locks for a table on top need to be acquired before those from a table on the bottom.
Note that this should always be enforced because as long as there is one DB transaction performing in a different order there is the possibility of a deadlock.
| schema module | table name | ordered by |
| - | - | - |
| Explorer.Chain.Address | addresses | \[asc: :hash] |
| Explorer.Chain.Address.Name | address\_names | \[asc: :address\_hash, asc: :name] |
| Explorer.Chain.Address.CoinBalance | address\_coin\_balances | \[asc: :address\_hash, asc: :block\_number] |
| Explorer.Chain.Block | blocks | \[asc: :hash] |
| Explorer.Chain.Block.SecondDegreeRelation | block\_second\_degree\_relations | \[asc: :nephew\_hash, asc: :uncle\_hash] |
| Explorer.Chain.Block.Reward | block\_rewards | \[asc: :address\_hash, asc: :address\_type, asc: :block\_hash] |
| Explorer.Chain.Block.EmissionReward | emission\_rewards | \[asc: :block\_range] |
| Explorer.Chain.Transaction | transactions | \[asc: :hash] |
| Explorer.Chain.Transaction.Fork | transaction\_forks | \[asc: :uncle\_hash, asc: :index] |
| Explorer.Chain.Log | logs | \[asc: :transaction\_hash, asc: :index] |
| Explorer.Chain.InternalTransaction | internal\_transactions | \[asc: :transaction\_hash, asc: :index] |
| Explorer.Chain.Token | tokens | \[asc: :contract\_address\_hash] |
| Explorer.Chain.TokenTransfer | token\_transfers | \[asc: :transaction\_hash, asc: :log\_index] |
| Explorer.Chain.TransactionAction | transaction\_actions | \[asc: :hash, asc: :log\_index] |
| Explorer.Chain.Optimism.OutputRoot | op\_output\_roots | \[asc: :l2\_output\_index] |
| Explorer.Chain.Optimism.TxnBatch | op\_transaction\_batches | \[asc: :l2\_block\_number] |
| Explorer.Chain.Optimism.Deposit | op\_deposits | \[asc: :l2\_transaction\_hash] |
| Explorer.Chain.Optimism.DisputeGame | op\_dispute\_games | \[asc: :index] |
| Explorer.Chain.Optimism.FrameSequence | op\_frame\_sequences | \[asc: :id] |
| Explorer.Chain.Optimism.FrameSequenceBlob | op\_frame\_sequence\_blobs | \[asc: :id] |
| Explorer.Chain.Optimism.WithdrawalEvent | op\_withdrawal\_events | \[asc: :withdrawal\_hash, asc: :l1\_event\_type] |
| Explorer.Chain.Optimism.Withdrawal | op\_withdrawals | \[asc: :msg\_nonce] |
| Explorer.Chain.Optimism.EIP1559ConfigUpdate | op\_eip1559\_config\_updates | \[asc: :l2\_block\_number] |
| Explorer.Chain.Optimism.InteropMessage | op\_interop\_messages | \[asc: :nonce, asc: :init\_chain\_id] |
| Explorer.Chain.Address.TokenBalance | address\_token\_balances | \[asc: :address\_hash, asc: :token\_contract\_address\_hash, asc: :block\_number] |
| Explorer.Chain.Address.CurrentTokenBalance | address\_current\_token\_balances | \[asc: :token\_contract\_address\_hash, asc: :token\_id, asc: :address\_hash] |
| Explorer.Chain.Scroll.Batch | scroll\_batches | \[asc: number] |
| Explorer.Chain.Scroll.BatchBundle | scroll\_batch\_bundles | \[asc: final\_batch\_number] |
| Explorer.Chain.Scroll.Bridge | scroll\_bridge | \[asc: :type, asc: message\_hash] |
| Explorer.Chain.Scroll.L1FeeParam | scroll\_l1\_fee\_params | \[asc: :block\_number, asc: tx\_index, asc: name] |
| Explorer.Chain.Shibarium.Bridge | shibarium\_bridge | \[asc: :operation\_hash, asc: l1\_transaction\_hash, asc: l2\_transaction\_hash] |
| Explorer.Chain.StakingPool | staking\_pools | \[asc: :staking\_address\_hash] |
| Explorer.Chain.StakingPoolsDelegator | staking\_pools\_delegators | \[asc: :delegator\_address\_hash, asc: :pool\_address\_hash] |
| Explorer.Chain.ContractMethod | contract\_methods | \[asc: :identified, asc: :abi] |
| Explorer.Market.MarketHistory | market\_history | \[asc: :date] |
| Explorer.Chain.Withdrawal | withdrawals | \[asc: :index] |
| Explorer.Chain.Zkevm.TransactionBatch | zkevm\_transaction\_batches | \[asc: :number] |
| Explorer.Chain.Zkevm.BatchTransaction | zkevm\_batch\_l2\_transactions | \[asc: :hash] |
| Explorer.Chain.Zkevm.LifecycleTransaction | zkevm\_lifecycle\_l1\_transactions | \[asc: :id] |
| Explorer.Chain.Zkevm.Bridge | zkevm\_bridge | \[asc: :type, asc: :index] |
| Explorer.Chain.Zkevm.BridgeL1Token | zkevm\_bridge\_l1\_tokens | \[asc: :address] |
| Explorer.Chain.ZkSync.TransactionBatch | zksync\_transaction\_batches | \[asc: :number] |
| Explorer.Chain.ZkSync.BatchBlock | zksync\_batch\_blocks | \[asc: :hash] |
| Explorer.Chain.ZkSync.BatchTransaction | zksync\_batch\_transactions | \[asc: :hash] |
| Explorer.Chain.ZkSync.LifecycleTransaction | zksync\_lifecycle\_transactions | \[asc: :id] |
| Explorer.Chain.Celo.PendingAccountOperation | celo\_pending\_account\_operations | \[asc: :address\_hash] |
| Explorer.Chain.Celo.Account | celo\_accounts | \[asc: :address\_hash] |
| Explorer.Chain.Celo.ValidatorGroupVote | celo\_validator\_group\_votes | \[asc: :transaction\_hash, asc: :account\_address\_hash, asc: :group\_address\_hash] |
| Explorer.Chain.Celo.Epoch | celo\_epochs | \[asc: :number] |
| Explorer.Chain.Celo.EpochReward | celo\_epoch\_rewards | \[asc: :epoch\_number] |
| Explorer.Chain.Celo.ElectionReward | celo\_election\_rewards | \[asc: :epoch\_number, asc: type, asc: :account\_address\_hash, asc: :associated\_account\_address\_hash] |
| Explorer.Chain.Zilliqa.QuorumCertificate | zilliqa\_quorum\_certificates | \[asc: :block\_hash] |
| Explorer.Chain.Zilliqa.AggregateQuorumCertificate | zilliqa\_aggregate\_quorum\_certificates | \[asc: :block\_hash] |
| Explorer.Chain.Zilliqa.NestedQuorumCertificate | zilliqa\_nested\_quorum\_certificates | \[asc: :block\_hash, asc: proposed\_by\_validator\_index] |
| Explorer.Chain.Zilliqa.Zrc2.TokenAdapter | zilliqa\_zrc2\_token\_adapters | \[asc: :adapter\_address\_hash] |
| Explorer.Chain.Zilliqa.Zrc2.TokenTransfer | zilliqa\_zrc2\_token\_transfers | \[asc: :transaction\_hash, asc: :block\_hash, asc: :log\_index] |
| Explorer.Chain.Filecoin.PendingAddressOperation | filecoin\_pending\_address\_operations | \[asc: :address\_hash] |
# Umbrella Project Organization
Source: https://docs.blockscout.com/setup/information-and-settings/umbrella-project
How the Blockscout Elixir umbrella project is organized into ethereum_jsonrpc, explorer, block_scout_web, and indexer OTP applications.
BlockScout is an Elixir [umbrella project](https://elixir-lang.org/getting-started/mix-otp/dependencies-and-umbrella-projects.html). Each directory under `apps/` is a separate [Mix](https://hexdocs.pm/mix/Mix.html) project and [OTP application](https://hexdocs.pm/elixir/Application.html), but the projects can use each other as a dependency in their `mix.exs`.
Each OTP application has a restricted domain.
Table is horizontally scrollable.
| | | | |
| - | - | - | - |
| Directory | OTP Application | Namespace | Purpose |
| `apps/ethereum_jsonrpc` | `:ethereum_jsonrpc` | `EthereumJSONRPC` | Ethereum JSONRPC client. It is allowed to know `Explorer`'s param format, but it cannot directly depend on `:explorer` |
| `apps/explorer` | `:explorer` | `Explorer` | Storage for the indexed chain. Can read and write to the backing storage. MUST be able to boot in a read-only mode when run independently from `:indexer`, so cannot depend on `:indexer` as that would start `:indexer` indexing. |
| `apps/block_scout_web` | `:block_scout_web` | `BlockScoutWeb` | Phoenix interface to `:explorer`. The minimum interface to allow web access should go in `:block_scout_web`. Any business rules or interface not tied directly to `Phoenix` or `Plug` should go in `:explorer`. MUST be able to boot in a read-only mode when run independently from `:indexer`, so cannot depend on `:indexer` as that would start `:indexer` indexing. |
| `apps/indexer` | `:indexer` | `Indexer` | Uses `:ethereum_jsonrpc` to index chain and batch import data into `:explorer`. Any process, `Task`, or `GenServer` that automatically reads from the chain and writes to `:explorer` should be in `:indexer`. This restricts automatic writes to `:indexer` and read-only mode can be achieved by not running `:indexer`. |
# Microservices
Source: https://docs.blockscout.com/setup/microservices
Overview of Blockscout Rust microservices including BENS, eth-bytecode-db, sig-provider, smart contract verifier, stats, and visualizer.
π [Autoscout is now available](/using-blockscout/autoscout), providing a simple one-click explorer deployment with Blockscout's optimized hosting infrastructure. Use it for early testing, modifications, and launching a full production-grade explorer. [**Get Started Now**](/using-blockscout/autoscout) **and have your explorer up-and-running in minutes.**
Blockscout microservices are individual components written in Rust designed to provide full functionality to the explorer. This architecture allows for better scalability, easier maintenance, and more flexible deployment options.
Information about Blockscout microservices and how to run them is available here:
Services Include:
1. [blockscout-ens](https://github.com/blockscout/blockscout-rs/blob/main/blockscout-ens) - indexed data of domain name service for blockscout instances.
2. [da-indexer](https://github.com/blockscout/blockscout-rs/blob/main/da-indexer) - collects blobs from different DA solutions (e.g., Celestia)
3. [eth-bytecode-db](https://github.com/blockscout/blockscout-rs/blob/main/eth-bytecode-db) - Ethereum Bytecode Database. Cross-chain smart-contracts database used for automatic contracts verification
4. [proxy-verifier](https://github.com/blockscout/blockscout-rs/blob/main/proxy-verifier) - backend for the standalone multi-chain verification service
5. [sig-provider](https://github.com/blockscout/blockscout-rs/blob/main/sig-provider) - aggregator of ethereum signatures for transactions and events
6. [smart-contract-verifier](https://github.com/blockscout/blockscout-rs/blob/main/smart-contract-verifier) - smart-contracts verification
7. [stats](https://github.com/blockscout/blockscout-rs/blob/main/stats) - service designed to calculate and present statistical information from a Blockscout instance
8. [user-ops-indexer](https://github.com/blockscout/blockscout-rs/blob/main/user-ops-indexer) - service designed to index, decode and serve user operations as per the ERC-4337 standard
9. [visualizer](https://github.com/blockscout/blockscout-rs/blob/main/visualizer) - service for evm visualization such as:
a. Solidity contract visualization using [sol2uml](https://www.npmjs.com/package/sol2uml)
# Blockscout ENS (BENS) Name Service Integration
Source: https://docs.blockscout.com/setup/microservices/blockscout-ens-bens-name-service-integration
Integrate the Blockscout ENS (BENS) microservice to add ENS-style name service lookups, subgraphs, and search to your explorer instance.
Blockscout now supports Name Services for various chains including ENS for Ethereum. Search by name in the search bar or use the dedicated Name Services lookup page accessible from the Blockchain menu.
On the Name Services page search by name or address and view registration and expiration date for all names.
## Adding Name Service Support
Protocols can add Name Service support for Blockscout instances on various chains. The BENS microservice was first introduced in [Blockscout v5.4](https://github.com/blockscout/blockscout/releases/tag/v5.4.0-beta), and several bugs were fixed in [**Blockscout v6.0**](https://github.com/blockscout/blockscout/releases/tag/v6.0.0-beta)**, which is the recommended minimum version for integration.**
You'll complete the following steps to add Name Service Support to Blockscout:
1. [Use this guide to create a subgraph](https://github.com/blockscout/blockscout-rs/blob/main/blockscout-ens/graph-node/subgraph-writer/README.md#howto-create-subgraph-for-your-domain-name-protocol). Our template uses the ENS subgraph structure, so the closer your project is to the ENS the easier the integration.
a. Subgraph should support [this graphql schema](https://github.com/blockscout/blockscout-rs/blob/main/blockscout-ens/graph-node/subgraphs/ens-subgraph/schema.graphql)
2. [Submit your subgraph](https://github.com/blockscout/blockscout-rs/blob/main/blockscout-ens/graph-node/subgraphs/README.md#deploy-subgraph-to-graph-node) to graph-node.
3. Submit a PR to the [blockscout-rs](https://github.com/blockscout/blockscout-rs/pulls) repository (hosted version) or integrate with your Blockscout fork.
a. [Example PR for BNS](https://github.com/blockscout/blockscout-rs/pull/748) (Base Name Service)
4. Enable BENS service on the instance using the [`MICROSERVICE_BENS_ENABLED`](/setup/env-variables#blockscout-ens) & [`MICROSERVICE_BENS_URL`](/setup/env-variables#blockscout-ens) env variables.
### FAQs
This may be the result of missing information/functions in the subgraph. When a subgraph sees that a domain name has been registered, it only has the `label_hash` of this name. Therefore, the subgraph has to guess the name using a rainbow table (make sure to load ens-rainbow table) OR find this name later in other events, such as `handleNameChanged` or any other event that has a name field.
Try to determine events with a name field, write code that will update domain name using `maybeSaveDomainName()` or other functions you prefer. For example, the ens-subgraph uses the `setNamePreimage` function, which performs the same function for second-level-eth domains only.
**Reverse Records**
It may also be the case that unknown names are reverse records. These are not resolved by design, and users don't typically need to see them.
The easiest way is to use docker.
`docker run --platform linux/x86_64 -p 8050:8050 --rm --name bens --env-file .env `[`ghcr.io/blockscout/bens:latest`](http://ghcr.io/blockscout/bens:latest)
To build locally without docker you should install `protoc` and `protoc-gen-openapiv2`. A complete guide for a local build is not yet available.
The primary name is the first name created which has not yet expired.
# Smart contract verification microservice
Source: https://docs.blockscout.com/setup/microservices/smart-contract-verification
Deep dive into the Blockscout Rust smart contract verifier microservice supporting Solidity, Vyper, and Sourcify verification over HTTP.
A microservice written in Rust provides fast and efficient contract verification. The application runs as an HTTP server and verification requests are made using a REST API.
* [Basic Info](/setup/microservices/smart-contract-verification#basic-info)
* [Library Initialization](/setup/microservices/smart-contract-verification#library-initialization)
* [Solidity and Vyper Verification](/setup/microservices/smart-contract-verification#solidity-and-vyper-verification)
* [Sourcify Verification](/setup/microservices/smart-contract-verification#sourcify-verification)
* [Verification Algorithm](/setup/microservices/smart-contract-verification#verification-algorithm)
* [Http API](/setup/microservices/smart-contract-verification#verification-http-api)
## Basic Info
### **Location**
* Application: [https://github.com/blockscout/blockscout-rs/tree/main/smart-contract-verifier](https://github.com/blockscout/blockscout-rs/tree/main/smart-contract-verifier)
* Http API: [https://github.com/blockscout/blockscout-rs/blob/main/smart-contract-verifier/smart-contract-verifier-http](https://github.com/blockscout/blockscout-rs/blob/main/smart-contract-verifier/smart-contract-verifier-http/README.md)
* Latest release information and changelogs: [https://github.com/blockscout/blockscout-rs/releases](https://github.com/blockscout/blockscout-rs/releases)
### **Activation**
* Update Blockscout to the 4.1.8+ release
* Add the following ENV variables:
* `MICROSERVICE_SC_VERIFIER_ENABLED=true`
* `MICROSERVICE_SC_VERIFIER_URL=...` (verifier endpoint, see [http configuration](https://github.com/blockscout/blockscout-rs/tree/main/smart-contract-verifier/smart-contract-verifier-http) for more details)
* If running locally, the smart-contract-verifier is integrated with [`docker-compose`](https://github.com/blockscout/blockscout/tree/master/docker-compose)
* Registry of docker images is available via the docker-compose file. For registry information see: [https://github.com/blockscout/blockscout-rs/pkgs/container/smart-contract-verifier](https://github.com/blockscout/blockscout-rs/pkgs/container/smart-contract-verifier)
### Architecture
The service consists of 2 parts, a verification library and a transport layer that serves requests.
* **Verification Library**: Provides verification and a communication interface for verification functions. Includes modules for Solidity, Sourcify, and Vyper.
* **Transport Layer**: Verification requests are sent via HTTP.
### Benefits
We've seen a 10X improvement in verification speed over the previous implementation. Benefits of the new microservice include:
* **Scalability**: Remove CPU intensive tasks from the primary Blockscout instance. Modularity provides the ability to scale quickly.
* **Speed**: Using native compilers greatly increases compilation speed relative to the JS wrapped versions running on Node.js used previously.
* **Improved efficiency**. New algorithm supports contracts that contain several metadata hashes, improving efficiency.
## Library Initialization
On startup, the library must retrieve all available compilers. Compiler information consists of a link to download the compiler and its hashsum \[[example](https://github.com/blockscout/solc-bin/blob/main/list.json)]. A separate thread also starts during initialization to update this list periodically.
Library processes differ based on verification for Solidity/Vyper contracts or verification via Sourcify. Both are detailed below.
## Solidity and Vyper Verification
Verification processes are similar for contracts written in Solidity and Vyper.
For Solidity contracts, verification is available for multiple files or standard json input. Single file verification is also possible - users still verify via the multiple file method and only upload a single file.
For Vyper contracts, only multiple file verification is available.
### Request Values
Each request contains the following values:
* **Deployed bytecode**: bytecode of the contract stored on chain
* **Creation transaction (tx) input**: input data provided in transaction to create the contract
* **Compiler version**: Version of compiler used to compile the contract
* **Content**: Verification method related fields. E.g. for Solidity multiple files those fields are:
* **Sources**: mapping from source files to their contents
* **Evm version**: version of the EVM used to compile sources
* **Optimization runs**: optional parameter that enables optimizations and specifies number of optimization runs
* **Contract libraries**: optional parameter that specifies addresses of the contract libraries used in compiled contracts
### Verification Steps
1. **Download the compiler** using the specified compiler version from the url retrieved on [initialization](/setup/microservices/smart-contract-verification#initialization) (or update).
2. **Compilation**: compile using the provided and slightly modified (see [Verification Algorithm](/setup/microservices/smart-contract-verification#verification-algorithm) section) sources.
3. **Verification**: compare compiler output from step 2 with bytecodes (deployed bytecode and creation tx input) provided by the caller. During verification all contracts obtained through local compilation are checked one by one, and if any corresponds to provided bytecodes, the verification is considered successful. Contract paths and names are already indexed from available contracts, and constructor arguments are extracted.
4. **Return Values**: See below.
### Returned Values
As a result of successful verification the following struct is returned:
* **Compiler input**: Data used as an input for the compiler
* **Compiler version**: version of the compiler used in verification (corresponds to the version provided in request)
* **File path**: path of the file containing verified contract
* **Contract name**: name of the verified contract
* **Abi**: application binary interface of the verified contract ([https://docs.soliditylang.org/en/v0.8.13/abi-spec.html?highlight=abi](https://docs.soliditylang.org/en/v0.8.13/abi-spec.html?highlight=abi))
* **Constructor arguments**: optionally returned constructor arguments used during on chain creation of the contract.
In case of an error, an enum is returned with the corresponding error and its description (e.g. if compilation failed, a Compilation error is returned with the error data obtained from the compiler).
## Sourcify Verification
The request is sent via proxy to the [Sourcify](https://sourcify.dev/) service. It accepts the following arguments:
1. Address of the contract to be verified.
2. Chain id where the contract is deployed.
3. Files required for Sourcify verification.
4. (optionally) Contract index, if the provided files contain multiple metadata files (i.e. multiple contracts).
These arguments are sent to the Sourcify Api, which returns the verification status.
### **Successful Verification**
Either the data provided was valid and the contract was verified by Sourcify, or the contract was previously verified. To obtain the actual data used for verification we send another request to retrieve source files used in verification. We expect data used for verification to be in the `metadata.json` file, so it is parsed and the information retrieved. This includes file and contract names, compiler and evm versions, info about optimizations, contract libraries, abi, and sources.
**Note**: Constructor arguments cannot currently be obtained from the metadata via Sourcify. This requires the input used for contract creation transaction and the bytecode resulting from local compilation, which are not provided.
### Failed Verification
If verification fails we return an error with description obtained from Sourcify response.
## Verification Algorithm
Verification is divided into 2 parts to effectively deal with metadata hash differences in contracts. Often, very similar contracts will have very different metadata hashes based on small changes within the contract (ie an extra space in the source code). To address this, the algorithm:
1. Extracts all metadata hash fields from *creationTxInput*.
2. Compares non-metadata sections of the onchain bytecode with the results of local compilation.
Metadata hashes are extracted by compiling the same contract twice (with a slight modification to the 2nd contract that does not change any other aspect of the resultant bytecode). The resulting *creationTxInputs* are compared and metadata hashes extracted by finding which parts of the inputs differ.
### Example
An additional space in the source code can be used for the modification process. In **Example 1** and **Example 2** the only difference between both contracts is a space in the beginning of **Example 2**. However, this still completely changes the metadata hash (metadata hash differences shown in **bold red**).
**Note**: To update the metadata hash in production we use an additional library passed into the compiler. It does not affect the resultant bytecode, but the compilation input is altered, leading to updated metadata and an updated metadata hash.
#### Example 1
```javascript theme={null}
// pragma solidity ^0.8.7; contract Main {}
```
*creationTxInput:* 6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea264697066735822**12203cc19b771ee83d8cc6995191bd9092a82f3e66b95aacaf1cfc893d3dc27abcd2**64736f6c63430008070033
#### Example 2
```javascript theme={null}
// pragma solidity ^0.8.7; contract Main {}
```
*creationTxInput:* 6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea264697066735822**1220b3902f5797f05bb62858c8d41f09402093c85957c4ae1d773e4eb1cb2000f093**64736f6c63430008070033
### Verification Process
1. Compile the original contracts using data provided by the caller then compile those contracts again while passing in the additional library. The result is two slightly different `CreationTxInputs` if there is any encoded metadata.
2. Separate the `MainPart` and the `MetadataPart`.
a. `MainPart` consists of consecutive bytes which are not related to the metadata hash (all bytes are the same for both local *creationTxInputs*). `MetadataPart` consists of consecutive bytes related to metadata hash (some bytes differ between local *creationTxInputs*).
3. Iterate through the two local contracts byte by byte to find the first byte that differs.
a. If there are no such bytes, then there is no metadata hash and the whole *creationTxInput* consists of just one `MainPart`.
b. If any differences are found, identify it as a hash section of the metadata hash.
c. Iterate back byte by byte to find the beginning of that metadata hash. When we find the beginning we know where that metadata hash starts and ends. All non-categorized bytes before the start are identified as the `MainPart` and bytes between the start and end identified as the `MetadataPart`. Continue until there are no uncategorized bytes.
d. Once the entire local *creationTxInput* is categorized, we compare those parts with the corresponding remote *creationTxInput* bytes. For the `MainPart` remote *creationTxInput* must have exact equivalence. For the `MetadataPart` we compare some parts of the metadata (e.g. that encoded solc versions are the same), but in general we do not require them to be equal.
**Example**
***LocalCreationTxInput1:*** 608060405234801561001057600080fd5b506040518060200161002190610050565b6020820181038252601f19601f820116604052506000908051906020019061004a92919061005c565b5061015f565b605c806101ac83390190565b8280546100689061012e565b90600052602060002090601f01602090048101928261008a57600085556100d1565b82601f106100a357805160ff19168380011785556100d1565b828001600101855582156100d1579182015b828111156100d05782518255916020019190600101906100b5565b5b5090506100de91906100e2565b5090565b5b808211156100fb5760008160009055506001016100e3565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061014657607f821691505b602082108103610159576101586100ff565b5b50919050565b603f8061016d6000396000f3fe6080604052600080fdfea2646970667358221220187a584947e37ebca43172929f7e159fe28696b0edd97bbfad5b0a265f6f886964736f6c634300080e00336080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220805aa9fe4ec055702024afa5ac21c2104f0b14be0ffab086f0d6e9b5701073f864736f6c634300080e0033
**Parts 1:** \`\`\[ MainPart(608060405234801561001057600080fd5b506040518060200161002190610050565b6020820181038252601f19601f820116604052506000908051906020019061004a92919061005c565b5061015f565b605c806101ac83390190565b8280546100689061012e565b90600052602060002090601f01602090048101928261008a57600085556100d1565b82601f106100a357805160ff19168380011785556100d1565b828001600101855582156100d1579182015b828111156100d05782518255916020019190600101906100b5565b5b5090506100de91906100e2565b5090565b5b808211156100fb5760008160009055506001016100e3565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061014657607f821691505b602082108103610159576101586100ff565b5b50919050565b603f8061016d6000396000f3fe6080604052600080fdfe), MetadataPart(a264697066735822**1220187a584947e37ebca43172929f7e159fe28696b0edd97bbfad5b0a265f6f8869**64736f6c634300080e0033), MainPart(6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfe), MetadataPart(a264697066735822**1220805aa9fe4ec055702024afa5ac21c2104f0b14be0ffab086f0d6e9b5701073f8**64736f6c634300080e0033) ]
***LocalCreationTxInput2:*** 608060405234801561001057600080fd5b506040518060200161002190610050565b6020820181038252601f19601f820116604052506000908051906020019061004a92919061005c565b5061015f565b605c806101ac83390190565b8280546100689061012e565b90600052602060002090601f01602090048101928261008a57600085556100d1565b82601f106100a357805160ff19168380011785556100d1565b828001600101855582156100d1579182015b828111156100d05782518255916020019190600101906100b5565b5b5090506100de91906100e2565b5090565b5b808211156100fb5760008160009055506001016100e3565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061014657607f821691505b602082108103610159576101586100ff565b5b50919050565b603f8061016d6000396000f3fe6080604052600080fdfea26469706673582212202e82fb6222f966f0e56dc49cd1fb8a6b5eac9bdf74f62b8a5e9d8812901095d664736f6c634300080e00336080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220bd9f7fd5fb164e10dd86ccc9880d27a177e74ba873e6a9b97b6c4d7062b26ff064736f6c634300080e0033
**Parts 2:**
\[ MainPart(608060405234801561001057600080fd5b506040518060200161002190610050565b6020820181038252601f19601f820116604052506000908051906020019061004a92919061005c565b5061015f565b605c806101ac83390190565b8280546100689061012e565b90600052602060002090601f01602090048101928261008a57600085556100d1565b82601f106100a357805160ff19168380011785556100d1565b828001600101855582156100d1579182015b828111156100d05782518255916020019190600101906100b5565b5b5090506100de91906100e2565b5090565b5b808211156100fb5760008160009055506001016100e3565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061014657607f821691505b602082108103610159576101586100ff565b5b50919050565b603f8061016d6000396000f3fe6080604052600080fdfe),
MetadataPart(a264697066735822**12202e82fb6222f966f0e56dc49cd1fb8a6b5eac9bdf74f62b8a5e9d8812901095d6**64736f6c634300080e0033),
MainPart(6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfe),
MetadataPart(a264697066735822**1220bd9f7fd5fb164e10dd86ccc9880d27a177e74ba873e6a9b97b6c4d7062b26ff0**64736f6c634300080e0033)
]
#### Constructor arguments
Constructor arguments are extracted at the end of the verification process. Constructor arguments are appended at the end of the *creationTxInput* returned by the compiler. So, to extract these arguments we remove parts presented in local *creationTxInput*, and consider everything else as likely constructor arguments.
After that we attempt to map potential constructor args to the constructor abi of the contract. If successful, extracted args are returned as actual constructor arguments.
## Verification Http Api
Currently, verification requests are sent via HTTP requests. This module runs an HTTP server and provides endpoints through which external services (main Blockscout instance, in our case) send verification requests and receive responses. Endpoints provided by the service and configuration details are described in the [corresponding Readme file](https://github.com/blockscout/blockscout-rs/tree/main/smart-contract-verifier-http).
Currently only synchronous endpoints are available. In the future a new service that handles asynchronous requests on top of the current smart-contract-verifier may be implemented.
# Requirements
Source: https://docs.blockscout.com/setup/requirements
System, hardware, database, node tracing, and JSON-RPC client requirements for running a self-hosted Blockscout explorer instance.
π [Autoscout is now available](/using-blockscout/autoscout), providing a simple one-click explorer deployment with Blockscout's optimized hosting infrastructure. Use it for early testing, modifications, and launching a full production-grade explorer. [**Get Started Now**](/using-blockscout/autoscout) **and have your explorer up-and-running in minutes.**
See the submenu for requirements information
* [General requirements and software dependencies](/setup/requirements/requirements)
* [Hardware and hosting requirements](/setup/requirements/resource-requirements)
* [DB storage requirements](/setup/requirements/database-storage-requirements)
* [Client setting requirements](/setup/requirements/client-settings) (Geth, Erigon, Nethermind etc)
* [Node Tracing Requirements](/setup/requirements/node-tracing-json-rpc-requirements) by Client
# Backend/Frontend Compatibility Matrix
Source: https://docs.blockscout.com/setup/requirements/back-front-compatibility-matrix
Version compatibility matrix mapping Blockscout backend releases to supported frontend versions for self-hosted explorer deployments.
| frontend/backend | v12.0.x | v11.3.x | v11.2.x | v11.1.x | v11.0.x | v10.2.x | v10.1.x | v10.0.x | v9.4.x | v9.3.x | v9.2.x | v9.1.x | v9.0.x | v8.1.x | v8.0.x | v7.0.x | v6.10.x | v6.9.x | v6.8.x | v6.7.x | v6.6.x | v6.5.x | v6.4.x | v6.3.x | v6.2.x | v6.1.x | v6.0.x | v5.4.x | v5.3.x | v5.2.x | v5.1.x | v5.0.x |
| - | :- | :- | :- | :- | :- | :- | :- | :- | :- | :- | :- | :- | :- | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - |
| v2.11.x+ | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v2.10.x+ | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v2.9.x+ | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v2.8.x+ | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v2.7.3+ | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v2.7.2- | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v2.6.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v2.5.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v2.4.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v2.3.1+ | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v2.3.0 | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v2.2.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v2.1.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v2.0.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.38.1+ | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.37.6+ | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.37.5- | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.36.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.35.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.34.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.33.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.32.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.31.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.30.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.29.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.28.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.27.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.26.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.25.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.24.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.23.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.22.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.21.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.20.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.19.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.18.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.17.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.16.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.15.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.14.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.13.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.12.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.11.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.10.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.9.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.8.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.7.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.6.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.5.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.4.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.3.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.2.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.1.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
| v1.0.x | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β | β |
# Client Setting Requirements
Source: https://docs.blockscout.com/setup/requirements/client-settings
Configure Blockscout for Geth, Erigon, Nethermind, Besu, Reth, RSKj, Lotus, and Anvil JSON-RPC clients with the right endpoints and flags.
π [Autoscout is now available](/using-blockscout/autoscout), providing a simple one-click explorer deployment with Blockscout's optimized hosting infrastructure. Use it for early testing, modifications, and launching a full production-grade explorer. [**Get Started Now**](/using-blockscout/autoscout) **and have your explorer up-and-running in minutes.**
## Supported JSON RPC Clients
BlockScout currently supports [Geth](https://github.com/ethereum/go-ethereum), [Erigon](https://github.com/erigontech/erigon), [Nethermind](https://github.com/NethermindEth/nethermind), [Reth](https://github.com/paradigmxyz/reth), [Besu](https://github.com/hyperledger/besu), [RSKj](https://github.com/rsksmart/rskj), [Lotus](https://github.com/filecoin-project/lotus), and [Anvil](https://book.getfoundry.sh/anvil/) JSON RPC clients. To define the JSON RPC node variant, it's advised to define the `ETHEREUM_JSONRPC_VARIANT` environment variable\*. Correct values include:
| JSON RPC Client | Value | Note |
| - | - | - |
| Geth | \`geth\` | Default. This value is applicable for both Geth and Reth JSON RPC clients |
| Erigon | \`erigon\` | It is suggested to use `erigon` variant for Reth JSON RPC client. |
| Nethermind | \`nethermind\` | This value is applicable for Reth and deprecated OpenEthereum (aka Parity) JSON RPC clients |
| Besu | \`besu\` | |
| RSKj | \`rsk\` | |
| Lotus | \`filecoin\` | |
| Anvil | \`anvil\` | |
\*If the variable is not set, JSON RPC variant will be chosen based on `CHAIN_TYPE` variable according to the mapping [https://github.com/blockscout/blockscout/blob/a2625803c831fb86e38ffe0e28d94bfd697914ce/apps/ethereum\_jsonrpc/lib/ethereum\_jsonrpc/variant.ex#L114-L120](https://github.com/blockscout/blockscout/blob/a2625803c831fb86e38ffe0e28d94bfd697914ce/apps/ethereum_jsonrpc/lib/ethereum_jsonrpc/variant.ex#L114-L120)
```ruby theme={null}
defp get_default_variant do
case Application.get_env(:explorer, :chain_type) do
:rsk -> "rsk"
:filecoin -> "filecoin"
_ -> "geth"
end
end
```
BlockScout currently requires a full archive node in order to import every state change for every address on the target network.
## Configs
| Application | Environment | Config path |
| - | - | - |
| Explorer | Dev | [https://github.com/blockscout/blockscout/tree/master/apps/explorer/config/dev](https://github.com/blockscout/blockscout/tree/master/apps/explorer/config/dev) |
| | Prod | [https://github.com/blockscout/blockscout/tree/master/apps/explorer/config/prod](https://github.com/blockscout/blockscout/tree/master/apps/explorer/config/prod) |
| Indexer | Dev | [https://github.com/blockscout/blockscout/tree/master/apps/indexer/config/dev](https://github.com/blockscout/blockscout/tree/master/apps/indexer/config/dev) |
| | Prod | [https://github.com/blockscout/blockscout/tree/master/apps/indexer/config/prod](https://github.com/blockscout/blockscout/tree/master/apps/indexer/config/prod) |
## Variables to connect to JSON RPC client
| Name | Environment Variable | Default Value | Description |
| - | - | - | - |
| **HTTP Endpoint** | `ETHEREUM_JSONRPC_HTTP_URL` | http\://localhost:8545 | The HTTP Endpoint is used to fetch `blocks`, `transactions`, `receipts`, `coin/token balances`. |
| **Fallback HTTP Endpoint** | `ETHEREUM_JSONRPC_FALLBACK_HTTP_URL` | (empty) | Fallback JSON RPC HTTP url. |
| **Tracing Endpoint** | `ETHEREUM_JSONRPC_TRACE_URL` | http\://localhost:8545 | The Tracing endpoint is used to fetch `internal transactions` and `block traces`. In most cases this endpoint is identical to the HTTP Endpoint. |
| **Fallback Tracing Endpoint** | `ETHEREUM_JSONRPC_FALLBACK_TRACE_URL` | (empty) | Fallback JSON RPC tracing url. |
| **Eth\_call Requests Endpoint** | `ETHEREUM_JSONRPC_ETH_CALL_URL` | (empty) | JSON RPC url for `eth_call` method requests. |
| **Fallback Eth\_call Requests Endpoint** | `ETHEREUM_JSONRPC_FALLBACK_ETH_CALL_URL` | (empty) | Fallback JSON RPC `eth_call` url. |
| **WebSockets Endpoint** | `ETHEREUM_JSONRPC_WS_URL` | ws\://localhost:8546 | The WebSockets endpoint subscribes to `newHeads` which alerts the indexer to fetch the new block from the subscription. |
## Geth
More information on Geth JSON-RPC [is available here](https://geth.ethereum.org/docs/interacting-with-geth/rpc).
```bash theme={null}
sudo /usr/bin/geth --http --http.addr 0.0.0.0 --port 30303 --http.port 8545 --http.api debug,net,eth,shh,web3,txpool --ws.api "eth,net,web3,network,debug,txpool" --ws --ws.addr 0.0.0.0 --ws.port 8546 --ws.origins "*" --sepolia --datadir=/rinkeby --syncmode "full" --gcmode "archive" --http.vhosts "*"
```
*Tracing and pruning: By default, state for the last 128 blocks is kept in memory. Most states are garbage collected. If you are running a block explorer or other service relying on transaction tracing without an archive node (--gcmode=archive), you need to trace within this window! Alternatively, specify the "reexec" tracer option to allow regenerating historical state; and ideally switch to chain tracing which amortizes overhead across all traced blocks.*
## Erigon
More information on Erigon configuration [is available here](https://erigon.gitbook.io/erigon/advanced-usage/configure-erigon).
## Nethermind
More information on Nethermind configuration [is available here](https://docs.nethermind.io/fundamentals/configuration/).
## Reth
More information on Reth configuration [is available here](https://reth.rs/run/config.html).
## RSKj
More information on RSKj configuration [is available here](https://dev.rootstock.io/rsk/node/configure/reference/).
## Besu
More information on Besu configuration [is available here](https://besu.hyperledger.org/stable/public-networks/how-to/configuration-file).
## Lotus
More information on Lotus configuration [is available here](https://lotus.filecoin.io/lotus/configure/defaults/).
## OpenEthereum
```python theme={null}
--jsonrpc-interface all --jsonrpc-apis web3,eth,net,parity,pubsub,traces --ws-interface all --fat-db=on --pruning=archive --ws-apis all --ws-origins all --ws-hosts all
```
# Database Storage Requirements
Source: https://docs.blockscout.com/setup/requirements/database-storage-requirements
Estimated PostgreSQL storage sizes for indexing Ethereum mainnet, Sepolia, Gnosis, Chiado, and Ethereum Classic in a Blockscout explorer instance.
The configuration variable `db_storage` can be used to define the amount of storage allocated to your RDS instance. The chart below shows an estimated amount of storage that is required to index individual chains. Note these numbers are estimates and are constantly increasing.
The `db_storage` can only be adjusted 1 time in a 24 hour period on AWS.
| Chain | Storage (GiB) |
| - | - |
| Ethereum Mainnet | 21000 |
| Ethereum Sepolia | 5200 |
| Gnosis Chain | 21000 |
| Gnosis Chiado | 470 |
| Ethereum Classic | 555 |
*Note*: as of 23.12.2024
# L2 to L1 JSON-RPC method requests
Source: https://docs.blockscout.com/setup/requirements/l2-greater-than-l1-json-rpc-method-requests
Reference of L1 JSON-RPC methods and polling patterns Blockscout fetchers use for Arbitrum, Optimism, Scroll, Shibarium, zkSync, and Polygon zkEVM.
This page documents the requirements for various rollup types when requesting data from the L1 node.
Layer 2 (L2) chains interact with their Layer 1 (L1) counterparts in different ways depending on the rollup type and information required. Blockscout's chain-specific fetchers interact with the L1 node to gather information crucial for tracking the rollup's state, batches, confirmations, and cross-chain messages.
* [Arbitrum](/setup/requirements/l2-greater-than-l1-json-rpc-method-requests#arbitrum-rollups)
* [Optimism](/setup/requirements/l2-greater-than-l1-json-rpc-method-requests#optimism-rollups)
* [Scroll](/setup/requirements/l2-greater-than-l1-json-rpc-method-requests#scroll-l1-fetchers)
* [Shibarium](/setup/requirements/l2-greater-than-l1-json-rpc-method-requests#shibarium-l1-fetchers)
* [zkSync](/setup/requirements/l2-greater-than-l1-json-rpc-method-requests#zksync-rollups)
* [Polygon zkEVM](/setup/requirements/l2-greater-than-l1-json-rpc-method-requests#polygon-zkevm-l1-fetchers)
The following standard L1 JSON-RPC methods are utilized. Frequency and triggers for these calls are described for each chain below.
| L1 JSON-RPC Method | Purpose |
| - | - |
| `eth_getLogs` | Discover L1 events (Batches, Confirmations, Executions, Messages, Keysets) |
| `eth_getBlockByNumber` | Get L1 Block Timestamps, Chain Head/Safe Block info |
| `eth_getTransactionByHash` | Get L1 Tx Calldata (Batches), Get L1 Tx Originator (L1->L2 Messages) |
| `eth_call` | Get Keyset Creation Block from `SequencerInbox` contract (Used infrequently for Arbitrum chains only) |
***
## Arbitrum Rollups
### L1 JSON-RPC method details
#### Method: `eth_getLogs`
Used periodically to poll for specific L1 events emitted by Arbitrum contracts. The polling intervals are generally configurable (`INDEXER_ARBITRUM_BATCHES_TRACKING_RECHECK_INTERVAL` and `INDEXER_ARBITRUM_TRACKING_MESSAGES_ON_L1_RECHECK_INTERVAL` for new events, faster polling for historical catch-up).
* **Events Polled:**
* `SequencerBatchDelivered` (from `SequencerInbox` contract): To discover new L1 batches containing L2 block data. Polled periodically by the batch tracking worker (`TrackingBatchesStatuses`).
* `SendRootUpdated` (from `Outbox` contract): To discover L2 block confirmations. Polled periodically by the batch tracking worker.
* `OutBoxTransactionExecuted` (from `Outbox` contract): To discover L2-to-L1 message executions on L1. Polled periodically by the batch tracking worker.
* `MessageDelivered` (from `Bridge` contract): To discover L1-to-L2 message initiations on L1. Polled periodically by the L1 message tracking worker (`TrackingMessagesOnL1`).
* `SetValidKeyset` (from `SequencerInbox` contract): To retrieve details about AnyTrust Data Availability Committee keysets. This is triggered **on-demand** when processing an AnyTrust batch that references a keyset hash not yet seen in the database.
***
#### Method: `eth_getBlockByNumber`
* **Fetching Timestamps:**
* Called frequently **in response to processing events** found via `eth_getLogs`. When a relevant event (like batch delivery, confirmation, or message execution) is found in a log, this method is called for the corresponding L1 block number to get its timestamp. This happens in batches triggered by the periodic log polling.
* **Fetching Chain Head/Safe Block:**
* Called periodically (driven by `recheck_interval`) with tags `"latest"` and `"safe"` to determine the current L1 chain head and the safe block for reorg protection and determining finality. Used by batch, confirmation, and execution workers.
* Called once during initialization to determine the starting point if not explicitly configured.
***
#### Method: `eth_getTransactionByHash`
Called **in response to processing events** found via `eth_getLogs`:
* **Fetching Batch Calldata:**
* When a `SequencerBatchDelivered` event is processed, this method is called for the L1 transaction hash associated with the event to retrieve the transaction's `input` data (calldata). This calldata contains essential batch information, especially for non-blob batches.
* **Fetching L1->L2 Message Originator:**
* When a `MessageDelivered` event (for an L1->L2 message) is processed, this method is called for the L1 transaction hash to retrieve the originator (`from`) address.
***
#### Method: `eth_call`
Used less frequently than the other calls.
* **Fetching Keyset Creation Block:**
* When processing an AnyTrust batch referencing a previously unknown keyset hash, an `eth_call` is made to the `SequencerInbox` contract's `getKeysetCreationBlock` function to determine the L1 block where the keyset became active. This is triggered **on-demand** during batch processing.
***
## Optimism Rollups
### Optimism L1 fetchers
Method calls are described for each of the Optimism-based fetchers including Deposit, DisputeGame, OutputRoot, TransactionBatch and WithdrawalEvent.
#### Indexer.Fetcher.Optimism.Deposit
* `eth_getLogs` (driven by `INDEXER_OPTIMISM_L1_ETH_GET_LOGS_RANGE_SIZE` for catchup mode) - one request per block in realtime mode
* `eth_getBlockByNumber` for each block within `eth_getLogs` response to get block timestamp. Batch request is used, so one batch request per one `eth_getLogs` call
#### Indexer.Fetcher.Optimism.DisputeGame
* call to `OptimismPortal`'s `respectedGameType()` public getter (every 60 seconds)
* call to `DisputeGameFactory`'s `gameCount` public getter (every 60 seconds)
* call to `DisputeGameFactory`'s `gameAtIndex` public getter (max 50 items per batch request) and the corresponding batch calls to `extraData`, `resolvedAt`, `status` public getters for each dispute game
* call to `DisputeGameFactory`'s `resolvedAt` public getter (max 50 items per batch request) for max 1000 last unresolved games
* call to `DisputeGameFactory`'s `status` public getter (max 50 items per batch request) for max 1000 last resolved games
#### Indexer.Fetcher.Optimism.OutputRoot
* `eth_getLogs` (driven by `INDEXER_OPTIMISM_L1_ETH_GET_LOGS_RANGE_SIZE` for catchup mode) - one request per block in realtime mode
#### Indexer.Fetcher.Optimism.TransactionBatch
* `eth_getBlockByNumber` (batch RPC calls containing up to `INDEXER_OPTIMISM_L1_BATCH_BLOCKS_CHUNK_SIZE` requests per batch in catchup mode starting from the start block defined in `SystemConfig` contract) - one request per block in realtime mode
#### Indexer.Fetcher.Optimism.WithdrawalEvent
* `eth_getLogs` (driven by `INDEXER_OPTIMISM_L1_ETH_GET_LOGS_RANGE_SIZE` for catchup mode) - one request per block in realtime mode
* `eth_getBlockByNumber` for each block within `eth_getLogs` response to get block timestamp. Batch request is used, so one batch request per one `eth_getLogs` call
***
## zkSync Rollups
### **L1 interaction process**
Blockscout's zkSync-specific fetchers verify zkSync batch status and transitions (Committed, Proven, Executed) recorded on the L1.
### **L1 interaction summary**
L1 calls are infrequent and only triggered to confirm L1 state transitions suggested by the L2 node.
* L1 interaction is driven by the `BatchesStatusTracker`. This tracker performs periodic checks based on the `INDEXER_ZKSYNC_BATCHES_STATUS_RECHECK_INTERVAL` ENV variable setting.
* Each check phase (`:check_committed`, `:check_proven`, `:check_executed`) *first* queries the L2 node via RPC (`zks_getL1BatchDetails`).
* If (*and only if*) the L2 query indicates a new L1 transaction hash associated with a batch's status change (commit, prove, or execute), the corresponding L1 RPC method (`eth_getTransactionReceipt` or `eth_getTransactionByHash`) is called for that *specific* transaction hash.
### L1 JSON-RPC method details
#### Method: `eth_getTransactionReceipt`
**Purpose**: Retrieves the receipt of an L1 transaction suspected of changing a batch's status (commit or execute). The fetcher specifically looks for event logs within the receipt (`BlockCommit` or `BlockExecution` events) to confirm which batches were affected by that single L1 transaction.
**Frequency:**
* Called conditionally by the `BatchesStatusTracker` process.
* This tracker runs in a loop with a configurable `INDEXER_ZKSYNC_BATCHES_STATUS_RECHECK_INTERVAL`.
* Within this loop, it first checks the L2 RPC (`zks_getL1BatchDetails`) for the oldest uncommitted/unexecuted batch.
* If the L2 RPC response indicates a new commit or execute L1 transaction hash associated with that batch, *then* `eth_getTransactionReceipt` is called on the L1 node for that specific transaction hash.
* It does *not* poll L1 constantly; the call is triggered only when a potential status change is detected via L2 RPC data during the periodic check.
***
#### Method: `eth_getTransactionByHash`
**Purpose:** Retrieves the details of an L1 transaction suspected of proving one or more zkSync batches. The fetcher needs the transaction's `input` (calldata) to decode the list of batches proven in that single L1 transaction.
**Frequency**:
* Called conditionally by the `BatchesStatusTracker` process, similar to `eth_getTransactionReceipt`. It also runs within the tracker's periodic `INDEXER_ZKSYNC_BATCHES_STATUS_RECHECK_INTERVAL`.
* The tracker checks the L2 RPC (`zks_getL1BatchDetails`) for the oldest unproven batch. If the L2 RPC response indicates a new prove L1 transaction hash, *then* `eth_getTransactionByHash` is called on the L1 node for that specific transaction hash to retrieve its calldata.
* Like the receipt fetch, this is triggered by potential changes detected via L2 RPC during the periodic check, not through constant L1 polling.
***
## Polygon zkEVM L1 fetchers
Method calls are described for each of the zkEVM-based fetchers including BridgeL1, BridgeL1Tokens, and TransactionBatch.
#### Indexer.Fetcher.PolygonZkevm.BridgeL1
* `eth_getLogs` (max 1000 blocks in a range per request for catchup mode) - one request per block in realtime mode
* `eth_getBlockByNumber` for each block within `eth_getLogs` response to get block timestamp (batch request is used with max 50 items per request)
* `eth_getBlockByNumber` to get latest block (every block time in seconds, divided by 2)
* one batch request (with calls to `symbol()` and `decimals()` getters of token contracts) per one `eth_getLogs` call
#### Indexer.Fetcher.PolygonZkevm.BridgeL1Tokens
* one batch request (with calls to `symbol()` and `decimals()` getters of token contracts) per one set of logs taken in realtime mode from the L2 block
#### Indexer.Fetcher.PolygonZkevm.TransactionBatch
* a batch call of `zkevm_batchNumber`, `zkevm_virtualBatchNumber`, `zkevm_verifiedBatchNumber` requests per `INDEXER_POLYGON_ZKEVM_BATCHES_RECHECK_INTERVAL` seconds
* a batch call of `zkevm_getBatchByNumber` requests per `INDEXER_POLYGON_ZKEVM_BATCHES_CHUNK_SIZE` zkEVM batches
***
## Scroll L1 fetchers
Method calls are described for each of the Scroll-based fetchers including Batch and BridgeL1.
#### Indexer.Fetcher.Scroll.Batch
* `eth_getLogs` (driven by `INDEXER_SCROLL_L1_ETH_GET_LOGS_RANGE_SIZE` for catchup mode) - one request per block in realtime mode
* `eth_getBlockByNumber` for each block within `eth_getLogs` response to get block timestamp (batch request is used with max 50 items per request)
* `eth_getBlockByNumber` to get latest block (every block time in seconds, divided by 2)
#### Indexer.Fetcher.Scroll.BridgeL1
* `eth_getLogs` (driven by `INDEXER_SCROLL_L1_ETH_GET_LOGS_RANGE_SIZE` for catchup mode) - one request per block in realtime mode
* `eth_getBlockByNumber` for each block within `eth_getLogs` response (taking into account `SentMessage` events only) to get block timestamp (batch request is used with max 50 items per request)
* `eth_getBlockByNumber` to get latest block (every block time in seconds, divided by 2)
## Shibarium L1 fetchers
Method calls are described for each of the Shibarium-based fetchers including L1 and RollupL1ReorgMonitor.
#### Indexer.Fetcher.Shibarium.L1
* three `eth_getLogs` requests per chunk for catchup mode (max 1000 blocks in a chunk) - three requests per block in realtime mode
* `eth_getBlockByNumber` for each block within `eth_getLogs` responses (taking into account deposit events only) to get block timestamp (batch request is used with max 50 items per request)
* `eth_getBlockByNumber` to get latest block (every block time in seconds, divided by 2)
#### Indexer.Fetcher.RollupL1ReorgMonitor
* `eth_getBlockByNumber` to get latest block (every block time in seconds, divided by 2)
# Node Tracing / JSON RPC Requirements
Source: https://docs.blockscout.com/setup/requirements/node-tracing-json-rpc-requirements
Archive node JSON-RPC methods, tracing endpoints, pending transaction support, and rate limits Blockscout needs to fully index a chain.
### Standard JSON RPC Requirements
* Archive node with JSON RPC interface should strictly follow input/output interface described in [https://ethereum.github.io/execution-apis/api-documentation/](https://ethereum.github.io/execution-apis/api-documentation/)
* WebSocket interface (optional/highly recommended to enable) is used to subscribe to new block heads. Otherwise, Blockscout will trigger new blocks fetching by periodically polling the JSON RPC `eth_blockNumber` method.
* Support for the following standard Ethereum JSON RPC methods (documented at [https://ethereum.github.io/execution-apis/api-documentation/](https://ethereum.github.io/execution-apis/api-documentation/))
* `eth_blockNumber`
* `eth_call`
* `eth_getBalance`
* `eth_getCode`
* `eth_getBlockByHash`
* `eth_getBlockByNumber`
* `eth_getTransactionByHash`
* `eth_getTransactionByBlockHashAndIndex`
* `eth_getTransactionByBlockNumberAndIndex`
* `eth_getTransactionReceipt`
* `eth_getUncleByBlockHashAndIndex`
* `eth_getLogs`
### **Fetching Pending Transactions**
*Note pending transactions must be supported by the RPC node to enable this functionality with Blockscout*
| Client | Method |
| - | - |
| Nethermind OpenEthereum | `parity_pendingTransactions` |
| Geth Erigon | `txpool_content` |
### Enable Tracing to Fetch Internal Transactions
| Client | Method |
| - | - |
| Erigon Nethermind OpenEthereum | β’ `trace_replayBlockTransactions` (fetching of internal transactions)
`callTracer` is used by default, starting from the Blockscout 5.1.0 release. To switch to a custom JS tracer, the Blockscout maintainer should set the `export INDEXER_INTERNAL_TRANSACTIONS_TRACER_TYPE=js` environment variable. Prior to the 5.1.0 release, js tracer was a default option. |
| RSK | β’ `trace_block` (fetching of internal transactions) |
### JSON RPC Performance Benchmarks
Time measures for response time of crucial JSON RPC methods for indexing in Blockscout. [Ways to improve speed](/faqs/faqs#how-do-i-speed-up-my-self-hosted-instance).
1. `eth_getBlockByNumber` without transaction receipts for a block with 15 transactions: Desired response time is \< 0.5s. For instance, in case of the Gnosis chain archive node, the response time for the block with \~20 transactions is \~0.4s.
2. `eth_getTransactionReceipt` for random transactions desired response time is \< 0.5s. For the Gnosis chain archive node the response time is \~0.3 - 0.4s.
3. Batched `eth_getTransactionReceipt` for 15 transactions acceptable response time is less than 1s. For the Gnosis chain archive node, it is \~0.6 - 0.7s.
### Rate Limit
The desired rate limit for RPC endpoint is 200 req/sec for the indexing phase and 100 req/sec for the indexed chain.
### EVM Requirements & Clients
* All EVM chains must [define these variables](/setup/env-variables#required-env-variables) during configuration.
* BlockScout currently supports Erigon, Geth, Nethermind, Hyperledger Besu, and Anvil clients. Define the node variant using the `ETHEREUM_JSONRPC_VARIANT` environment variable. [More information](/setup/requirements/client-settings)
### L2 -> L1 JSON RPC Methods
* Find information on JSON RPC method use with [different L2 types.](/setup/requirements/l2-greater-than-l1-json-rpc-method-requests)
# General backend requirements and prerequisites
Source: https://docs.blockscout.com/setup/requirements/requirements
Software dependencies (Erlang, Elixir, PostgreSQL, Node.js, GCC, GMP, and more) required to install and run the Blockscout backend.
Install the software below prior to Blockscout installation. For additional requirements see:
* [Database Storage Requirements](/setup/requirements/database-storage-requirements): Storage required for common chains to give a sense of needed storage
* [Node Tracing Requirements](/setup/requirements/node-tracing-json-rpc-requirements): JSON RPC methods
* [Client Setting Requirements](/setup/requirements/client-settings): Settings related to client implementations (ie Geth, OpenEthereum, etc)
* [Hardware/Hosting Requirements](/setup/requirements/resource-requirements): Base requirements for a hosted instance of Blockscout.
| Dependency | Mac | Linux |
| - | - | - |
| [Erlang/OTP 28](https://github.com/erlang/otp) | `brew install erlang` | [Erlang Install Example](https://github.com/poanetwork/blockscout-terraform/blob/33f68e816e36dc2fb055911fa0372531f0e956e7/modules/stack/libexec/init.sh#L134) |
| [Elixir 1.19.x](https://elixir-lang.org/) | `brew install elixir` | [Elixir Install Example](https://github.com/poanetwork/blockscout-terraform/blob/33f68e816e36dc2fb055911fa0372531f0e956e7/modules/stack/libexec/init.sh#L138) |
| [Postgres 14+](https://www.postgresql.org/) | `brew install postgresql` | [Postgres Install Example](https://github.com/poanetwork/blockscout-terraform/blob/33f68e816e36dc2fb055911fa0372531f0e956e7/modules/stack/libexec/init.sh#L187) *Note*: Application versions earlier than v12 also support PostgreSQL 12 and 13. |
| [Node.js 20.x.x](https://nodejs.org/en/) | `brew install node` | [Node.js Install Example](https://github.com/poanetwork/blockscout-terraform/blob/33f68e816e36dc2fb055911fa0372531f0e956e7/modules/stack/libexec/init.sh#L66) |
| [Automake](https://www.gnu.org/software/automake/) | `brew install automake` | [Automake Install Example](https://github.com/poanetwork/blockscout-terraform/blob/33f68e816e36dc2fb055911fa0372531f0e956e7/modules/stack/libexec/init.sh#L72) |
| [Libtool](https://www.gnu.org/software/libtool/) | `brew install libtool` | [Libtool Install Example](https://github.com/poanetwork/blockscout-terraform/blob/33f68e816e36dc2fb055911fa0372531f0e956e7/modules/stack/libexec/init.sh#L62) |
| [Inotify-tools](https://github.com/rvoicilas/inotify-tools/wiki) | Not Required | Ubuntu - `apt-get install inotify-tools` |
| [GCC Compiler](https://gcc.gnu.org/) | `brew install gcc` | [GCC Compiler Example](https://github.com/poanetwork/blockscout-terraform/blob/33f68e816e36dc2fb055911fa0372531f0e956e7/modules/stack/libexec/init.sh#L70) |
| [GMP](https://gmplib.org/) | `brew install gmp` | [Install GMP Devel](https://github.com/poanetwork/blockscout-terraform/blob/33f68e816e36dc2fb055911fa0372531f0e956e7/modules/stack/libexec/init.sh#L74) |
| [Ffmpeg](https://ffmpeg.org/) | `brew install ffmpeg@7` | `sudo apt install ffmpeg` if Debian |
| Make | - | `sudo apt install make` if Debian |
| G++ Compiler | - | `sudo apt install g++` if Debian |
Additional requirements for Blockscout versions below 5.1.3:
| Dependency | Mac | Linux |
| - | - | - |
| Rust | - | [Install Rust](https://www.rust-lang.org/tools/install) |
| Cargo | - | Ubuntu - `apt-get install cargo` |
# Hardware & Hosting Requirements
Source: https://docs.blockscout.com/setup/requirements/resource-requirements
Recommended CPU, RAM, disk, and AWS EC2/RDS PostgreSQL baseline sizing for hosting a Blockscout explorer with an EVM archive node backend.
Resource requirements may vary based on chain size and other parameters. This mainly impacts [database storage](/setup/requirements/database-storage-requirements) requirements. Basic [prerequisites](/setup/requirements/requirements) and settings can be found throughout the [Information and Settings](/setup/information-and-settings) section for developers.
BlockScout requires a full archive node to import every state change for every address on the target network.
## Recommended Base Hardware
EVM chains can differ in size and requirements, these are the recommendations for optimal performance.
| CPU | 16 core, 32 thread |
| - | - |
| RAM | 128GB |
## Hosting Requirements
Minimums are listed for an AWS Cloud instance and can be inferred to other hosting providers.
| | |
| - | - |
| Application | β’ 1x EC2 m5a.xlarge instance running Linux
β’ 8GB of EBS General Purpose SSD (NVMe) |
| Database | β’ 1x RDS Database running on db.t3.large using PostgreSQL v14+
β’ 500GB of General Purpose SSD (depending on chain size)
β’ See [Database Storage Requirements](/setup/requirements/database-storage-requirements) for chain-relevant baselines. |
| Amazon Elastic Load Balancing | β’ Average 100 new connections/sec per Elastic Load Balancer |
Requirements will vary based on chain. For example, these are the recommended requirements for a Harmony Explorer Node:
**Setup**: AWS i3en.12xlarge or equivalent, with local disk storage **Storage**: \~24TB (4x NVMe SSD) is recommended for Archival Explorer Nodes on Shard 0 **OS**: Latest Ubuntu Linux (LTS Version) **Network**: 100M+ bandwidth
For additional information, see:
* [General Requirements:](/setup/requirements/requirements) Software required for deployment
* [Database Storage Requirements](/setup/requirements/database-storage-requirements): Storage required for common chains to give a sense of needed storage
* [Node Tracing Requirements](/setup/requirements/node-tracing-json-rpc-requirements): JSON RPC methods
* [Client Setting Requirements](/setup/requirements/client-settings): Settings related to client implementations (ie Geth, OpenEthereum, etc)
# Testing
Source: https://docs.blockscout.com/setup/testing
Run the Blockscout Elixir test suites (indexer, explorer, block_scout_web, ethereum_jsonrpc) with chromedriver, Postgres, Geth, and Nethermind.
### Requirements
* Install `chromedriver`. It is required to run tests from `./apps/block_scout_web` of the Umbrella application.
* This set of environment variables is required for each run of the test (`mix test`) suite:
```bash theme={null}
export MIX_ENV=test
export POSTGRES_DB=explorer_test
export POSTGRES_PASSWORD=postgres
export POSTGRES_USER=postgres
export CHAIN_ID=77
```
Since v6.6.0, there are more flexible options for configuring the database used in testing. Refer to the `TEST_DATABASE_URL` and `DATABASE_READ_ONLY_API_URL` environment variables for more details.
```bash theme={null}
export MIX_ENV=test
export TEST_DATABASE_URL=postgresql://postgres:postgres@postgres-host:5432/explorer_test
export CHAIN_ID=77
```
### Running tests
1. Build assets. `cd apps/block_scout_web/assets && npm run build; cd -`
2. Format Elixir code. `mix format`
3. Lint Elixir code. `mix credo --strict`
4. Run the dialyzer. `mix dialyzer --halt-exit-status`
5. Check the Elixir code for vulnerabilities. `cd apps/explorer && mix sobelow --config; cd -` `cd apps/block_scout_web && mix sobelow --config; cd -`
6. Lint JavaScript code. `cd apps/block_scout_web/assets && npm run eslint; cd -`
7. Test JavaScript code. `cd apps/block_scout_web/assets && npm run test; cd -`
8. Run separate test suites for the Umbrella application - `indexer` `mix do ecto.create --quiet, ecto.migrate && cd apps/indexer && mix do compile, test --no-start && cd -`
- `explorer` `mix do ecto.create --quiet, ecto.migrate && cd apps/explorer && mix do compile, test --no-start && cd -`
- `block_scout_web` `mix do ecto.create --quiet, ecto.migrate && cd apps/block_scout_web && mix do compile, test --no-start && cd -`
- `ethereum_jsonrpc` `mix do ecto.create --quiet, ecto.migrate && cd apps/ethereum_jsonrpc && mix do compile, test --no-start && cd -`
### **Nethermind**
**Mox**
**This is the default setup.** `mix test --no-start` **will work on its own, but to be explicit, use the following setup**:
```bash theme={null}
ETHEREUM_JSONRPC_CASE=EthereumJSONRPC.Case.Nethermind.Mox \
ETHEREUM_JSONRPC_WEB_SOCKET_CASE=EthereumJSONRPC.WebSocket.Case.Mox \
mix test --no-start --exclude no_nethermind
```
**HTTP / WebSocket**
```bash theme={null}
ETHEREUM_JSONRPC_CASE=EthereumJSONRPC.Case.Nethermind.HTTPWebSocket \
ETHEREUM_JSONRPC_WEB_SOCKET_CASE=EthereumJSONRPC.WebSocket.Case.Nethermind \
mix test --no-start --exclude no_nethermind
```
| Protocol | URL |
| - | - |
| HTTP | `http://localhost:8545` |
| WebSocket | `ws://localhost:8546` |
### **Geth**
**Mox**
```bash theme={null}
ETHEREUM_JSONRPC_CASE=EthereumJSONRPC.Case.Geth.Mox \
ETHEREUM_JSONRPC_WEB_SOCKET_CASE=EthereumJSONRPC.WebSocket.Case.Mox \
mix test --no-start --exclude no_geth
```
**HTTP / WebSocket**
```bash theme={null}
ETHEREUM_JSONRPC_CASE=EthereumJSONRPC.Case.Geth.HTTPWebSocket \
ETHEREUM_JSONRPC_WEB_SOCKET_CASE=EthereumJSONRPC.WebSocket.Case.Geth \
mix test --no-start --exclude no_geth
```
| Protocol | URL |
| - | - |
| HTTP | `https://mainnet.infura.io/8lTvJTKmHPCHazkneJsY` |
| WebSocket | `wss://mainnet.infura.io/ws/8lTvJTKmHPCHazkneJsY` |
# Soneium API
Source: https://docs.blockscout.com/soneium-api
Blockscout is Soneium's primary block explorer. Full API access for Sony's OP Stack Ethereum L2 mainnet and Minato testnet with free and paid tiers.
# Soneium API β Block Explorer API for Sony's Ethereum L2 | Blockscout
> Blockscout is the primary explorer for Soneium. Full API access for mainnet and Minato testnet β free and paid tiers.
## Soneium API Access with Blockscout
Soneium is Sony's Ethereum Layer 2, built on the OP Stack and developed through Sony Block Solutions Labs in partnership with Startale Group. It connects Sony's entertainment and consumer electronics businesses β spanning gaming, music, film, and digital media β with onchain infrastructure.
Since its mainnet launch in January 2025, Soneium has processed over 500 million transactions, onboarded 5.4 million active wallets, and hosts more than 250 decentralized applications focused on fan engagement, digital collectibles, IP licensing, and AI-powered creative tools. Startale closed a \$63M Series A in March 2026 led by Sony Innovation Fund with participation from Samsung Next, UOB Venture Management, and SBI Holdings β signaling serious long-term institutional backing.
Blockscout is Soneium's primary block explorer. Etherscan does not support Soneium. If you're building on Soneium, Blockscout provides your API β on both mainnet and the Minato testnet.
**Soneium Mainnet Chain ID:** `1868` **Soneium Minato Testnet Chain ID:** `1946`
| Network | Explorer | PRO API `chainid` |
| - | - | - |
| Soneium Mainnet | [soneium.blockscout.com](https://soneium.blockscout.com) | `1868` |
| Soneium Minato Testnet | [soneium-minato.blockscout.com](https://soneium-minato.blockscout.com) | `1946` |
**PRO API Base:** `https://api.blockscout.com` (use `chainid=1868` or `chainid=1946`)
## Quick Start
Get your first API response in under 60 seconds:
```bash theme={null}
# Mainnet β get ETH balance for an address
curl "https://api.blockscout.com/v2/api?chainid=1868&module=account&action=balance&address=0xYOUR_ADDRESS&apikey=proapi_YOUR_KEY"
# Minato Testnet β same call, different chainid
curl "https://api.blockscout.com/v2/api?chainid=1946&module=account&action=balance&address=0xYOUR_ADDRESS&apikey=proapi_YOUR_KEY"
```
Get a free API key at [dev.blockscout.com](https://dev.blockscout.com). It is required for all PRO API tiers, including the free tier. The same key works for both mainnet and testnet, and any other chains you want to query.
## PRO API Routes for Soneium
### Mainnet (chainid=1868)
**JSON RPC v2 (Etherscan-compatible):**
```text theme={null}
https://api.blockscout.com/v2/api?chainid=1868&module=account&action=txlist&address=0x...&apikey=proapi_xxx
```
**JSON RPC:**
```text theme={null}
https://api.blockscout.com/1868/api?module=account&action=txlist&address=0x...&apikey=proapi_xxx
```
**REST API:**
```text theme={null}
https://api.blockscout.com/1868/api/v2/addresses/0x.../transactions?apikey=proapi_xxx
```
**ETH RPC (POST):**
```bash theme={null}
curl -H "content-type: application/json" \
-H "authorization: Bearer proapi_xxx" \
-X POST \
--data '{"id":0,"jsonrpc":"2.0","method":"eth_blockNumber","params":[]}' \
https://api.blockscout.com/1868/json-rpc
```
### Minato Testnet (chainid=1946)
Every route works identically β swap `1868` for `1946`:
```text theme={null}
https://api.blockscout.com/v2/api?chainid=1946&module=account&action=txlist&address=0x...&apikey=proapi_xxx
```
```text theme={null}
https://api.blockscout.com/1946/api/v2/addresses/0x.../transactions?apikey=proapi_xxx
```
As an OP Stack chain, the PRO API also includes OP-specific endpoints under the `optimism` module for rollup data like deposits, withdrawals, and batch submissions.
## Available Endpoints
### Etherscan-Compatible Modules
Standard Etherscan-compatible modules work out of the box on both mainnet and testnet:
* **Account** β Balances, transaction lists, token transfers, internal transactions, ERC-20/721/1155 activity (plus Blockscout extras: `eth_get_balance`, `pendingtxlist`, `tokenbalance`, `tokenlist`)
* **Contract** β ABI, source code, verification (plus: `listcontracts`, `getcontractcreation`, Vyper & Sourcify verification)
* **Transaction** β Status checks (plus: `gettxinfo`)
* **Logs** β Event logs with filtering by address, topics, block range
* **Token** β Token metadata, holders
* **Stats** β Supply, chain statistics, coin price
* **Block** β Block rewards, countdown, block number by time
* **Gas Tracker** β Gas oracle, gas estimates
### REST API
Blockscout's REST API extends beyond the Etherscan-compatible interface with enriched metadata, decoded input data, NFT media and attributes, smart contract read/write interaction, and chain indexing status.
**β [Mainnet REST API Reference](https://soneium.blockscout.com/api-docs)** Β· **β [Minato REST API Reference](https://soneium-minato.blockscout.com/api-docs)**
## Soneium API Pricing
| Tier | Rate Limit | Credits | Price |
| - | - | - | - |
| Free | 5 RPS | 100K/day | \$0 |
| Builder | 15 RPS | 100M/mo | \$49/mo |
| Pro | 30 RPS | 500M/mo | \$199/mo |
| Business | 50 RPS | 3B/mo | \$999/mo |
| Enterprise | Custom | Custom | Contact us |
One API key covers Soneium mainnet, Minato testnet, and every other Blockscout-supported chain β 117 networks total. Testnet calls consume credits from the same pool.
## Coming from Other OP Stack Chains?
Soneium uses the same OP Stack infrastructure that powers Base, Optimism, Zora, and Ink. If you've built on any Superchain network with the Blockscout PRO API, querying Soneium is a `chainid` swap:
```javascript theme={null}
// Multichain across the Superchain β one function, one API key
const BLOCKSCOUT_KEY = process.env.BLOCKSCOUT_KEY;
const CHAINS = {
soneium: 1868,
soneium_testnet: 1946,
base: 8453,
optimism: 10,
ink: 57073,
zora: 7777777,
};
async function getTokenTransfers(chainName, address) {
const chainId = CHAINS[chainName];
const resp = await fetch(
`https://api.blockscout.com/v2/api?chainid=${chainId}&module=account&action=tokentx&address=${address}&apikey=${BLOCKSCOUT_KEY}`
);
return resp.json();
}
// Query Soneium mainnet
const mainnetTxns = await getTokenTransfers("soneium", "0x...");
// Test against Minato first β same function, same key
const testnetTxns = await getTokenTransfers("soneium_testnet", "0x...");
```
If you're migrating from Etherscan V2 on another chain, the structure is nearly identical. Etherscan uses `api.etherscan.io/v2/api?chainid=X`, Blockscout uses `api.blockscout.com/v2/api?chainid=X`. But Etherscan doesn't support Soneium at all β Blockscout is your only option.
**β [Full Migration Guide](https://docs.blockscout.com/devs/migrate-from-etherscan)**
## Developing on Soneium Minato Testnet
Minato provides a full sandbox environment that mirrors mainnet conditions. Developers use it to validate contracts, test bridge flows, and iterate on dApps before deploying to production. Blockscout covers the testnet with the same explorer and API infrastructure as mainnet.
**Testnet workflow with the PRO API:**
```python theme={null}
import requests
BLOCKSCOUT_KEY = os.environ["BLOCKSCOUT_KEY"]
def query_soneium(chainid, module, action, **params):
"""Query either Soneium mainnet (1868) or Minato testnet (1946)."""
resp = requests.get("https://api.blockscout.com/v2/api", params={
"chainid": chainid,
"module": module,
"action": action,
"apikey": BLOCKSCOUT_KEY,
**params
})
return resp.json()
# Verify your contract ABI is accessible on testnet before mainnet deploy
testnet_abi = query_soneium(1946, "contract", "getabi", address="0xYOUR_CONTRACT")
# After mainnet deploy, same call with chainid=1868
mainnet_abi = query_soneium(1868, "contract", "getabi", address="0xYOUR_CONTRACT")
```
**Getting testnet ETH:** Soneium Minato uses Sepolia ETH bridged via the [Soneium testnet bridge](https://bridge.soneium.org/testnet). Faucets are also available through [Chainlink](https://faucets.chain.link/soneium-minato) and other providers.
## What Developers Build on Soneium with Blockscout's API
**Entertainment & Fan Engagement** β Soneium's core thesis is onchain entertainment. Developers building fan platforms, digital collectibles, loyalty programs, and creator tools need API access to token data, NFT metadata, and transaction history tied to Sony IP ecosystems. Projects like KAMI (programmable digital IP objects) and IDOL RUNWAY COLLECTION are already live.
**Stablecoin & Payments Infrastructure** β Startale USD (USDSC) is live as Soneium's native settlement layer, and a JPY-denominated stablecoin (JPYSC) is in development for cross-border payments across Asia-Pacific. Developers are building payment flows that query transaction status, token balances, and transfer events through the API.
**Mini Apps & the Startale Super-App** β The Startale App integrates wallet management, dApp access, and asset management in a single interface, with Mini Apps built by third-party developers. These Mini Apps use explorer APIs for wallet data, transaction confirmation, and contract interaction.
**AI & Creator Tools** β Soneium's focus on entertainment IP attracts AI-driven creative applications. Blockscout's PRO API and MCP server provide structured onchain data for agents operating in the creator economy β from automated royalty tracking to AI-generated NFT minting flows.
**Gaming & Digital Twins** β Sony and Startale are testing high-fidelity digital twins and NFT-based ticketing systems natively integrated into Soneium, bridging physical events with digital ownership. Game studios building on Soneium use the API for in-game economy tracking, item transfers, and player wallet queries.
## Soneium on Blockscout
Blockscout is the primary explorer for both Soneium mainnet and Minato testnet. As part of the OP Superchain, Soneium benefits from Blockscout's native support for cross-chain transaction tracking, deposit/withdrawal views, and Superchain interoperability features. The \$63M Series A and backing from Sony, Samsung, UOB, and SBI signal institutional confidence that Soneium is here to stay. For developers building at the intersection of entertainment, IP, and blockchain, Soneium on Blockscout provides the infrastructure to power applications backed by some of the world's largest entertainment and financial companies.
## Get Started
1. Get a free API key at [**dev.blockscout.com**](https://dev.blockscout.com)
2. Use `chainid=1946` (Minato testnet) to develop and test
3. Switch to `chainid=1868` (mainnet) when you're ready to deploy
4. Explore endpoints at [**soneium.blockscout.com/api-docs**](https://soneium.blockscout.com/api-docs)
**β [Start Building on Soneium](https://dev.blockscout.com)** Β· **β [PRO API Routes Reference](https://docs.blockscout.com/devs/pro-api-responses-and-routes)** Β· **β [Soneium Developer Docs](https://docs.soneium.org/docs/builders/overview)**
# Autoscout Explorer Launchpad
Source: https://docs.blockscout.com/using-blockscout/autoscout
Autoscout is Blockscout's self-serve launchpad to deploy a production-ready hosted block explorer for EVM chains and rollups in minutes.
Want to try Autoscout for Free? Request test credits in the [Blockscout Discord](https://discord.gg/blockscout) `#autoscout` channel or email us at [community@blockscout.com](mailto:community@blockscout.com) and we'll top up your account.
Autoscout is a self-service launchpad for chains and rollups looking to deploy an explorer quickly on hosted infrastructure. It is optimized for many chain types including Optimistic and Arbitrum Orbit rollups and zk rollups including Polygon zkEVM and zkSync.
Get Started at [https://deploy.blockscout.com](https://deploy.blockscout.com).
### Get Started with Autoscout
1. **Create an account:** To get started, go to [https://deploy.blockscout.com/](https://deploy.blockscout.com/), create an account, and log in to get started.
2. **Purchase credits:** You will need credits to launch your explorer. Each credit costs \$1.00. Purchase via Stripe with a credit card or via crypto. Credits are deducted in real time, see the pricing table below for costs.
* **You can start with any amount of credits to test your instance. Instances cost between 0.49 - 1.35 credits per hour, depending on the size.**
3. **Add a new instance:** Click the Add instance button to get started.
4. **Add your network info**: See below for info on configuration and parameters.
5. **Deploy your explorer:** Click save and deploy to start the deployment process. In 5-10 minutes your explorer will be live and indexing your chain. Once deployed you can access your explorer link.
6. See [Creating an Instance](/using-blockscout/creating-an-instance) for additional details.
## Autoscout Pricing
Autoscout is a pay-as-you-go service. **Start with any amount of credits** and **increase the balance at any time**.
If your account runs out of credits your instance will be stopped until you top your account back up. If this happens, you will need to relaunch (and reindex) your instance once you add additional credits. Instances will scale based on daily transactions, so be sure to monitor and top up accordingly.
| Size | Hourly | Daily | Weekly | Monthly |
| - | - | - | - | - |
| Small \<50K tx per day | .485 | 12 | 84 | 349 |
| Medium \<150K tx per day | .972 | 24 | 168 | 699 |
| Large \<1M tx per day | 1.32 | 32 | 224 | 949 |
## HDD Billing
In addition to billing based on tx/day, instances are allotted an amount of free disk space as follows:
Instance Size Free Disk Quotas
* Small - 512 GB
* Medium - 1024 GB (1 TB)
* Large - 2048 GB (2 TB)
The status tab shows current HD consumption.
**Once an instance exceeds the Free GB amount, additional credits are required to cover overages for additional usage. Typically it makes sense for an instance to upgrade to a higher tier once these limits are reached. Overage costs are billed at \$0.00015 per GB hour.**
# Dappscout Apps Marketplace
Source: https://docs.blockscout.com/using-blockscout/blockscout-apps
Dappscout is a curated in-explorer marketplace of embedded dapps letting users connect a wallet once and interact across supported chains.
π‘ Submit your dapp now [with this quick form](https://airtable.com/appiy5yijZpMMSKjT/paggtimMHyz0AsOCC/form)!
Dappscout Apps Marketplace provides a curated list of apps available to on-chain users. Projects can submit their project for review, and once accepted, the project is listed in the marketplace.
## Direct Interface
Dapps are either embedded into the interface directly (like this [Uniswap example](https://optimism.blockscout.com/apps/uniswap)) or added as 3rd party links. When embedded, a user can connect their web3 wallet once to Blockscout, then use it with all of the supported Dapps. This saves time and makes for a seamless user experience when switching between multiple applications.
To enable direct embedding, Dapps need to:
1. Support iframe embedding on 3rd party domains.
2. Integrate the [Safe Apps SDK](https://docs.safe.global/apps-sdk-overview).
[***See Dapp integration for more details.***](/using-blockscout/blockscout-apps/dapp-integration)
## Dapps you can Trust
Dappscout marketplace provides additional security and peace of mind when interacting with various Dapps on a chain. Rather than accessing potentially fake links, scam sites or compromised interfaces, all Dapps in Blockscout are vetted and added by the curation team. Dappscout Dapps are safe and secure for users.
## Dappscout Submissions
There are several ways to submit a DApp. You will fill out a form with basic information to get started.
* Use this form to [submit directly](https://airtable.com/appiy5yijZpMMSKjT/paggtimMHyz0AsOCC/form).
* Use the submit app button within the marketplace.
## Blockscout Native Dapps
In addition to 3rd party apps, Blockscout is developing native apps for the Marketplace. These include:
* [Swap](/using-blockscout/essential-dapps/swap): Swapping and bridging application.
* Revokescout: Manage and revoke contract approvals.
## Dapp Star Ratings
Users can rate dapps on a 1-5 star basis. A user must connect their wallet to the explorer, and that wallet must have at least 5 transactions on the chain in order to rate a dapp. Dapps can be sorted by rating score and the number of ratings.
A full rundown on the process is available in this blog post:
Blockscout | Multichain Block Explorer For EVM Chains
Please note: The star rating system is currently experimental. This feature was released in beta testing to assess user interest in ratings and reviews. Current results may be affected by rating biases, including automated or mass submissions. We're actively improving the system based on user feedback.
# DApp Integration
Source: https://docs.blockscout.com/using-blockscout/blockscout-apps/dapp-integration
Integrate your dapp with Dappscout using iframe support and the Safe Apps SDK to gain top listing, embed inside Blockscout, and share wallets.
Embedded DApps allow users to connect with a single wallet, providing a seamless user experience that eliminates the need to visit different urls and connect a wallet each time. See the [How to Integrate](/using-blockscout/blockscout-apps/dapp-integration#how-to-integrate) section below to prepare your DApp.
## Integration Levels
There are several levels of integration with DAppscout.
Our goal is to have as many fully integrated apps as possible!
1. **Fully Integrated Apps**
* Apps that are opened in an iFrame on \*.blockscout.com domains and have integrated the Safe Apps SDK
2. **Partially Integrated Apps**
* Apps that are opened in an iFrame on \*.blockscout.com domains, but have not integrated the Safe Apps SDK for various reasons
3. **Non-Integrated Apps**
* Apps that are not opened in an iFrame on \*.blockscout.com domains and have not integrated the Safe Apps SDK for various reasons
Fully integrated DApps list higher within the default view.
## Integration Benefits
Fully integrated apps receive the following benefits
1. **Top Places in the Ranking for Users**
* All fully integrated apps will appear at the top of the list in their categories.
2. **Free Promo Through Ads**
* Protocols will receive free promotion on Blockscout for a limited time.
3. **Co-Marketing with Blockscout**
* In addition to free promotion, weβll prepare a co-marketing campaign on social media and our blog.
4. **A Special Quality Mark**
* All fully integrated DApps have a green βFully-Integratedβ symbol which shows users it is ready for use.
## How to Integrate
To fully integrate your protocol into DAppscout, you will need to do 3 things.
1. Enable iFrames for the \*.blockscout.com domain
2. Integrate the Safe Apps SDK
3. Submit your DApp via the form
### 1) Enable iFrame support
Both fully and partially integrated apps in the marketplace are embedded using iFrames, and it is necessary to enable iFrame support for our domain - \*.blockscout.com. This can typically be done via the `frame-ancestors` directive of the `Content-Security-Policy` header in your application. For additional examples, please see [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/frame-ancestors).
Also, check your [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) settings, these may need to be modified for the \*.blockscout domain.
### 2) Integrate the Safe Apps SDK
DAppscout uses the Safe Apps SDK to automatically connect a wallet linked to Blockscout to any of the apps in our marketplace. This allows a visitor to connect a wallet once and then open any app without needing to connect the wallet again.
To enable this functionality, Safe Apps SDK needs to be integrated for your protocol, and the \*.blockscout.com domain added as an exception.
The [SAFE SDK documentation page](https://docs.safe.global/apps-sdk-get-started) provides resources to help you through the process. You will need to pass \*.[blockscout.com](http://blockscout.com/) as an additional option to the SafeAppsSDK function into the code [here](https://github.com/safe-global/safe-apps-sdk/tree/main/packages/safe-apps-sdk#documentation).
For additional integration options, check the list of other Safe packages for Safe Apps at [https://github.com/safe-global/safe-apps-sdk?tab=readme-ov-file#packages](https://github.com/safe-global/safe-apps-sdk?tab=readme-ov-file#packages)
If you integrate any of these packages, DAppscout can use them to automatically connect a wallet to your app.
After integrating the Safe Apps, make sure you have added the \*.blockscout.com domain as an exception to the SDK. Otherwise, we cannot utilize the Safe Apps SDK on our website.
It is not necessary to have the Safe app/smart contracts on a network where your app is deployed. Itβs only necessary to integrate Safe Apps SDK for your application.
### 3) Submit your DApp
To submit your DApp to a marketplace, simply click on the submit DApp button. You will be taken to a form where you will fill out the needed information including contract addresses, description, logo, and links. Once your DApp is submitted, the DAppscout team will reach out with any questions and add your DApp to the marketplace.
# Creating an Instance
Source: https://docs.blockscout.com/using-blockscout/creating-an-instance
Step-by-step guide to configuring an Autoscout explorer instance with chain info, RPC, branding, indexer tuning, and rollup settings.
## Create Instance
Get started at [https://deploy.blockscout.com/](https://deploy.blockscout.com/)
* There are several tabs to fill out to launch your instance: Info, Branding, and Rollup config (if needed). Plugins (currently the only live plugin is stats) can be added once your instance is fully indexed.
* Edit parameters at any time, but this typically requires relaunching and reindexing the instance.
* Check out the visual guide on our blog for a basic walkthrough: [https://www.blog.blockscout.com/ship-faster-with-autoscout-deploy-a-block-explorer-with-status-logs-and-advanced-features/](https://www.blog.blockscout.com/ship-faster-with-autoscout-deploy-a-block-explorer-with-status-logs-and-advanced-features/)
Power users can use the [Autoscout API](/devs/apis/autoscout-api) to deploy and manage instances.
### Info
The following parameters are in the Info section. \* parameters are required.
* **Instance size\***: Select based on the number of transactions anticipated for the instance. The costs are currently placeholders, but your credits will be impacted according to chain usage.
* **Chain name**: The chain name will be shown in the top explorer banner.
* **Instance name\***: A label for your instance, it is reflected in the url of the instance ie [https://instance-name.cloud.blockscout.com/](https://instance-name.cloud.blockscout.com/)
* **Chain ID**: If you don't know the chain ID you can get it with the `eth_chainId` JSON-RPC method.
* **Node type:** Choose from the list of clients for the archive node:
* Besu, Erigon, Anvil, Geth, Parity
* **Gas token symbol**: Will show in the interface, for example ETH if your chain uses Ether for gas.
* **Mainnet or Testnet**: Select the type of chain, if Testnet a label will be added to the instance.
* **This chain is a Rollup**: If selected, another field will appear to select **Arbitrum, Optimism, Polygon zkEVM or zkSync**. You will then fill out additional information in the Rollup Config tab.
* **HTTP RPC URL\***: The **archive node** url ([https://your-rpc-url](https://your-rpc-url)) [***Note: archive node is required for internal transactions and token/coin historical balances. Tracing should be enabled for internal transactions.***](/setup/requirements/node-tracing-json-rpc-requirements)
* **WS URL**: The websocket url (wss\://ws.your-websocket-url)
* **Chain spec URL**: URL to chain specification path json (Sepolia example: [chainspec.json](https://github.com/ethpandaops/ethereum-genesis-generator/blob/v4.1.8/apps/el-gen/sepolia/chainspec.json) or [genesis.json](https://github.com/ethpandaops/ethereum-genesis-generator/blob/v4.1.8/apps/el-gen/sepolia/genesis.json)). You will use the raw JSON file; in the Sepolia example this url is [https://raw.githubusercontent.com/ethpandaops/ethereum-genesis-generator/v4.1.8/apps/el-gen/sepolia/chainspec.json](https://raw.githubusercontent.com/ethpandaops/ethereum-genesis-generator/v4.1.8/apps/el-gen/sepolia/chainspec.json)
* **Custom Domain**: You can use a custom domain for your instance but must configure your DNS and add a DNS `CNAME` record pointing to `autoscout.cname.blockscout.com`
* **Domain redirect(s):** Any additional domain names to redirect to the instance, comma separated.
* **Public RPC URL**: Enables 'add to MetaMask button'. Can be the same as the RPC URL if this is a public node.
* **WalletConnect project ID:** Enables the ability for Read and Write functionality with smart contracts. [Learn more about setting one up here](/setup/configuration-options/walletconnect-project-id-for-contract-read-write).
* **Google Analytics property ID**: Add the ID for your GA account if desired.
### Branding
* **Announcement banner:** Add an optional banner to the top of your instance, can include HTML code.
* **Default color theme**: Choose between a light theme and 3 variations of a darker theme.
* **Default address identicon:** Select from 4 different options for default identicons in your instance.
* **Vertical or Horizontal menu**: Select vertical for a side menu or horizontal for a top menu.
* **Full logo URL**: Add a url link to your full logo image in horizontal format. Supported formats: image/jpeg, image/gif, image/png. Add one for light mode and one for dark mode if desired (users can switch modes manually).
* **Logo sign (square) URL**: Add a url link to your square logo image in horizontal format. Supported formats: image/jpeg, image/gif, image/png. Add one for light mode and one for dark mode if desired (users can switch modes manually).
* **Header background gradient and text color**: Choose your desired background color gradients with the selector and choose your preferred text color. You will see a preview in the interface.
* **Favicon and OG image URL**: Add your favicon and [OG image](https://ogp.me/). OG image specs: Minimum image size is 200Γ20 pixels (recommended: 1200Γ600); maximum supported file size is 8 MB; 2:1 aspect ratio; supported formats: image/jpeg, image/gif, image/png
* **OG description**: Add a description for Open Graph Previews
* **Enable enhanced OG tags**: Toggle if you want to render OG tags for API data pages
* **Enable enhanced SEO**: Toggle if you want to rerender page titles for Stats and Tokens pages to enhance SEO
* **API documentation links**: Toggle to show/hide different API links in the navigation menu
* **Other Navigation links**: Add custom navigation links to the other section of the primary navigation menu
* **Footer links**: Add up to 3 columns along with titles and urls for the links you want added to each column.
* **Ads**: Select providers for Ads on your instance
### Indexer
Indexer information uses the following variables under the hood. If no information is filled in, default variables are used.
| Variable | Default |
| :- | :- |
| `INDEXER_RECEIPTS_BATCH_SIZE` | 250 |
| `INDEXER_RECEIPTS_CONCURRENCY` | 10 |
| `INDEXER_INTERNAL_TRANSACTIONS_BATCH_SIZE` | 10 |
| `INDEXER_INTERNAL_TRANSACTIONS_CONCURRENCY` | 4 |
| `INDEXER_CATCHUP_BLOCKS_BATCH_SIZE` | 10 |
| `INDEXER_CATCHUP_BLOCKS_CONCURRENCY` | 10 |
| `INDEXER_COIN_BALANCES_BATCH_SIZE` | 100 |
| `INDEXER_COIN_BALANCES_CONCURRENCY` | 4 |
| `INDEXER_TOKEN_BALANCES_BATCH_SIZE` | 100 |
| `INDEXER_TOKEN_BALANCES_CONCURRENCY` | 10 |
### Disable pending transactions fetcher
Leave this setting alone if your RPC supports pending transactions. However, **if your RPC node does not support pending transactions, please toggle this switch to disable.**
**Check pending TX support** by sending a request for one of the common methods (`eth_getBlockByNumber` with `"pending"` or `txpool_content`) and observe the response. A successful, valid response confirms support.Β
**Block transformer:** Leave as base unless you are using clique.
[Find additional info variables relevant to indexer setup here](https://docs.blockscout.com/setup/env-variables/backend-env-variables#indexer-management)
### Rollup Config
If your chain is a rollup you will select this in the info screen and then fill out the associated Rollup config info.
* Read the [Rollup deployment and config details](https://docs.blockscout.com/setup/deployment/rollup-deployment#arbitrum)
* [Arbitrum](/setup/env-variables/backend-envs-chain-specific#arbitrum-management) ENV variables
* [Optimism](/setup/env-variables/backend-envs-chain-specific#optimism-rollup-management) ENV variables
* [Polygon zkEVM](https://docs.blockscout.com/setup/env-variables/backend-envs-chain-specific#polygon-zkevm-rollup-management) ENV variables
* [zkSync](https://docs.blockscout.com/setup/env-variables/backend-envs-chain-specific#zksync-rollup-management) ENV variables
## FAQ
There could be several reasons for this. Your RPC may not be an archive node and [tracing](/setup/requirements/node-tracing-json-rpc-requirements) may not be turned on for that node. Once you switch to an RPC with tracing enabled internal transactions will still not be indexed until you spin up a new instance. In this case you will need to shut down your instance and create a new one.
Yes, there is but it requires an API key to use. It can be useful if you are spinning up many instances or need to check on many instances at the same time. Contact us in Discord #autoscout channel to request an API key. See the API Swagger Docs for more info: [https://blockscout.github.io/swaggers/services/autoscout/main/index.html](https://blockscout.github.io/swaggers/services/autoscout/main/index.html)
These are the fields you need to fill out in Cloudflare:
* **Type:** CNAME
* **Name:** your-explorer-name (instance name)
* **Content:** autoscout.cname.blockscout.com
* **Proxy status:** DNS only
* **TTL:** Auto
Make sure to set your Custom domain in the Autoscout interface.
You will receive several automated emails when your Autoscout credits/funds are running out. They are sent according to the following schedule:
| **Days before running out of funds** | **Automated email** |
| :- | :- |
| 5 days | Initial email |
| 3 days | Reminder email |
| 1 day | Final reminder |
Updating is easy! Simply **restart** your instance and it is automatically updated to the latest version.
Check out our [Autoscout blog post](https://www.blog.blockscout.com/ship-faster-with-autoscout-deploy-a-block-explorer-with-status-logs-and-advanced-features/) for more info on reading logs and viewing status updates.
# Multisend
Source: https://docs.blockscout.com/using-blockscout/essential-dapps/multisend
Use the Blockscout Multisend Essential Dapp to batch-send ERC-20 tokens to many addresses from a CSV list for airdrops and payroll.
Multisend lets you send ERC20 tokens to multiple addresses at once rather than sending transactions one by one. With just a few clicks, you can create and send bulk transactions automatically, saving significant time and automating the process. Private keys and account information stay secure.
Multisend is useful when distributing tokens to many addresses, for example in an airdrop to a lot of recipients or payroll where you are sending many of the same ERC20 tokens to different addresses.
## Get Started
1. **Connect your wallet** to Blockscout (if needed)
2. **Find the Multisend app** in the Essential Dapps Menu
3. Click on the token field and **select the token** you want to send.
4. **Specify a list of addresses and amounts in CSV format** (for example `0x5c36bd76a6c138187c43da92f66f37e23b4017fa,12`) with 1 address and amount per line. You can upload a .csv file and the box will auto-populate. *Click the 'Show Sample CSV' button to see the formatted example.*
.eth names are not currently supported, please use full 0x addresses.
5. **Click Proceed** to go to the next step, Validation.
6. In the **Validation** step you will see the amount approved (0 at the moment), the total tokens to be sent, the total number of tokens in the wallet, and the total amount of ETH in the wallet. You will also see the list of recipients and allocations for each address.
Scroll down to see the approval options. You can either approve the exact token amount for this multisend (recommended) or click unlimited approval. With unlimited you will not need to approve sending for future transactions *(this grants unlimited privileges to the app, which can be a security risk).*
Click **Approve** and confirm in your wallet.
7. Once you have approved the app to send tokens, you will see the approval transaction in the app. Click **Continue** to go to the third step where you will complete the transaction(s).
8. **View the total estimate**. You will see an overview along with the cost estimate. You can change the value of gas price with the gear icon, but this can cause issues and is not generally recommended. If everything looks good, click Proceed and sign the transaction(s) in your wallet. There may be multiple transactions to sign depending on the number of recipients.
That's it! If you'd like to learn more about Multisender, see the video walkthrough below which goes into more details on the standalone application.
### Multisender video walkthrough
# Revoke
Source: https://docs.blockscout.com/using-blockscout/essential-dapps/revoke
Use the Blockscout Revoke Essential Dapp to review and revoke ERC-20 and NFT token approvals across Ethereum, OP Mainnet, Gnosis, Base, and Ink.
Revoke is currently being updated for inclusion in Essential Dapps. It will be released shortly.
Many applications require you to grant approvals so that their contracts can interact with tokens in your wallet. This can be a security issue if you have granted unlimited or high allowances, or have granted approvals and forgotten about them. If an application is hacked or misused in some way, this can result in funds being quickly drained from your wallet.
The Revoke app lets you manage your approvals from a single interface. Easily check, update, and revoke token allowances you may have granted to different applications.
## Access the App
Revoke can be accessed directly via the Essential Dapps menu or as an app via the Dappscout interface in Blockscout on supported chains.
Revoke supports a subset of chains including Ethereum, OP Mainnet, Gnosis, Base and Ink.
## Check and Revoke
1. Select the chain you want to check.
2. Connect the wallet you want to revoke allowances for.
3. Review any allowances and click the Revoke button for those you want to revoke.
4. Confirm the transaction in your web3 wallet. This does not require any gas or transaction fees.
5. Your permissions will update momentarily.
## **FAQ**
This usually happens when the price information in USD is not available for a particular token. In these cases, the token amount is displayed without an associated USD conversion.
Not yet. We're still working on this functionality, and it will be added in future releases.
Yes, you can use any wallet that **WalletConnect** supports.
It's always a good practice to **limit token approvals** when you're not actively using a dapp, especially on **NFT marketplaces**. This reduces the risk of losing funds due to hacks or exploits and helps mitigate the damage caused by phishing scams.
Revoke is designed to provide valuable insights about your tokens and account. Instead of only allowing you to revoke token approvals, we offer a **comprehensive overview** of spender accounts. This way, you can make informed decisions and better understand **who has access** to your tokens.
## **Roadmap**
1. **Public Tags**
We plan to highlight key information about **approved spender contracts**, ensuring users are aware of **who has access** to their tokens. If an approved spender gets hacked or is flagged as a scam, this information will be added to Blockscout, allowing users to react promptly.
2. **Sorting**
To improve user experience, we're introducing sorting options for approvals. Users will be able to sort approvals by **amount, date, and value at risk**.
3. **Bulk Revoke for Multiple Tokens**
We're working on adding a **multi-token revoke feature** in upcoming releases to speed up the process.
# Swap
Source: https://docs.blockscout.com/using-blockscout/essential-dapps/swap
Swap and bridge tokens across 18 EVM chains directly inside Blockscout using the LI.FI-powered Essential Dapp and earn Merits for activity.
Simple swaps and cross-chain bridging transactions are now available via the dedicated Swap app, powered by [LI.FI](http://li.fi/). All swapping and bridging operations are handled by LI.FIβs smart contracts, and their widget provides a flexible and lightweight interface. Blockscout has integrated the LI.FI widget to create a convenient and user-friendly tool specifically for Blockscout users.
Find Swap now under Essential Dapps on your explorer instance. For example, on Ethereum it is located at [https://eth.blockscout.com/essential-dapps/swap](https://eth.blockscout.com/essential-dapps/swap).
## Swap Features
* **Simple interface for swapping and bridging**. Swap is a convenient, easy-to-use tool for your token management and exchange needs. The clean, straightforward interface is designed for fast and intuitive token exchanges.
* **Flexibility with tokens, chains, and addresses**. Swap currently supports operations on 18 blockchains including **Ethereum, Arbitrum, Base, Polygon, Scroll, zkSync, Optimism, Gnosis, Fuse, Lisk, Unichain, Aurora, Immutable, Soneium, Rootstock, Celo, World Chain, and Ink.** \
\
Swap and bridge operations can be initiated by 1 address and sent to the same address or a different address if desired. If the address receiving a token does not have enough gas tokens to cover fees, a portion of the swap can be converted to automatically cover gas costs.
* **Low integrator fees**. Swap offers low fees (.4%). For example, a \$100 swap incurs a \$0.40 fee.
* **Aggregator fetches the best prices**: The application checks across 32 exchanges and 19 bridges to find the best swap and bridge prices, along with options for different routes if you want faster bridging or prefer to use a specific app or bridge.
* **Li.Fi for consistency and security:** Swap uses Li.Fi under the hood to provide swap and bridging functionality. This audited codebase is used throughout the ecosystem and trusted by many projects to provide safe and secure transfers.
* Earn Merits when using Swap. [See this page](/using-blockscout/merits/earn-merits-when-using-swap) to learn more about earning Merits for using your favorite swap and bridge application.
## Swap Operations
### Connect a wallet
Connect your wallet to Blockscout to access Swap functions.
1. Click connect wallet
2. Choose your preferred wallet and connect
### Swap tokens on the same chain
Swap checks up to 32 exchanges and aggregators to find the best routes.
### Swap and bridge tokens from 1 chain to another
Depending on the token and chain there may be several routes. Check routes for pricing and timing that best suits your needs.
### Swap, bridge and send tokens to another wallet
Swap and bridge from one chain to another. To send to a different wallet, click the wallet icon and enter the wallet address where you are sending funds.
# CSV Exports
Source: https://docs.blockscout.com/using-blockscout/export-to-csv
Download address-level transactions, internal transactions, token transfers, and logs from a Blockscout explorer as CSV files for analysis.
Export to CSV gives users a way to easily download and analyze blockchain data. It is available for tabs on the address page including transactions, internal transactions, tokens, and logs.
Note: simplified CSV exports (transactions and transfers only, with no ability to define time periods) exist in Blockscout releases up to 3.5.1. Enhanced CSV export is available from v3.5.2+
You will find the *Download CSV* button under the list of entities related to the tab.
*Note:* under the *Tokens* tab, the list of token transfers will be exported.
After clicking the button you will be forwarded to a */csv-export* page for a given address and given type of export (transactions, internal-transactions, token-transfers, logs).
It is possible to specify an arbitrary period for the data export. By default, the current period is the previous month. After completing the reCaptcha, the data for the chosen period should be exported.
*Tip*: In order to prevent hitting a 30 secs loading timeout, choose the smallest time period possible for your data needs.
# Merits
Source: https://docs.blockscout.com/using-blockscout/merits
Blockscout Merits are cross-chain digital rewards earned by using the block explorer. Sign up, connect a wallet, and start collecting Merits.
## What are Merits?
To learn details about the program please see our dedicated [Merits announcement blog post](https://blog.blockscout.com/blockscout-merits-rewarding-block-explorer-skills).
* Merits are digital rewards that are collected by interacting with Blockscout and participating in various relevant activities.
* Merits do not exist on any single blockchain, but rather are connected to an Externally Owned Account (`0x` address) via the Blockscout dashboard and your web3 wallet.
* Merits can be earned on any chain where the program is supported, and Merits accumulate to an account across blockchains and rollups.
* Merits are designed to make block exploration more fun and engaging, rewarding learning and regular usage.
* Merits do not have any material value, but in the future may unlock access to new features, merchandise, discounts, and other exclusive opportunities and benefits.
* You must login to Merits on Blockscout to see your balance and claim additional Merits.
* You can view more information about your Merits, the leaderboard and badges in the dedicated Merits hub at [https://merits.blockscout.com/](https://merits.blockscout.com/)
The following information relates to using the Blockscout Merits interface. See our [FAQs](/using-blockscout/merits/faqs) for common questions.
Merits are available on a limited number of Blockscout instances to start:
* [Ethereum Mainnet](https://eth.blockscout.com/)
* [Ethereum Sepolia](https://eth-sepolia.blockscout.com/)
* [Ethereum Holesky](https://eth-holesky.blockscout.com/)
More chains will be added as the program rolls out.
## Sign up for Merits
Sign up to start collecting Merits and participating in the program. You will receive 100 Merits for signing up or 200 Merits if you use a referral link/code. There are several ways to sign up:
* New account referral signup
* New account signup (no referral)
* Existing account signup
### New account referral signup
We recommend using a referral code to sign up as you will receive an additional 100 Merits for a total of 200 Merits. Ask a friend or Blockscout community member (telegram, discord) if you need a code or link.
#### **1) Enter the link you received**
The link will be the instance name followed by `/?ref=XXXXXX` for example [https://eth.blockscout.com/?ref=9V4NUJ](https://eth.blockscout.com/?ref=9V4NUJ)
*Note: if you only have a code and not a link you will enter the code during step 5 of the sign in flow.*
If starting with a referral link you will be forwarded to this page.
If using a six digit referral code, you will go to the Blockscout instance and click on the Merits button to get started.
#### **2) Connect your wallet (EOA)**
Note that this wallet can be used to collect Merits across chains.
#### 3) **Login to account**
Once you have granted permission to connect your wallet, you can login to your account. When confirming in your web3 wallet be sure to check that the site info and wallet info are correct *(in this example we are using a testnet, so the information will be different depending on the instance you are accessing).*
#### 4) **Add email (optional)**
Add your email to enable account watchlist functionality and receive Merit updates.
#### 5) Join the Merits program
Your code should pre-populate. Click Get started and confirm sign-in via your web3 wallet.
#### 6) Congratulations!
You are now enrolled in the Merits program. You can share your referral link on X, or click Open to view the Merits dashboard.
### New account signup (no referral)
We recommend using a referral code to receive additional Merits, however you can sign up without one if desired. The flow is the same as the referral sign up with a code. The only difference is you do not toggle the I have a referral code button (step 5 above) to proceed.
### Existing Account Signup
If you already have a Blockscout account, you can still use a referral code to sign up for the Merits program. Login to your Blockscout account and paste in the referral link or press the Merits button to start. Follow the process above starting with step 5.
## Navigate the Merits dashboard
1. **Merits balance and claim**: Displays your current balance and claim eligibility. You can claim 10 Merits 1 time per day. This amount resets the following day. The claim button will also send any available referral Merits to your account. Referral Merits are added when someone you refer completes an activity. Referrals are not available for signing up or daily claims.
2. **Referral data**: Shows how many individuals you have referred to the Merits program.
3. **Streak data *\***: Shows how many days in a row you have claimed your daily Merits.
4. **Referral code and link**: Your referral link and code. Share this code with friends and they will receive additional Merits on signup. You will receive a 10% bonus for rewards earned by your referrals for Blockscout activity. More about referrals is in the [FAQ](/using-blockscout/merits/faqs).
5. **Activity tracking *\***: Tracks your activities and earned Merits for these activities.
6. **Contract verification tracking *\***: Tracks your contract verification activity and related Merits rewards.
7. **Badges *\***: Collection of the Blockscout badges you have earned for completing various Blockscout-based campaigns. For more information, see the [Blockscout Badges site](https://badges.blockscout.com/home).
# Activity Pass
Source: https://docs.blockscout.com/using-blockscout/merits/activity-pass
The Blockscout Activity Pass unlocks extra Merits for contract verification, dapp usage, and everyday explorer activity, with weekly ranks.
Read more about the Activity Pass in this [blog post.](https://www.blog.blockscout.com/earn-rewards-for-block-explorer-routine-activity-pass/)
The Activity Pass opens up new opportunities for Blockscout power users! Activity Pass holders can:
* Earn Merits through various activities such as contract verification, contract interaction, using Blockscout apps like [Revoke](/using-blockscout/essential-dapps/revoke) and [Swap](/using-blockscout/essential-dapps/swap), and just using Blockscout for exploring the chain.
* Compete against other Activity Pass holders for Performance Rank status and benefits
* Access exclusive offers available only to Activity Pass holders.
### How it works
Get an Activity Pass, then regular Blockscout usage earns you extra Merits.
1. Activity passes become available periodically on the [Merits hub](https://merits.blockscout.com/). They are available in the **Spend Merits** tab.
2. Purchase a pass using your Merits.
3. Login to Blockscout with your Merits wallet.
4. Complete various actions on Blockscout. Your Merits will increase weekly based on your activity and other users' activity.
Bonus: Activity Pass holders can mint an exclusive NFT on the [Blockscout Badges site](https://app.gitbook.com/s/-MjSwkv4zokqCUebt-98/).
### Activity Pass Actions
The following actions will earn you additional Merits when you have an Activity Pass. You need to be **logged into Blockscout with your Merits address** and **hold an Activity Pass on that address** to qualify.
1. Regular Blockscout usage. Checking addresses, balances, tokens, etc. All the things you normally do on Blockscout earn you more Merits.
2. Using Blockscout-related apps like [Swap](/using-blockscout/essential-dapps/swap) and [Revoke](/using-blockscout/essential-dapps/revoke).
3. Verifying contracts through the Blockscout UI. [This guide](https://www.blog.blockscout.com/how-to-verify-your-smart-contract-with-the-blockscout-ui/) shows a simple example using hardhat.
4. Interacting with contracts on the Blockscout UI. [Use Read and Write methods directly from Blockscout](https://docs.blockscout.com/devs/verification/interacting-with-smart-contracts) to interact with contracts.
### Amount of Merits Earned
Merit earnings for Activity Pass holders are based on your effort vs other Pass holders! The higher you rank in the activity, the more Merits you receive. Here is the breakdown of **Merits earned per week** for various activities.
* **Blockscout Usage**: Regular usage when logged into Blockscout
* **Contract Verification**: Verifying contracts with the Blockscout UI
* **Interactions**: Swapscout, Revokescout, and Contract Read/Write
| | Blockscout Usage | Contract Verification | Interactions |
| - | - | - | - |
| 90%+ | 200 | 400 | 300 |
| 75%-90% | 160 | 320 | 240 |
| 50%-75% | 120 | 240 | 180 |
| 25%-50% | 80 | 160 | 120 |
| 5%-25% | 40 | 80 | 60 |
| \<5% | 10 | 20 | 15 |
### FAQs
An Activity Pass is an add-on that allows you to earn additional Merits when using Blockscout.
Activity Passes are available in limited batches via the Merits website. Check back regularly and follow [Blockscout on X ](https://x.com/blockscout) to be informed of new Activity Pass drops.
You can find the full list of Blockscout Explorers eligible for earning Merits by clicking the βEarnβ button on an activity card. At the beginning of the program the following instances are supported:
1. Ethereum Sepolia
2. Ethereum mainnet
3. Gnosis Chiado
4. Gnosis mainnet
5. Ink mainnet
6. Soneium mainnet
Click the βEarnβ button to see the list of Blockscout Explorers where you can earn Merits just by using them. You can also check our documentation for details on specific activities that grant Merits.
Activity Pass Merits are automatically distributed to your account on a **weekly basis.**
Every Monday, all earned Merits are automatically distributed. At the start of each new week, Performance Ranks and previously earned Merits are reset. New week, new achievements!
Performance Rank is your position among all users with Activity Passes who are earning Merits. A higher rank means you are among the top users who have earned the most Merits. The higher your Performance Rank, the more Merits you receive.
Different Performance Ranks result in different amounts of Merits received on a weekly basis. Completing different activities will also earn you different Merit amounts.
***Note: The Merits distribution per Performance Rank may change based on program participation, please stay tuned!***
# Badges
Source: https://docs.blockscout.com/using-blockscout/merits/badges
Earn and mint Blockscout Scout Badge NFTs on Base by joining Blockscout campaigns, with Common to Legendary rarity tiers for participants.
Access the Blockscout badges site at [https://badges.blockscout.com](https://badges.blockscout.com/home)
### What are Blockscout Badges?
Blockscout Badges are digital rewards (NFTs) that you can earn by participating in Blockscout community activities and campaigns.
### What makes each badge special?
Each badge collection has four rarity levels:
* Common
* Rare
* Super Rare
* Legendary
When you mint a badge, you'll randomly receive one of these rarity levels β like opening a mystery box!
### How do I get a badge?
1. Connect your crypto wallet to the Base network
2. Choose the badge collection you want
3. Click 'Mint' if you're eligible
4. Important: Use the same wallet address you used during the campaign, as this proves your eligibility
After minting, you can see your badge by looking up your wallet address on the [Base Blockscout Explorer.](https://base.blockscout.com/)
### Why can't I get a badge?
Each badge is only available to people who participated in specific campaigns during certain time periods. Don't worry though β Blockscout regularly launches new campaigns! Follow our social media to catch the next one.
### Can I trade or sell my badges?
Yes! You can move your badges to different wallets or sell them on NFT marketplaces.
### How many badges can I get?
You can get one badge per campaign you participate in. Collections typically have a limited number of badges available.
### What can I do with my badge?
Right now, your badge shows that you participated in a Blockscout activity. In the future, badges might give you special access to:
* Events
* Exclusive merchandise
* Other special benefits
### Having problems?
Join the [Blockscout badges Discord channel](https://discord.gg/blockscout) for help with any issues.
# Earn Merits when using Swap
Source: https://docs.blockscout.com/using-blockscout/merits/earn-merits-when-using-swap
Earn daily Blockscout Merits by swapping and bridging tokens with Swapscout, distributed automatically based on your fees and daily volume.
### Swap & Merits
Swap allows you to swap assets and bridge assets with a convenient, intuitive interface. In addition, users who are signed up to the [Blockscout Merits program](/using-blockscout/merits) will receive Merits for using Swap. Merits are distributed based on several factors:
1. The total 24-hour volume of Swap transfers.
2. The fees generated based on this volume.
3. The total number of unique Swap users within a 24 hour period.
At the end of each 24 hour period (00:00 UTC to 23:59 UTC each day) the number of transactions and fees generated by each unique address are calculated and Merits are distributed automatically.
### Allocation
A set amount of Merits are marked for distribution each day amongst all qualified users. An address receives a percentage of this amount based on the fees their address generates during that period for swaps and bridge transactions. The more fees an address generates, the higher percentage of Merits they receive from the overall allocation.
### Min/Max
* **Minimum**: The minimum amount of Merits distributed to any address that interacts with Swapscout during a 24 hour period is 1% of the total Merits allocation for the day.
* **Maximum**: The maximum amount of Merits distributed to any one address interacting with Swapscout during a 24 hour period is 10% of the total Merits allocation for the day.
### Distribution
Merits are automatically distributed to each account at the end of each day. You can view your current Merits balance by [logging into Merits](/using-blockscout/merits) on a Blockscout instance where the program is active.
# Merits FAQs
Source: https://docs.blockscout.com/using-blockscout/merits/faqs
Frequently asked questions about Blockscout Merits and Scout Badges, including daily claims, referral rewards, streaks, and supported chains.
We will continue adding frequently asked questions to this list. If you have an issue that needs immediate attention, please ask on the [Blockscout Discord](https://discord.gg/blockscout).
### Merits
The blog announcement includes information about the origins of the program, how you can earn Merits, and future directions. [Merits announcement blog post](https://blog.blockscout.com/blockscout-merits-rewarding-block-explorer-skills).
Merits will be rolled out to many Blockscout supported chains in the future. Right now they are available on:
* [Ethereum Mainnet](https://eth.blockscout.com/)
* [Ethereum Sepolia](https://eth-sepolia.blockscout.com/)
* [Ethereum Holesky](https://eth-holesky.blockscout.com/)
Your Merits account is chain agnostic - you can claim Merits and collect referral bonuses on any supported chain.
The daily claim is worth 10 Merits. You can claim one time per day, and the amount resets to 10 Merits at 0:00 UTC each day. To claim, login to the Dashboard and click the claim button.
In your Merits dashboard you will find a referral code and a referral link you can share with your friends. They can follow the link directly or enter the code when signing up to the program for the first time.
You do not receive referral rewards when someone first signs up using your referral code or claims their daily bonus.
However, you will receive rewards (10% of the Merits they earn) for block explorer usage or activities/campaigns they complete. These rewards will accumulate to your account, and you can claim to your account with the claim button in the dashboard.
Activities which earn referral rewards are still in development, and will be listed once they become available.
Learn more in the [Merits announcement blog post](https://blog.blockscout.com/blockscout-merits-rewarding-block-explorer-skills).
Merits are collectible rewards displayed in your Blockscout dashboard. They show your Blockscout adoption, usage, and mastery and promote learning in a gamified way. Right now you don't use them other than to show off your block explorer skills. In the future Merits may unlock access to new features, merchandise, discounts, and other exclusive opportunities and benefits.
Yes you can! Swap users who are signed up to the Merits program receive Merits based on their own usage, total usage (how many users use [Swap](https://swap.blockscout.com/)) and fees. These Merits are automatically distributed to the account each day at 0:00 UTC. See the [Earn Merits when using Swap](/using-blockscout/merits/earn-merits-when-using-swap) page for more information on this distribution.
Streaks are achieved by claiming Merits on consecutive days within a 24 hour span. You can earn additional Merits for longer streaks. Check the [streak rewards](/using-blockscout/merits/streak-rewards) page for more details.
### Badges
Blockscout Badges is a new initiative by the Blockscout Team, designed to celebrate and recognize our community members for their involvement in key campaigns and contributions.
Most Blockscout Badge collections feature four distinct rarity levels, giving users an exciting opportunity to mint a legendary NFT. The rarity tiers include Common, Rare, Super Rare, and Legendary, with each mint offering a randomized chance at unlocking the most coveted level.
Minting a Blockscout NFT is quick and simple. Just connect your preferred wallet and switch to the Base network. Select the NFT collection, and if you are eligible to mint you will be able to click on the βMintβ button. Use the same wallet address you used in the relevant campaign, as your eligibility is tied to that specific address. Once minted, you can view and verify your new Blockscout NFT on the Blockscout Explorer by searching your wallet address and exploring the tokens stored in your wallet.
Participants for each NFT were gathered during the designated campaign period. But donβt worryβBlockscout will be launching more NFTs in future campaigns! Be sure to follow our social channels to stay updated on the next exciting opportunity.
Yes! All Blockscout Badges are transferable, allowing you to move them to new wallets or sell them on secondary markets.
Most collections are limited, with a maximum of one NFT per participant per campaign.
For now your badge is an NFT that proves you completed a certain Blockscout related activity. Show it off with pride! There may be future applications for Blockscout badges like access to events, badge-limited swag or other goodies. Stay tuned for more details.
Please [join our badges discord channel](https://discord.com/invite/blockscout) and we will help troubleshoot your issues or questions.
If you donated to previous Gitcoin rounds for Blockscout in 2023 and 2024 you are eligible for the Gitty Up badge. This includes the following rounds:
* Ethereum Infrastructure: 25 Apr 2023 to 09 May 2023
* Ethereum Infrastructure: 15 Aug 2023 to 29 Aug 2023
* Ethereum Core Infrastructure, Research and Development: 15 Nov 2023 to 29 Nov 2023
* Developer Tooling and Libraries: 23 Apr 2024 to 07 May 2024
* GG21: 7 August to 22 August 2024
* Octant Community Round: 12 September to 27 September 2024
You can check the list of all eligible addresses. [Join our badges discord channel here](https://discord.com/invite/blockscout).
# Leaderboard
Source: https://docs.blockscout.com/using-blockscout/merits/leaderboard
The Blockscout Merits leaderboard on the Merits hub ranks accounts by earned Merits each season, with address search and shared rankings.
The Merits leaderboard is a part of the standalone Merits hub website available at [https://merits.blockscout.com/](https://merits.blockscout.com/)
The Merits leaderboard displays accounts ordered by the number of Merits each account has earned.
* The leaderboard reflects the current season of earnings, and resets when a new season launches.
* Search is only available by the full address, but is not case sensitive.
* Ranking is determined by the number of Merits earned. If addresses share the same number of Merits, they all share the same rank. In this example, all accounts have 352 Merits, and are all ranked 12.
# Streak Rewards
Source: https://docs.blockscout.com/using-blockscout/merits/streak-rewards
Claim Blockscout Merits every day to build a streak and earn bonus rewards every 7 consecutive days, with up to 30 Merits on streak days.
Available at [https://merits.blockscout.com/](https://merits.blockscout.com/) and on the Blockscout Merits dashboard.
Earn additional Merits by visiting and claiming once per day. A day starts at 00:00 UTC and ends at 23:59 UTC.
To maintain a streak, you must make a claim each calendar day. The timing on the claim doesn't matter, it can occur any time between 00:00 UTC and 23:59 UTC.
* Merits must be claimed once per day to maintain a streak. Every day you make a Merits claim, your streak increases by 1.
* If you fail to make a claim on a calendar day, your streak resets to 0.
* Every 7 days of a streak results in an increased Merit reward. This is a single day award which is claimed each 7th day of your streak (7,14,21,28 etc).
* Currently, the highest reward is 20 Merits, for a total of 30 Merits (10 daily claim Merits + 20 streak reward Merits) available to claim on streak reward days.
*See the table below for more details on streak rewards.*
### Streak rewards for daily claims
| Streak | Daily Claim | Reward | Total Merits Claim |
| - | - | - | - |
| 1-6 | 10 | 0 | 10 |
| 7 | 10 | 10 | 20 |
| 8-13 | 10 | 0 | 10 |
| 14 | 10 | 20 | 30 |
| 15-20 | 10 | 0 | 10 |
| 21 | 10 | 20 | 30 |
| 22-27 | 10 | 0 | 10 |
| 28 | 10 | 20 | 30 |
# My Account
Source: https://docs.blockscout.com/using-blockscout/my-account
Sign in to Blockscout My Account to add watchlists, private tags, custom ABIs, verified addresses, and receive email notifications on activity.
The My Account feature provides the ability to watch addresses (and receive email notifications regarding activity), create private tags, add API keys to an account and more.
It does not contain any private key info or allow you to withdraw funds. It is designed as an organization and personalization tool for the block explorer, giving you additional ways to customize the data you want to receive.
You can sign up for an account using either an email or your Github credentials.
The following options are currently available:
* **Watch list:** Watch specific addresses and receive email notifications for transactions.
* **Private Tags**: Private tags for addresses & transactions
* **Public Tags**: Request a public category tag displayed to all Blockscout users. Requests are processed manually.
* **Custom ABI**: Useful for testing & debugging, can be used with verified or unverified contracts.
* **Verified Addresses**: Verifying ownership of a smart contract address allows you to easily update information in Blockscout
* **Sign Out**: Sign out, info kept in local storage for easy sign-in.
Additional future features include an upcoming redesign and multi-chain rollout.
## Get Started
*The following example is created using the [Optimism Blockscout instance](https://optimism.blockscout.com/).*
#### 1) Click the MyAccount Icon
#### 2) Sign in / Create an Account
a. Sign in with your existing email and password
b. Create a new blockscout account with an email/password
c. Sign in with an existing github account
#### 2a) Email and Password
Enter a valid email and password to setup an account. You will receive a validation notice to your email, be sure to check spam filters as it will come from [*noreply@blockscout.com*](mailto:noreply@blockscout.com).
#### 2b) Github
#### 3) View Options
Once logged in, you can view options in the My Account Dropdown or on the activated toolbar.
# API keys
Source: https://docs.blockscout.com/using-blockscout/my-account/api-keys
Blockscout API keys have moved out of My Account. Get a universal Blockscout Pro API key at dev.blockscout.com for your explorer requests.
API Keys are no longer located in the MyAccount section of an individual explorer. You can get a universal API key at [https://dev.blockscout.com/](https://dev.blockscout.com/).
# Custom ABI
Source: https://docs.blockscout.com/using-blockscout/my-account/custom-abi
Add a Custom ABI in Blockscout My Account to debug, test, and use the Write Custom feature on both verified and unverified smart contracts.
The Custom ABI feature is useful for debugging and testing newly deployed smart contracts. This feature can be used with verified or unverified contracts.
Once a custom ABI is added, the user can test methods using the `Write Custom` feature.
## Add Custom ABI
**1) [Login to My Account](/using-blockscout/my-account)** in Blockscout to get started. Once logged in:
1. Go to **Custom ABI** in the My Account menu.
2. Press the **Add Custom ABI** button.
**2)** **Fill in the fields**.
1. **Smart Contract Address**. Enter the correct `0x` address of the deployed contract.
2. **Project Name**. Create a name for your own reference.
3. **Custom ABI**: Copy and paste in the ABI for the contract from your development environment (truffle, hardhat, remix etc) or if the contract is verified you can copy from Blockscout.
4. Press **Create custom ABI**.
**3) Custom ABI added** to the home screen. You can edit or remove current custom ABIs or add additional custom ABIs from here.
## Interact with a Custom ABI
You will need to be logged into My Account to interact with your custom ABIs. Once you've added it, you can visit the contract to interact with the custom ABI.
1. Go to the contract page.
2. You will see a Write custom button.
3. Connect your wallet to interact with the contract.
4. Write to the available methods.
# My Account setup for chain operators
Source: https://docs.blockscout.com/using-blockscout/my-account/for-developers
Developer notes for enabling the My Account feature on a self-hosted Blockscout instance, including env variables and Airtable integration.
Please see [My Account settings in configurations](/setup/configuration-options/my-account-settings) for notes about setting up the proper variables and linking to your airtable.
# Private tags
Source: https://docs.blockscout.com/using-blockscout/my-account/private-tags
Create private address and transaction tags in Blockscout My Account to label wallets, contracts, and transactions for your view only.
Private tags help customize your Blockscout instance to track addresses and transactions that are important to you. You can track specific addresses, either EOAs (Externally Owned Addresses) or smart contracts, as well as group and organize specific transactions.
Use the private tags feature to add your own **address tags** and **transaction tags**. These will be viewable on your instance of Blockscout only.
When logged in, a small grey tag is added with the selected name to any specified addresses or transactions. You can also add emojis π for easy identification.
Use cases might include tags for specific wallet accounts (EOAs) of interest, Gnosis safe multisig wallets to highlight, tags for specific applications, tags for specific transaction types, tokens, NFTs etc.
*The following example is created using the [Optimism Blockscout instance](https://optimism.blockscout.com/).*
To start with private tags, you must first [login to My Account](/using-blockscout/my-account).
### 1) Create a Private Address Tag
1. Go to Private Tags in the My Account user menu. Address tag will be the default option.
2. Press the **Add address tag** button.
**2)** **Fill in the fields**.
1. Address. Double check you are entering the correct address for the chain. Search the address in Blockscout to confirm.
2. Name. Create a name for the tag (35 characters or less). Emojis are a nice way to differentiate and add style and color to tags.
3. Press **Add tag**.
**3) Address tag added** to the Address Tags home screen. You can add additional tags or remove old tags from here.
**4) View tags in Blockscout**. They will appear in grey next to additional tags that may exist for that address.
Note, you must be logged in to My Account to see your private tags.
## 2) Create a Private Transaction Tag
* Go to **Private Tags** in the My Account user menu. Select the **Transaction** tab.
* Press the **Add transaction tag** button.
**2)** **Fill in the fields**.
1. Transaction hash. Double check you are entering the correct tx for the chain. Search the transaction and copy/paste from Blockscout to easily add.
2. Name. Create a name for the tag (35 characters or less). Emojis are a nice way to differentiate and add style and color to tags.
3. Press **Add tag**.
**3) Transaction tag added** to the transaction tags home screen. You can add additional tags or remove old tags from here.
**4) View tags in Blockscout**. They will appear in grey next to additional tags that may exist for that address.
Note, you must be logged in to My Account to see your private tags.
# Public Tags: Request and Report Address Labels
Source: https://docs.blockscout.com/using-blockscout/my-account/public-tags
Request public tags for your project's contracts or report incorrect labels on Blockscout, improving address discoverability and search visibility.
Request a public tag for your project's contracts on the public Blockscout instance. Tags appear in search, help create brand awareness for projects, and make exploration easier.
Once submitted, tags are reviewed and accepted/denied manually by the instance admin. If accepted, the tag is added to the public instance. It is also possible to report incorrect public tags through the public tags section.
*The following example is created using the [Optimism Blockscout instance](https://optimism.blockscout.com/).*
## Request Public Tags
**1) Login to** [**My Account**](/using-blockscout/my-account)
1. Go to **Public tags** in the My Account Menu
2. Press **Request to add public tag**.
**2)** **Fill in the fields**. Fields with \* are required.
* Your name\*
* E-mail\*
* Company name
* Company website
* Select either:
1. I want to add tags for my project
2. I want to report an incorrect public tag
* Public tags\*: 2 tags max, 35 character max per tag, use the ; as a separator
* Smart contract / Address (0x...)\*: Provide the 0x address of the contract. If you have several, press the "+" to add.
* Reason and Description\*: Add any relevant details and include your color preference for the tags. Include any other helpful or clarifying information here.
**3) Public tag request added** to the Public tags home screen. You can edit, request additional tags or delete old tags from here. Public tags are reviewed manually and can take some time in the queue. If your tag request appears in the dashboard it has been successfully submitted and will be reviewed in the order in which it was received.
## View public tags on an address
Approved public tags appear on the address page itself, next to the address name or contract name in the header (see [Address Page](/using-blockscout/overviews/address-page)). If the header shows no tag badge, the address does not have an approved public tag on that instance.
Because a public tag is attached to an address (not to the verified contract name), the two can differ. For example, a verified contract named `DexRouter` may render as `OKX Labs: DexRouter` on transaction and address pages when the underlying address carries an `OKX Labs: DexRouter` public tag. The contract name is unchanged; the tag adds project attribution.
## Query public tags via API
Public tags are exposed in several PRO API responses. Two common patterns:
* **On address and contract responses.** The address details endpoint and the verified smart contracts list both include a `public_tags` array on each address object, with `label`, `display_name`, and `address_hash`. Use these to read the tags already attached to a given address without a separate call. Filtering the verified contracts list *by* public tag is not supported; only the `filter` (language, proxy state) and `q` (search) parameters are available on that endpoint.
* **Via the Metadata service.** `GET /services/metadata/api/v1/public-tag-types` returns the tag types configured on the instance. `GET /services/metadata/api/v1/tags:search` searches tags by `chain_id`, `tag_types` (comma-separated), and `name`, and returns the addresses each tag is attached to. Use the tag-types endpoint first to discover valid `tag_types` values, then search.
See the [PRO API overview](/devs/pro-api) for authentication and base URL details.
# Verified Addresses: Prove Smart Contract Ownership
Source: https://docs.blockscout.com/using-blockscout/my-account/verified-addresses
Verify ownership of a deployed smart contract on Blockscout by signing a message, then manage token info, name tags, and address labels from your account.
Verify ownership of a smart contract address to easily update information in Blockscout. To verify your ownership, a contract must be deployed on the chain and [verified](/devs/verification).
You will sign a single message to verify contract ownership. Once verified, you can update token information, address name tags, and address labels from the Blockscout console.
1\) **Login to My Account in Blockscout** \<[*login instructions*](/using-blockscout/my-account)>.
1. Go to the **Verified addrs** menu item.
2. Click **Add address**.
More info coming soon
# Copy and Sign Message for Address Verification
Source: https://docs.blockscout.com/using-blockscout/my-account/verified-addresses/copy-and-sign-message
Steps for copying and signing the ownership message required to verify a smart contract address on Blockscout using your deployer wallet.
Instructions coming soon
# Watchlist: Email Alerts for Address Activity
Source: https://docs.blockscout.com/using-blockscout/my-account/watchlist
Add EOAs or contracts to your Blockscout watchlist and receive email notifications for native coin, ERC-20, ERC-721, and ERC-1155 token transfers.
*The following example is created using the [Optimism Blockscout instance](https://optimism.blockscout.com/).*
Sign up for email notifications for different actions related to an EOA or contract address. This can include incoming/outgoing transactions for native tokens, ERC-20 tokens or NFTs like ERC-721 and ERC-1155s.
1\) **Log in to My Account in Blockscout** \<[*login instructions*](/using-blockscout/my-account)>. From the Watchlist menu click Add address.
2\) **Fill in information** including:
* **Address**: 0x address of the EOA or contract to watch.
* **Private tag**: For your reference, will be displayed as a private tag for your Blockscout instance when you are logged in (emojis accepted π)
* **Notification types**: Select which types of transactions you would like to receive email notifications for. These include native tokens (in this case ETH), ERC-20 tokens, and NFT tokens.
* **Email Notifications**: Select to receive.
* **Add address**: Click button to add to your watchlist.
3\) A new address along with an info overview will be added to your watchlist dashboard. You can edit info, remove, or add more items.
4\) Click the address to view in the Blockscout console. Watch list addresses show the private tag when logged into My Account.
5\) If selected, you will receive emails based on actions completed by this address.
# Blockscout UI Sections and Page Overviews
Source: https://docs.blockscout.com/using-blockscout/overviews
Navigate Blockscout UI sections including the top menu, blocks, addresses, transactions, and token pages to explore EVM blockchain data effectively.
Blockscout is a full-featured explorer with many uses. A block explorer provides views and insights into various data stored on chain. Depending on the page, section and instance, different types of data are displayed. See below for different views and learn how to navigate blockchain data.
Blockscout offers different informational displays depending on the page, section and instance you are viewing. Learn more about different views and data displays in Blockscout:
* [Top Menu](/using-blockscout/overviews/top-menu)
* [Blocks](/using-blockscout/overviews/blocks)
* [My Account](/using-blockscout/my-account)
# Address Page: EOA Fields, Tabs, and Metrics
Source: https://docs.blockscout.com/using-blockscout/overviews/address-page
Explore the Blockscout address page for EOAs: balance, tokens, transactions, ENS names, tags, watchlist, multichain data, and activity analytics.
# Exploring EOA Addresses on Blockscout
Blockscout provides comprehensive information about Externally Owned Accounts (EOA) on Ethereum and other EVM-compatible blockchains. This guide breaks down the sections of a Blockscout address page using Vitalik Buterin's address (0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045) as an example.
## What is an EOA Address?
An Externally Owned Account (EOA) is a wallet address controlled by a private key, as opposed to a smart contract address. EOAs can initiate transactions, hold ETH and tokens, and interact with smart contracts.
## Section A: Address Header & Identification
### Address Information
| Field | Description | Example | Purpose |
| :- | :- | :- | :- |
| **ENS Name (when applicable)** | Ethereum Name Service domain | vitalik.eth | Human-readable address identifier |
| **Address Hash** | 42-character hexadecimal identifier | 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045 | Unique blockchain address |
| **Copy Button** | Click to copy address | π | Quick clipboard access |
| **QR Code** | Visual representation of address | QR icon | Easy mobile wallet scanning |
| **Star Button** | Add to favorites/watchlist | β | Personal tracking |
| **Public Name Tag** | Community-assigned label | "Vitalik Buterin" | Identity verification |
| **Additional Tags** | Category labels | "EOA", "Gitcoin Grantee" | Classification information |
### Action Buttons
| Button | Description | Function | Use Case |
| :- | :- | :- | :- |
| **40+** | ENS names owned by the address | Open to show other ENS properties | ENS usage |
| **5** | Verify in other environments | Explore address on other explorers | Address credibility & transparency |
| **Tag Menu (β―)** | Add tags | Add public & private tags | Tagging |
## Section B: Navigation Tabs
### Tab Overview
| Tab | Description | Content Type | Purpose |
| :- | :- | :- | :- |
| **Details** | Basic address information | Balance, tokens, statistics | Primary account overview |
| **Transactions 50+** | All blockchain transactions | Incoming/outgoing transfers | Transaction history |
| **Token transfers 50+** | ERC-20/ERC-721 movements | Token-specific activity | Asset tracking |
| **Tokens 50+** | Token holdings | Current token balances | Portfolio overview |
| **Internal txns 50+** | Contract-generated transactions | Smart contract interactions | Advanced activity |
| **Coin balance history** | ETH balance over time | Historical balance data | Balance tracking |
## Section C: Address Details
### Basic Information
| Field | Description | Value Example | Significance |
| :- | :- | :- | :- |
| **Balance** | Current ETH holdings | 4.77725266 ETH (\$16,037.91) | Available funds |
| **Tokens** | Number of different tokens held | >153 (>\$9,680,718.59) | Portfolio diversity |
| **Net worth** | Total portfolio value | >\$9,696,756.50 | Overall wealth |
| **Transactions** | Total transaction count | 73,149 | Activity level |
| **Transfers** | Token transfer count | 282,412 | Token activity |
| **Gas used** | Total gas consumed | 789,854,535 | Network usage |
| **Last balance update** | Most recent activity | Block 22933842 | Freshness indicator |
### Token Holdings Details
| Element | Description | Format | Purpose |
| :- | :- | :- | :- |
| **Token Count** | Number of unique tokens | ">153" | Portfolio size |
| **Total Value** | USD value of all tokens | ">\$9,680,718.59" | Portfolio worth |
| **Dropdown Arrow** | Expand token list | βΌ | View individual tokens |
| **Multichain Badge** | Cross-chain presence | "Multichain" with icons | Multi-network activity |
## Section D: Advanced Features
### Special Indicators
| Feature | Description | Appearance | Meaning |
| :- | :- | :- | :- |
| **ENS Integration** | Domain name display | "vitalik.eth" | Verified identity |
| **Verified Status** | Authentication markers | Checkmarks/badges | Trusted account |
| **Multichain Data** | Cross-network presence | Chain icons | View Multi-blockchain activity |
| **Gas Optimization** | Efficiency suggestions | "Save 32% with GasHawk" | Cost reduction tips |
### Action Capabilities
| Action | Description | Access Method | Result |
| :- | :- | :- | :- |
| **Copy Address** | Copy to clipboard | Copy button | Address in clipboard |
| **View QR Code** | Generate QR code | QR button | Mobile-friendly display |
| **Add to Watchlist** | Personal tracking | Star button | Monitoring setup |
| **Share Address** | Social sharing | Share options | Public distribution |
## Section E: Activity Analysis
### Understanding Address Metrics
| Metric Range | Activity Level | Interpretation | Example |
| :- | :- | :- | :- |
| **0-100 transactions** | Light user | Occasional activity | Personal wallet |
| **100-1,000 transactions** | Regular user | Consistent activity | Active trader |
| **1,000-10,000 transactions** | Heavy user | High activity | Power user |
| **10,000+ transactions** | Power user | Very high activity | Vitalik (73,149) |
### Token Holdings Analysis
| Token Count | Portfolio Type | Risk Level | Example |
| :- | :- | :- | :- |
| **1-10 tokens** | Conservative | Low | Basic portfolio |
| **10-50 tokens** | Moderate | Medium | Diversified investor |
| **50-100 tokens** | Aggressive | High | DeFi enthusiast |
| **100+ tokens** | Experimental | Very High | Vitalik (153+) |
### Net Worth Categories
| Value Range | Wealth Level | Classification | Significance |
| :- | :- | :- | :- |
| **\<\$1,000** | Small holder | Retail investor | Learning/testing |
| **\$1,000-\$10,000** | Medium holder | Active investor | Serious participation |
| **\$10,000-\$100,000** | Large holder | Significant investor | Substantial commitment |
| **\$100,000+** | Whale | Major investor | Market influence |
**Note:** This guide is based on Vitalik Buterin's address (0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045) as viewed on Blockscout. Address information and values are subject to change as blockchain activity continues.
# Beacon Chain Withdrawal Views in Blockscout
Source: https://docs.blockscout.com/using-blockscout/overviews/beacon-chain-withdrawal-views
See how Blockscout displays Ethereum beacon chain validator withdrawals on block and address pages, including index, validator index, amount, and recipient.
Withdrawals are akin to simple transactions (though they are actually 0 gas balance increases) included in the block structure. Coins are transferred from a validator to a preset withdrawal address (either EOA or contract). Each withdrawal also includes a unique integer index starting from 0 and incrementing by 1 with each withdrawal.
The unique `index`, assigned `validatorIndex`, withdrawal receiving `address`, and `amount` are all included in the withdrawals structure and are displayed on Blockscout on the block and addresses pages.
```json theme={null}
"withdrawals": [
{
"index": "0xbd8d0",
"validatorIndex": "0x81e",
"address": "0xe7c180eada8f60d63e9671867b2e0ca2649207a8",
"amount": "0x6dcf0a644000"
},
{
"index": "0xbd8d1",
"validatorIndex": "0x81f",
"address": "0xe7c180eada8f60d63e9671867b2e0ca2649207a8",
"amount": "0x6dcf0a644000"
},
],
```
```json theme={null}
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"baseFeePerGas": "0x7",
"difficulty": "0x0",
"extraData": "0x",
"gasLimit": "0x1c9c380",
"gasUsed": "0x0",
"hash": "0x5262de0c24b0cab3fdc32fadda1904f4698ab0b12d505bf733cf47cb3e60f7f7",
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"miner": "0xf97e180c050e5ab072211ad2c213eb5aee4df134",
"mixHash": "0x08471cc3dbac65574f049af479631af782cf31c841710640ed615dc50670b378",
"nonce": "0x0000000000000000",
"number": "0xd62f",
"parentHash": "0xdabf9e7ebfad879ad44270c2a7a5ff8e848e72316def4d5b0305f2a1216089f7",
"receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"size": "0x465",
"stateRoot": "0x9f2a690353b6d8cfa75cb12347104f42d38463471cda1293696a6c3b685aa839",
"timestamp": "0x63af29e4",
"totalDifficulty": "0x1",
"transactions": [],
"transactionsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
"uncles": [],
"withdrawals": [
{
"index": "0xbd8d0",
"validatorIndex": "0x81e",
"address": "0xe7c180eada8f60d63e9671867b2e0ca2649207a8",
"amount": "0x6dcf0a644000"
},
{
"index": "0xbd8d1",
"validatorIndex": "0x81f",
"address": "0xe7c180eada8f60d63e9671867b2e0ca2649207a8",
"amount": "0x6dcf0a644000"
},
{
"index": "0xbd8d2",
"validatorIndex": "0x820",
"address": "0xe7c180eada8f60d63e9671867b2e0ca2649207a8",
"amount": "0x6dcf0a644000"
},
{
"index": "0xbd8d3",
"validatorIndex": "0x821",
"address": "0xe7c180eada8f60d63e9671867b2e0ca2649207a8",
"amount": "0x6dcf0a644000"
},
{
"index": "0xbd8d4",
"validatorIndex": "0x822",
"address": "0xe7c180eada8f60d63e9671867b2e0ca2649207a8",
"amount": "0x6dcf0a644000"
},
{
"index": "0xbd8d5",
"validatorIndex": "0x823",
"address": "0xe7c180eada8f60d63e9671867b2e0ca2649207a8",
"amount": "0x6dcf0a644000"
},
{
"index": "0xbd8d6",
"validatorIndex": "0x824",
"address": "0xe7c180eada8f60d63e9671867b2e0ca2649207a8",
"amount": "0x651c03f6de00"
},
{
"index": "0xbd8d7",
"validatorIndex": "0x825",
"address": "0xe7c180eada8f60d63e9671867b2e0ca2649207a8",
"amount": "0x6dcf0a644000"
},
{
"index": "0xbd8d8",
"validatorIndex": "0x826",
"address": "0xe7c180eada8f60d63e9671867b2e0ca2649207a8",
"amount": "0x6dcf0a644000"
},
{
"index": "0xbd8d9",
"validatorIndex": "0x827",
"address": "0xe7c180eada8f60d63e9671867b2e0ca2649207a8",
"amount": "0x6dcf0a644000"
},
{
"index": "0xbd8da",
"validatorIndex": "0x828",
"address": "0xe7c180eada8f60d63e9671867b2e0ca2649207a8",
"amount": "0x1a2950b4af800"
},
{
"index": "0xbd8db",
"validatorIndex": "0x829",
"address": "0xe7c180eada8f60d63e9671867b2e0ca2649207a8",
"amount": "0x6dcf0a644000"
},
{
"index": "0xbd8dc",
"validatorIndex": "0x82a",
"address": "0xe7c180eada8f60d63e9671867b2e0ca2649207a8",
"amount": "0x6dcf0a644000"
},
{
"index": "0xbd8dd",
"validatorIndex": "0x82b",
"address": "0xe7c180eada8f60d63e9671867b2e0ca2649207a8",
"amount": "0x6dcf0a644000"
},
{
"index": "0xbd8de",
"validatorIndex": "0x82c",
"address": "0xe7c180eada8f60d63e9671867b2e0ca2649207a8",
"amount": "0x6dcf0a644000"
},
{
"index": "0xbd8df",
"validatorIndex": "0x82d",
"address": "0xe7c180eada8f60d63e9671867b2e0ca2649207a8",
"amount": "0x6dcf0a644000"
}
],
"withdrawalsRoot": "0xb28f757020474ee478a03be8ca4a2efaa7ebddbf565129bb08202ce9a8670d44"
}
}
```
## UI display examples
### Block page example
### Address page example
# Blocks Page: Block Height, Gas, and Rewards
Source: https://docs.blockscout.com/using-blockscout/overviews/blocks
Understand Blockscout block views including block height, timestamp, gas used, validator rewards, burnt fees, base fee, and included transactions.
Blocks update on the homepage as they are created with basic information including block number (block height), number of transactions in the block, and time since the block was created.
Click on a specific block number for information about that block, or **View All Blocks** for a more detailed overview of recent blocks.
The all blocks page can also be accessed from the top menu.
Blockscout displays are configurable and may show different information depending on the instance and/or consensus method. These examples use a V1 instance of the UI. **V2 views are in process.**
## View All Blocks
The view all blocks page shows updated details from the most recent blocks. Use the page arrows to navigate.
#### Details by line
1. Number of transactions in the block / size of block in bytes / time since block was created.
2. Validator appending the block to the chain (fee recipient).
3. Reward to validator (in ETH). Equals the amount of priority fees sent by users to include transactions in the block.
4. Same as (3).
5. Portion of tx fee (in ETH) burned due to EIP-1559. Amount burned = `baseFeePerGas * gasUsed`
6. Block Gas limit. On Ethereum this is 30M gas: 2x the target size of 15M.
7. Amount of gas used in the block (amount and % of block space used). The blue line visualizes the %.
## Individual Block Page
Click on a block number (this number, also referred to as block height, indicates how many blocks have been added to the chain) to view additional details about the block. Scroll down to view individual transactions contained in a block.
Click on the tooltip (i) next to each item to view relevant info.
1. **Block Height**: Also known as block number, shows the position of the block on the chain.
2. **Timestamp**: Time & date the block was produced.
3. **Transactions**: Number of transactions included in the block.
4. **Fee Recipient**: Address of the validator (block producer) that received priority fees. Copy the address with the blue icon and paste into search to find more details about this validator.
5. **Size**: Size of the data contained in the block in bytes.
6. **Hash**: Cryptographic hash of the block header.
7. **Parent Hash**: Hash of the preceding block.
8. **Difficulty**: *NA for PoS.* Work required to mine a block in PoW.
9. **Total Difficulty**: *NA for PoS.* Total difficulty to mine the chain up until this block.
10. **Gas Used**: Total amount of gas used in the block & % of filled space.
11. **Gas Limit**: Total gas limit for the block. 30M is Ethereum limit, which represents 2x the 15M target.
12. **Nonce**: *N/A for PoS*. Demonstrates work in PoW.
13. **Base Fee per Gas**: Minimum multiplier required for a transaction to be included in a block.
14. **Burnt Fees**: Amount of ETH burned in the block.
15. **Priority Fee/Tip**: Total tips for transactions included in the block.
16. **Miner Reward**: Amount received by fee recipient in PoS. Matches (15).
Scroll below the block details to view transactions contained within the block.
# Block Explorer Glossary of Terms
Source: https://docs.blockscout.com/using-blockscout/overviews/glossary-of-terms
Definitions of common block explorer terms used in Blockscout including address, block, gas, hash, nonce, validator, token, transaction, and wallet.
Under Construction
## Block Explorer Glossary
**Address**: A unique identifier for a wallet or smart contract on the blockchain.
**Block**: A group of transactions that have been verified and added to the blockchain.
**Block Height**: The number of blocks in the chain between any given block and the first block (genesis block).
**Contract**: Also known as a smart contract, it's a self-executing program stored on the blockchain.
**Gas**: The unit of measure for the computational work required to execute transactions or smart contracts on Ethereum.
**Gas Price**: The amount of cryptocurrency you're willing to pay per unit of gas for a transaction.
**Hash**: A unique fixed-length string of characters that represents data. In blockchain, it's used to identify blocks and transactions.
**Miner/Validator**: Entities that verify and add new transactions to the blockchain.
**Nonce**: A number used once, typically to verify the uniqueness of transactions.
**Pending Transaction**: A transaction that has been broadcast to the network but not yet included in a block.
**Token**: A type of cryptocurrency that represents a tradable asset or utility and is often built on top of an existing blockchain.
**Transaction**: The transfer of cryptocurrency or data between addresses on the blockchain.
**Transaction Fee**: The cost to process a transaction on the blockchain, typically paid to the chain miners or validators.
**Wallet**: A tool that allows users to store, send, and receive cryptocurrency.
*Note: Specific terms may vary slightly depending on the blockchain network and the block explorer being used.*
# Token Info Sources: CoinGecko and Verified Owners
Source: https://docs.blockscout.com/using-blockscout/overviews/token-info
Learn where Blockscout token metadata comes from, how CoinGecko and manual owner submissions work, and how to fix incorrect token details.
Note that 3rd party users submit information for a token to the explorer. Please do your own research and check the contract thoroughly before interaction.
### Where does Blockscout get token info (name, logo, description, links)?
Blockscout pulls token metadata from two sources:
1. **Automated aggregators:** Blockscout queries CoinGecko and CoinMarketCap for exchange rate and market data. Projects submit token info directly to CoinGecko, which requires a Public Verification Post from an account tied to the project's official channels before reviewing listing or update requests. Blockscout displays what CoinGecko returns.
2. **Manual Submission:** A Blockscout account is required to verify contract ownership. An account holder signs a message and can then submit information for a verified token contract (message must be signed by the same wallet that deployed the contract on chain). Token information is reviewed by Blockscout admins before it is added to the explorer page. Once verified, a user can submit additional information or update details. This means information can change later, so it is important to verify project information independently whenever interacting with a token contract.
Additional info on [adding token details and processing is available here.](/using-blockscout/token-info)
### Does Blockscout require contract verification before updating token info?
Yes, Blockscout requires the token's contract source code to be verified before it will accept owner-submitted updates to name, logo, website, or socials. This ensures the code shown publicly matches what's actually deployed, and that only the real contract owner can update the listing.
Blockscout's **Verified Addresses** feature:
1. [Verify the contract's source code](/devs/verification).
2. [Sign in to My Account](/using-blockscout/my-account) and prove ownership of the address, either by signing a message from the contract's owner wallet or via multisig signer verification.
3. Once ownership is verified, the address is listed under Verified Addresses in the account, and the owner can update token info directly without re-verifying each time.
### What should a project do if their token info is wrong on Blockscout?
* **If the token is tracked on CoinGecko: submit the correction directly to CoinGecko.** Blockscout will reflect it automatically once CoinGecko's data updates.
* If the token isn't on CoinGecko, or the fix is logo/description/links: Update through the Blockscout interface.
* To update on Blockscout, log in to your account, go to Update token info, and follow the prompts.
# Main Menu: Network, Blockchain, and API Navigation
Source: https://docs.blockscout.com/using-blockscout/overviews/top-menu
Overview of Blockscout v2 UI top menu items including network switcher, blockchain data (transactions, blocks, batches, L1/L2), and API access.
## V2 UI
*The following views are taken from the* [*Optimism Blockscout instance*](https://optimism.blockscout.com/)*.*
### Network Menu
Shows available Mainnet and Testnets.
### Blockchain Menu
Access transactions, blocks, batches and L1 \<-> L2 data.
### API Menu
Access API information including the REST API which serves the v2 UI.
# Transaction Fields Reference: Hash, Gas, Logs, State
Source: https://docs.blockscout.com/using-blockscout/overviews/transaction-fields
Reference guide to Blockscout transaction page fields including hash, status, gas, nonce, input data, token transfers, event logs, and state changes.
# Blockscout Transaction Fields Reference Guide
Example transaction on Ethereum
## Transaction Summary (Header)
| Field | Description | Format/Example | Purpose |
| :- | :- | :- | :- |
| **Transaction Summary** | Quick overview of transaction action | "β‘ Transfer 0.0019 ETH to 0x1e...2988" | Instant understanding of what happened |
| **Transaction Icon** | Visual indicator of transaction type | Lightning bolt (β‘) for transfers | Quick visual identification |
| **Amount Display** | Primary value being transferred | "0.0019 ETH" | Main transaction amount |
| **Recipient Address** | Shortened destination address | "0x1e...2988" with copy button | Quick recipient identification |
| **View Counter** | Number of times transaction was viewed | "π 8" | Shows transaction popularity/interest |
## Transaction Overview Fields
| Field | Description | Format/Example | Purpose |
| :- | :- | :- | :- |
| **Transaction Hash** | Unique identifier for this specific transaction | 66-character hex string starting with "0x" | Transaction's "receipt number" for tracking and reference |
| **Status and Method** | Current state and transaction type | β Success | Shows whether transaction completed successfully |
| **Block** | Block number and confirmations | 22933572 | Show BlockNumber |
| **Timestamp** | When transaction was mined with confirmation time | π 8m ago | Reflects timestamp: Jul 16 2025 12:33:59 PM (-06:00 UTC) |
| **Sponsored** | Advertisement or sponsored content section | Ad banner with "Advertise to" message | Supports open source block explorer |
| **From** | Sender address with label | "π΄ Huobi: Deposit Funder 7" with copy button | Identified sender (exchange, contract, etc.) |
| **To** | Recipient address | "π‘ 0x1ec7cB3FE99bD07E6faBa7D296857bCC102988" with copy button | Destination address |
## Blockscout-UI Features
| Feature | Description | Location | Purpose |
| :- | :- | :- | :- |
| **Transaction Summary Line** | Quick overview with icon and key details | Top of page | Instant understanding of transaction |
| **View Counter** | Shows transaction popularity | Next to summary | Community interest indicator |
| **Address Labels** | Known entity identification | From/To fields | Better context than raw addresses |
| **Sponsored Content** | Advertisement section | Middle of details | Revenue for block explorer |
| **Copy Buttons** | Quick copy functionality | Next to addresses/hashes | User convenience |
| **Tabbed Navigation** | Organized information sections | Below summary | Easy access to different data types |
| **Color-Coded Status** | Visual status indicators | Status field | Quick success/failure identification |
| **Confirmation Speed** | Time to confirmation | Timestamp field | Network performance insight |
## Navigation Tabs
| Tab | Description | Contents | Purpose |
| :- | :- | :- | :- |
| **Details** | Main transaction information | Hash, status, block, addresses, gas, value | Primary transaction data |
| **Token transfers** | ERC token movements | Token name, amount, from/to addresses | Track token transfers separate from ETH |
| **User operations** | Account abstraction operations | User operation details for AA wallets | Advanced wallet interactions |
| **Internal txns** | Internal transactions | Contract-to-contract calls | See all sub-transactions |
| **Logs** | Event logs from contracts | Contract events and their data | Smart contract activity |
| **State** | State changes | Storage and balance modifications | What changed on the blockchain |
| **Raw trace** | Complete execution trace | Step-by-step execution details | Debug and analysis |
## Visual Elements and Icons
| Element | Description | Meaning | Context |
| :- | :- | :- | :- |
| **β‘ Lightning Icon** | Transaction type indicator | Fast/standard transaction | Used in transaction summary |
| **π΄ Red Circle** | Address label indicator | Exchange or known entity | Huobi exchange identifier |
| **π‘ Yellow Circle** | Address label indicator | Contract or user wallet | Regular address marker |
| **β Green Checkmark** | Success status | Transaction completed successfully | Status indicator |
| **π Eye Icon** | View counter | Number of page views | Popularity metric |
| **π Copy Button** | Copy to clipboard | Click to copy address/hash | User convenience |
| **π Clock Icon** | Timestamp indicator | Time-related information | Timing reference |
## Transaction Details Fields
| Field | Description | Format/Example | Purpose |
| :- | :- | :- | :- |
| **From Address** | Wallet address that initiated the transaction | Labeled address with copy button | Identifies the sender with context |
| **To Address** | Destination address for the transaction | Labeled address with copy button | Identifies recipient with context |
| **Value** | Amount of native currency (ETH) transferred | ETH amount with USD equivalent | Shows direct ETH transfer (separate from token transfers) |
| **Transaction Fee** | Total cost paid to miners/validators | ETH amount with USD equivalent | Total processing cost |
| **Nonce** | Sequential counter for transactions from sending address | Number (e.g., 1,247) | Prevents replay attacks and ensures ordering |
## Gas Information Fields
| Field | Description | Format/Example | Purpose |
| :- | :- | :- | :- |
| **Gas Limit** | Maximum gas the sender was willing to pay | Number (e.g., 21,000) | Upper bound on computational work |
| **Gas Used** | Actual gas consumed by the transaction | Number with percentage (e.g., 21,000 (100%)) | Actual computational work performed |
| **Gas Price** | Price per unit of gas | Gwei amount (e.g., 20.5 Gwei) | Cost per unit of computation |
| **Max Fee Per Gas** | Maximum fee willing to pay per gas unit (Type 2) | Gwei amount (e.g., 25 Gwei) | EIP-1559 fee mechanism for predictable fees |
| **Max Priority Fee** | Maximum tip willing to pay to miners (Type 2) | Gwei amount (e.g., 2 Gwei) | Incentivizes miners to include transaction quickly |
| **Base Fee Per Gas** | Network's base fee at transaction time (Type 2) | Gwei amount (e.g., 18.5 Gwei) | Burned portion of fee (not given to miners) |
## Transaction Type Fields
| Field | Description | Format/Example | Purpose |
| :- | :- | :- | :- |
| **Transaction Type** | EIP standard used for this transaction | Type 0, Type 1, Type 2 | Indicates fee mechanism and features |
| **Type 0** | Legacy transactions | Standard format | Original transaction format |
| **Type 1** | EIP-2930 (Access List) | With access list | Gas optimization for contract interactions |
| **Type 2** | EIP-1559 (Dynamic Fee) | With base fee and priority fee | More predictable fee mechanism |
| Type 3 | EIP-4844 (Blobs) | Blob carrying transaction | Accommodate batched data |
## Input Data Fields
| Field | Description | Format/Example | Purpose |
| :- | :- | :- | :- |
| **Input Data** | Data payload sent with transaction | Hexadecimal string | Contains function calls and parameters |
| **Method ID** | First 4 bytes identifying contract function | 4-byte hex (e.g., 0xa9059cbb) | Identifies which contract function was called |
| **Input Data (Hex)** | Raw hexadecimal data | 0x followed by hex characters | Raw transaction data |
| **Input Data (UTF-8)** | Human-readable text format | Plain text (when applicable) | Readable version of data |
| **Input Data (Decoded)** | Function calls with parameter names | Function name and parameters | User-friendly view of contract interactions |
## Token Transfer Fields
| Field | Description | Format/Example | Purpose |
| :- | :- | :- | :- |
| **Token Name** | Name of the transferred token | Text (e.g., "USD Coin") | Identifies the token being transferred |
| **Token Symbol** | Token's ticker symbol | Text (e.g., "USDC") | Short identifier for the token |
| **Token Amount** | Quantity of tokens transferred | Number with decimals | Amount being moved |
| **Token Type** | Standard used for the token | ERC-20, ERC-721, ERC-1155 | Indicates token functionality |
| **From Address** | Token sender address | 42-character hex string | Who sent the tokens |
| **To Address** | Token recipient address | 42-character hex string | Who received the tokens |
| **Token Contract** | Address of the token's smart contract | 42-character hex string | Contract managing this token |
## Event Logs Fields
| Field | Description | Format/Example | Purpose |
| :- | :- | :- | :- |
| **Log Index** | Sequential numbering of events | Number (e.g., 0, 1, 2) | Order of events within transaction |
| **Contract Address** | Address that emitted the event | 42-character hex string | Source of the event |
| **Event Name** | Name of the emitted event | Text (e.g., "Transfer") | Type of event that occurred |
| **Topics** | Indexed event parameters | Array of hex strings | Searchable event data |
| **Data** | Non-indexed event data | Hex string | Additional event information |
| **Decoded Logs** | Human-readable event information | Structured data | User-friendly view of events |
## State Changes Fields
| Field | Description | Format/Example | Purpose |
| :- | :- | :- | :- |
| **Address** | Account that changed | 42-character hex string | Which account was modified |
| **Storage Changes** | Before and after values | Hex values | What data changed in storage |
| **Balance Changes** | ETH balance modifications | ETH amounts | How balances changed |
| **Nonce Changes** | Account nonce updates | Number changes | Transaction counter updates |
## Status Indicators
| Status | Visual Indicator | Meaning | Next Steps |
| :- | :- | :- | :- |
| **Success** | Green checkmark | Transaction completed successfully | Transaction is final |
| **Failed** | Red X | Transaction failed during execution | Check revert reason, retry if needed |
| **Pending** | Orange clock | Transaction waiting to be mined | Wait for confirmation or increase gas |
| **Dropped** | Gray indicator | Transaction removed from mempool | Resubmit with higher gas price |
## Additional Information Fields
| Field | Description | Format/Example | Purpose |
| :- | :- | :- | :- |
| **Block Hash** | Unique identifier for the block | 66-character hex string | Reference to containing block |
| **Block Timestamp** | When the block was mined | UTC timestamp | Block creation time |
| **Transaction Receipt** | Proof of transaction processing | JSON data | Technical execution details |
| **Raw Transaction** | Complete transaction data | JSON format | Developer-level transaction info |
| **Revert Reason** | Error message for failed transactions | Text description | Explains why transaction failed |
## Common Transaction Patterns
| Pattern | From Address | To Address | Value | Input Data | Tokens Transferred |
| :- | :- | :- | :- | :- | :- |
| **Simple ETH Transfer** | User wallet | User wallet | > 0 ETH | Empty/minimal | None |
| **Token Transfer** | User wallet | Token contract | 0 ETH | Function call | Token amount |
| **Contract Interaction** | User wallet | Contract | 0 ETH | Function data | Possibly tokens |
| **Contract Creation** | User wallet | null | 0 ETH | Contract bytecode | None |
| **Multi-token Transfer** | User wallet | Contract | 0 ETH | Function call | Multiple tokens |
## Troubleshooting Guide
| Issue | Possible Causes | What to Check |
| :- | :- | :- |
| **Transaction Not Found** | Wrong hash, wrong network, too recent | Verify hash, check network, wait for indexing |
| **Failed Transaction** | Out of gas, revert, invalid input | Check gas limit, read revert reason, verify input |
| **High Gas Fees** | Network congestion, complex operation | Check gas price, simplify transaction, wait for lower fees |
| **Pending Too Long** | Low gas price, network issues | Increase gas price, check network status |
| **Wrong Token Amount** | Decimal confusion, display issue | Check token decimals, verify actual amount |
**Quick Reference:** Use Ctrl+F to search for specific field names in this guide. All fields are organized by the section they appear in on the Blockscout transaction page.
# Transaction Types: Blob, Coin, Contract, and Token
Source: https://docs.blockscout.com/using-blockscout/overviews/transaction-types
How Blockscout categorizes transactions including blob (EIP-4844), coin transfer, contract call, contract creation, token transfer, minting, and burning.
Different types of transactions are categorized in the Blockscout UI to allow for quick identification. Types include:
* **Blob txn:** 4844-type transactions which include large amounts of data
* **Coin transfer**: value transfer, value >= 0, no tx input
* **Contract call**: tx input is present (any value including 0)
* **Contract creation**: creation of a smart-contract
* **Token burning**: recognized token transfer of any of ERC-20, 721, 1155 token instance (single or bulk) to 0x0000... address
* **Token creation**: creation of token instance in ERC-1155
* **Token minting**: token transfer of any of ERC-20, 721, 1155 token instance (single or bulk) from 0x0000... address
* **Token transfer**: token transfer of any of ERC-20, 721, 1155 token instance (single or bulk)
* **Transaction**: A contract call where the contract has not yet been identified by Blockscout.
# Adding and Updating Token Info on Blockscout
Source: https://docs.blockscout.com/using-blockscout/token-info
Submit or update token name, logo, description, website, and socials on Blockscout using deployer verification, manual review, or expedited processing.
## Overview
Token pages on Blockscout can display extra information beyond what's on-chain. This can include project description, website, social links, and a verified icon. To add or update this information, you submit a request that goes through a QA review.
**What you'll need (minimum information required):**
| Field | Required? |
| - | - |
| Token name | Required |
| Token contract address | Required |
| Requester name | Required |
| Requester email | Required |
| Project email address (address created with the project's official domain, e.g. `yourusername@yourwebsitedomain.com`, or the official email address shown on the website) | Suggested |
| Project website (working links, clear information) | Suggested |
| Icon URL (48 x 48 SVG or PNG) | Required |
| Project description | Required |
| Social media links | Optional but recommended\* |
| Payment (wallet you are sending funds from and tx hash) | Optional, recommended for expedited processing\*\* |
\*A missing website or social presence won't block approval but does provide relevant context for token info and improves the chances of approval.
\*\*We offer the option to pay for expedited processing of token information. This guarantees we will review and approve or decline the listing within 7 days. If no payment is included we cannot guarantee any timeline for review, as we have 1,000s of tokens in the queue.
## Two ways to submit
Your submission path depends on whether the wallet you're submitting from can be automatically tied to the token.
### Path 1: Submission using the deployer address
If you control the wallet that deployed the token, verification is fast. Automated checks confirm the wallet information and you can go directly to token info submission.
**Steps**:
1. **Log in** to Blockscout using the same address used to deploy the token (you should also have an email address associated with this log in, add if you haven't done so already).
2. Go to the token contract. You can access this in several ways.
3. Paste the token contract into search, then click the 3 dots to access **Add Token Info**
1. Access from the **Verified addrs** item in your account dashboard.
4. Enter your token details and **Send request.**
Your submission will move to review. During review you will be contacted about optional expedited payment processing (see below).
### Path 2: You can't submit from your wallet on the Blockscout UI
If the original deployer wallet is not accessible or was never yours (for example after a multisig migration, a treasury wallet change, a team handoff, or a factory contract deployment) you can still submit for verification.
**Steps:**
1. Send an email to [submissions@blockscout.com](mailto:submissions@blockscout.com) with your wallet, token information, and an explanation of your relationship to the project.
2. You will receive a reply with a link to provide additional specific information to the Blockscout team.
3. The team will review the proof and confirm the provided information manually before moving forward.
## Expedited Payment Process
Payment address:
* Ethereum, Optimism, Base: 0x242ba6d68FfEb4a098B591B32d370F973FF882B7
* Robinhood: 0xF3e177A4034cF6e57cCBe80108cAe6f3729C6649
While not required, expedited payment ensures we can review your token info in a timely manner (within 7 days). The payment process varies depending on whether you are following Path 1 or Path 2 submissions.
* Path 1: you will be contacted during the review process if you would like to pay for expedited review.
* Path 2: you will have the option to pay as a part of the manual submission.
To initiate the process, you will send **the requested amount in USDC or USDT** on the chain where your token is listed. Current supported networks include **Ethereum, Optimism, Base, and Robinhood Chain**.
You will then copy the transaction hash from this transaction and include it with your initial token information submission.
Payment does not guarantee your token info will be listed β it only guarantees that the team will review and approve or reject your submission within 7 days. Reasons for rejection are listed in the possible outcomes section below.
## Review Process: what happens after you submit
Path 1 submissions are checked automatically against deployer address. Path 2 submissions are reviewed manually against the proof you provide.
We search for tokens with matching names, symbols, or branding. Tokens may vary slightly; however, if exact duplicates exist, the token with the strongest liquidity, trading volume, and active trader count is treated as official, and copycat tokens are rejected.
If you include a website or socials, we check for phishing content, suspicious redirects, and impersonation of unrelated projects. This content helps verify correct information, and we recommend you include as much as you can.
Only if your website has a wallet-connect feature. We test it with a QA wallet holding no valuable assets, checking for unusual permission requests or unlimited spending approvals.
Approved, rejected, or sent back requesting more information.
**Expedited reviews are completed in 1 to 7 business days**. Standard requests have no guaranteed timeframe.
## Possible outcomes
**Approved** β your token info is confirmed and published shortly after.
**More information requested** β this typically means we couldn't confirm wallet ownership, or something in your submission was incomplete or inconsistent. You'll get a follow-up describing what's needed.
**Rejected** β a rejected submission must restart the full process, including a new fee if you want expedited processing.
### Common reasons for rejection
* **Payment issues.** The transaction can't be confirmed on-chain, the amount is incorrect, or the transaction hash was already used on another submission.
* **Wallet doesn't qualify.** You couldn't provide sufficient proof of ownership for the token.
* **Token impersonation.** The token exactly copies the name, symbol, and branding of an established token.
* **Phishing behavior.** A linked website contains phishing content or redirects to a suspicious domain.
* **Suspicious wallet permissions.** A linked website's wallet-connect feature requests unlimited spending approvals, unexpected token approvals, or access to unrelated assets.
* **Requests for private keys or seed phrases.** Anywhere in the website or submission flow.
* **Misleading or misrepresented information.** Submitted details are inaccurate or intentionally misleading. Token name, logo, designs, symbol, and other information are fraudulent, infringe copyright, or misrepresent public entities.
Every submission is final once sent for review. Double-check your token name, contract address, and links before submitting to avoid a rejection.
## FAQ
No. The fee is non-refundable regardless of whether your submission is approved, rejected, or requires resubmission.
No. A missing website or social presence doesn't block approval on its own, but is recommended.
Ethereum, Optimism, Base, and Robinhood Chain. Send 99 USDC or USDT to the address in the [Expedited Payment Process](#expedited-payment-process) section.
Expedited reviews typically complete in 1 to 7 business days. Standard requests have no guaranteed timeframe.
Use Path 2. Email our QA team at [submissions@blockscout.com](mailto:submissions@blockscout.com) with proof of your relationship to the project, such as a signed message or a post from the project's verified social account.
No. Duplicate submissions for the same contract address create backlogs and slow down processing. If you have issues with your current request, reply to your original submission thread instead of sending a new one.
Not immediately. Every submission is final once sent for review. However, once approved, token info can be resubmitted if something needs correcting.
We compare liquidity, trading volume, active traders, token age, and transaction count. The token with the strongest legitimate activity is treated as official; a newer duplicate attempting to impersonate it will be rejected.
# Token Standards Supported by Blockscout
Source: https://docs.blockscout.com/using-blockscout/token-support
Blockscout indexes and displays ERC-20, ERC-721, ERC-1155, ERC-777, and ERC-4626 tokens with balances, transfers, and standard-specific views.
Blockscout supports the following token types:
* ERC-20: Fungible tokens
* Standard for interchangeable tokens
* Used for cryptocurrencies, stablecoins, utility tokens
* ERC-721: Non-fungible tokens (NFTs)
* Unique, indivisible tokens
* Often used for digital art, collectibles, game items
* ERC-1155: Multi-token standard
* Combines fungible and non-fungible tokens
* Efficient for gaming and complex ecosystems
* ERC-777: Advanced fungible tokens (basic indexing but no additional views, provides similar info to ERC-20)
* Adds features like operator support and hooks
* Backward compatible with ERC-20.
* ERC-4626: Tokenized Vaults (basic indexing but no additional views, provides similar info to ERC-20)
* Standard for yield-bearing tokens
* Used in DeFi for lending and yield farming
# ERC-1155 Support: Multi-Token Indexing
Source: https://docs.blockscout.com/using-blockscout/token-support/erc-1155-support
How Blockscout recognizes ERC-1155 contracts and indexes fungible and non-fungible balances, parses batched transfers, and tracks minting events.
[ERC-1155](https://eips.ethereum.org/EIPS/eip-1155) contracts are designed to support multiple token types within a single contract. This standard is being adopted rapidly for efficiency and optimization, and is being used to bundle multi-token transactions and approvals while supporting both fungible and non-fungible tokens.
Recognition and labelling for ERC-1155 contracts, indexing instance balances for both fts and nfts, parsing single and batched transactions, and monitoring and displaying minting events are included.
## GnosisChain Example
ERC-1155s are supported for the Gnosis Chain and any new ERC-1155 instances are recognized on deployment. For ERC-1155 contracts created prior to the enhanced support, a new single or batched transfer, mint, or token instance creation triggers contract recognition.
[https://gnosis.blockscout.com/token/0x93d0c9a35c43f6BC999416A06aaDF21E68B29EBA?tab=token\_transfers](https://gnosis.blockscout.com/token/0x93d0c9a35c43f6BC999416A06aaDF21E68B29EBA?tab=token_transfers)
# Widgets: 3rd-Party Data on Address and Contract Pages
Source: https://docs.blockscout.com/using-blockscout/widgets
Blockscout widgets surface reputation, airdrop, security, audit, and complexity data from partners like Talent Protocol, Webacy, Trustblock, and more.
If your project would like to incorporate a widget into the explorer, please [contact us in Discord](https://discord.gg/blockscout). Learn more -> [Widgets Deck](/images/widgets-deck.pdf)
## Overview
Blockscout Widgets deliver contextual data from third-party protocols directly on address and contract pages. Essential information about onchain identity, activity, security and ecosystem participation provides a broad overview of relevant information.
## Viewing Widgets
1. Navigate to any externally owned account (EOA) address, ENS name (like [vitalik.eth](https://eth.blockscout.com/address/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045)) or contract (i.e. the [UniV2 factory contract](https://eth.blockscout.com/address/0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f)) in your Blockscout explorer.
2. Scroll down to the Widgets section below the address/contract details to view widgets.
3. You can also view via the **Widgets tab** for any address or contract, which will show all available widgets.
## Key Features
### Enhanced Address Insights
Widgets display engagement and activity across the Web3 ecosystem, providing a holistic view beyond basic balances and transactions.
### Security & Risk Assessment
For contracts and tokens, widgets surface risk scores, audit information, complexity metrics, and other security analytics.
### Ecosystem Integration
Blockscout integrates with multiple protocols. Additional details are provided in the Available Widgets section.
**Address Pages**
* **Talent Protocol:** Onchain creator score
* **Drops**: Airdrop checker
* **GitPOAP**: Contributor reward badges
* **Blockscout Badges**: Minted Blockscout badges
* **Ethereum Follow Protocol (EFP)**: Onchain social graph
* **EtherScore**: Onchain reputation badges
* **Webacy**: Risk analysis
* **Human Passport**: Humanity verification
* **Humanode**: Onchain biomapper
**Contract Pages**
* **Webacy**: Risk score
* **Trustblock**: Audit info
* **SmartMUV**: Contract Complexity
## Supported Networks
Widgets are available on Blockscout hosted chains including:
* Ethereum Mainnet
* Optimism
* Base
* Arbitrum
* Celo
* Gnosis
* Soneium
* Polygon
## Benefits
### For Users
* Comprehensive onchain identity view
* Quick access to ecosystem participation data
* Security assessment at a glance
* Airdrop eligibility tracking
### For Developers
* Contract complexity analysis
* Audit verification
* Risk assessment tools
* Integration opportunities
### For the Ecosystem
* Enhanced transparency
* Improved security awareness
* Stronger protocol integrations
* Better user experience
## Currently Available Widgets
Widgets show an overview score. Each widget can be clicked on to reveal additional details.
### Address Page Widgets
#### Creator Score
**Source:** Talent Protocol
Measures a content creator's reputation by analyzing data from various platforms. The Creator Score evaluates both quantity and quality of work using verifiable data points, providing comprehensive assessment of a creator's influence and trustworthiness.
**Additional available details:**
* Overall creator score
* Platform-specific scores (Farcaster, Lens, etc.)
* Total earnings
* Content quality metrics
#### Drops
**Source:** Drops (Airdrop Checker)
Automatically identifies unclaimed crypto airdrops by monitoring wallet addresses across multiple networks. Shows eligibility for recent and verified airdrops.
**Additional available details:**
* Eligible airdrops
* Claimable amounts
* Claimed rewards history
* Airdrop status
**Features:**
* Multi-network monitoring
* Telegram alerts for new airdrops
* Real-time eligibility checking
#### GitPOAP
**Source:** GitPOAP
Rewards and permanently records contributions to open-source projects via GitHub using the POAP (Proof of Attendance Protocol) model. Provides public, permissionless, onchain verification of open-source contributions.
**Additional available details:**
* Total GitPOAPs earned
* Project contributions
* Contribution history
* GitHub integration status
#### Blockscout Badges
**Source:** Blockscout Merits
Limited-edition NFT badges celebrating community involvement in Blockscout campaigns and contributions.
**Additional available details:**
* Earned merits
* Referral count
* Activity streaks
* Collectible NFT badges
#### EFP Followers
**Source:** Ethereum Follow Protocol (EFP)
Onchain social graph protocol for Ethereum accounts that complements ENS. Enables users to follow or tag other addresses through NFT lists, creating a decentralized social network.
**Additional available details:**
* Follower count
* Following list
* Recent transactions
* Social connections
#### Onchain Achievement Badges
**Source:** EtherScore
Represents onchain achievements completed across DeFi protocols, NFT platforms, and DAOs. Each badge signifies a specific milestone or activity in Web3.
**Additional available details:**
* Total badge count
* Badge categories
* Achievement progress
* Protocol integrations
#### Address/Contract Risk Score (available for both)
**Source:** Webacy
Numerical assessment evaluating potential security threats, compliance issues, or suspicious activities associated with a wallet address.
**Additional available details:**
* Overall risk rating (Low/Medium/High)
* Suspicious activity flags
* Security warnings
* Risk analysis details
**Purpose:**
* Assess wallet security status
* Identify potential threats
* Provide security insights
#### Humanity Score
**Source:** Gitcoin Passport
Proof-of-personhood system using verifiable credentials ("stamps") from trusted web2 and web3 sources to verify humanity without compromising privacy. Helps distinguish real humans from bots and Sybil attacks.
**Additional available details:**
* Unique Humanity Points
* HUMN Points
* Collected stamps
* Verification status
**Stamp Sources:**
* Government ID
* Biometrics
* ENS domains
* Social profiles
* Other verified credentials
#### Biomapper Score
**Source:** Humanode
Biomapper is an on-chain, private facial recognition tool that provides Sybil resistance by ensuring each verified person can link only one EVM-compatible address to a dApp.
**Additional available details:**
* Humanode biomapper verification status
**Purpose:**
* Shows if a user is verified with biomapper, proving they are a unique human via facial recognition.
### Contract Page Widgets
#### Audits
**Source:** Trustblock
Displays verified smart contract audits recorded onchain through Trustblock, a web3 protocol for audit transparency.
**Requirements:**
* Auditors and audit firms must publish contracts on Trustblock for audits to appear
**Additional available details:**
* Audit status
* Auditor information
* Audit reports
* Verification details
#### Complexity Score
**Source:** SmartMuv Explorer
Evaluates the structural complexity of a smart contract's storage layout. Primarily intended for developers and auditors who need to understand, migrate, or upgrade smart contracts safely.
**Additional available details:**
* Layout summary
* Deep analysis
* Complexity score
* Storage structure breakdown
**Use Cases:**
* Contract migration planning
* Upgrade safety assessment
* Security auditing
* Development review
# WebSocket Use Case: Build a Whale-Watching Alert Bot
Source: https://docs.blockscout.com/whale-watch
Build a whale-watching bot on Robinhood Chain that streams Blockscout WebSocket events and posts Discord alerts when transfers cross your threshold.
Whale-watching is one of the oldest habits in crypto: watch large wallets, get notified the moment they move, and use that as a signal. Whale Alert, the best-known example, tracks transfers in the millions of dollars across major chains and flags whether coins are heading onto an exchange, which often signals selling pressure, or off one, which often signals accumulation. Paid alerting services like Cryptocurrency Alerting go further, letting you monitor an entire network with one rule and pushing matches out over webhooks, Slack, Discord, or Telegram.
This post builds a small version of that yourself: a bot that watches an address on Robinhood Chain and pings a Discord channel the instant a transfer crosses a threshold you set. Robinhood Chain is a good chain to demonstrate this on for a specific reason: Robinhood is bringing tokenized stocks, ETPs, and RWAs onchain, so "whale watching" here isn't only about ETH moving between wallets, it can mean watching large transfers of tokenized equities, which is a genuinely new kind of signal.
Blockscout does have a built-in way to monitor addresses: the [Watchlist feature](/using-blockscout/my-account/watchlist) under My Account. Add an address there and Blockscout emails you whenever it sends or receives a transaction, with per-token-type controls over what triggers a notification. If you'd prefer to be notified by email, this is a good way to go. In this post we add speed and flexibility: since it's a script you own, alerts can go to Discord, Slack, a pager, a database, or anywhere else an HTTP endpoint can receive them.
## Why push, not polling
Another option for checking addresses is creating a script that polls an address's transaction list every few seconds and diffs it against what it saw last time. This can work, but is inefficient and costly for 2 main reasons.
1. **Latency.** The poll interval delays alerts. Poll every 10 seconds and your fastest possible alert is 10 seconds late, on a chain where blocks land every \~0.1 seconds. By the time a whale move is visible on Twitter, informed traders have often already acted on it, so shaving that delay is the entire value proposition of an alert bot.
2. **Wasted requests.** Most polls return nothing new. You're paying for the 99% of checks that find no whale activity, just to catch the 1% that does.
With a push-based approach you subscribe once, and the server sends you an event the moment something happens, with no unnecessary request in between. For a fast chain like Robinhood Chain, this difference is amplified, since more can happen inside a single polling window.
## Blockscout's version: the WebSocket API
Blockscout's Pro API doesn't currently have a hosted "webhooks" feature where you paste a URL into a dashboard and configure filters. However, with the WebSocket API you can open a multiplexed connection, subscribe to topics like a specific address, and the server pushes JSON events to you as they happen.
This provides flexibility but relies on you to turn the WebSocket message into an outbound webhook call. In this tutorial we'll create a webhook from the WebSocket API that posts directly to Discord, driven by Blockscout's real-time feed.
## What you'll build
A \~100-line Node.js script that:
1. Opens a WebSocket connection to the Blockscout Pro API
2. Subscribes to a Robinhood Chain address
3. Watches both native ETH transfers and any token transfer (ERC-20, ERC-721, ERC-1155) involving that address
4. Filters each against a low threshold
5. POSTs a formatted alert to a Discord webhook when a match hits
6. Reconnects automatically, with backoff, if the connection drops
You'll test it by sending yourself a real, tiny transfer on Robinhood Chain mainnet, which costs essentially nothing.
## Step 1: Get a Pro API key
1. Go to [dev.blockscout.com](http://dev.blockscout.com) and create an account.
2. Open the Keys section and click **Create API Key**. Keys start with `proapi_` and are shown once.
```bash theme={null}
export BLOCKSCOUT_API_KEY=proapi_your_key_here
```
Robinhood Chain testnet isn't currently supported by the Pro API, so this tutorial runs on mainnet (chain ID `4663`). That's not a problem here: gas is sub-cent ETH, and trading actions are gas-free for users for Robinhood Chain's first 90 days, so a real test transfer costs you effectively nothing.
## Step 2: Create a Discord webhook to receive alerts
This is the easiest possible receiver to test against, and it takes about a minute:
1. In Discord, go to a server you control (or create one, free, just for this).
2. Server Settings β Integrations β Webhooks β **New Webhook**.
3. Name it (e.g. "Whale Watcher"), pick a channel, and click **Copy Webhook URL**.
```bash theme={null}
export DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/your/webhook/url
```
That URL accepts a plain POST with a JSON body like `{"content": "your message"}`, which is all this bot needs to send.
## Step 3: Pick an address and thresholds
You need a Robinhood Chain address to watch. For testing, use a wallet you control so you can trigger alerts yourself. For a real deployment, this is where you'd point at a known exchange hot wallet, a bridge contract, or a large holder's address.
```bash theme={null}
export WATCH_ADDRESS=0xYourAddressToWatch
export THRESHOLD_WEI=1000000000000000
export TOKEN_THRESHOLD=0.001
```
`1000000000000000` wei is 0.001 ETH, low enough that almost any test transfer trips it. `TOKEN_THRESHOLD` is in human units (e.g. "0.001" tokens), not raw units, since the relay reads each token's decimals off the event itself and does the conversion for you. These are placeholders you will adjust, real whale thresholds on a live deployment will be far higher, tuned to whatever counts as "large" for the wallets and tokens you're tracking.
## Step 4: Write the relay
Create a project and install the WebSocket client:
```bash theme={null}
mkdir whale-watcher && cd whale-watcher
npm init -y
npm pkg set type=module
npm install ws
```
`npm pkg set type=module` tells Node to treat `.js` files in this project as ES modules, which the `import` syntax below needs. Without it, running the script fails with `Cannot use import statement outside a module`.
Create `watch.js` by pasting this whole block into your terminal, it writes the file for you:
```bash theme={null}
cat > watch.js << 'EOF'
import WebSocket from "ws";
const apiKey = process.env.BLOCKSCOUT_API_KEY;
const watchAddress = process.env.WATCH_ADDRESS.toLowerCase();
const thresholdWei = BigInt(process.env.THRESHOLD_WEI);
const tokenThreshold = Number(process.env.TOKEN_THRESHOLD);
const discordWebhook = process.env.DISCORD_WEBHOOK_URL;
const chainId = "4663"; // Robinhood Chain mainnet
const seen = new Set(); // dedup keys, since delivery is at-least-once
let reconnectDelay = 1000; // starts at 1s, doubles on repeated failures, caps at 30s
async function alert(text) {
console.log(text);
await fetch(discordWebhook, {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ content: text }),
});
}
function connect() {
const url = `wss://api.blockscout.com/ws?${new URLSearchParams({ apikey: apiKey })}`;
const socket = new WebSocket(url);
socket.on("open", () => {
console.log(`Connected. Subscribing to ${watchAddress}...`);
reconnectDelay = 1000; // reset backoff on a successful connection
socket.send(JSON.stringify({
id: 1,
method: "subscribe",
params: {
topic: `addresses:${watchAddress}`,
chain_id: chainId,
},
}));
});
socket.on("message", async (data) => {
const message = JSON.parse(data.toString());
if (message.id === 1) {
if (message.result === "ok" || message.result === "already_subscribed") {
console.log("Subscribed. Waiting for transfers...");
} else {
console.error("Subscribe failed:", message.error);
}
return;
}
if (message.type !== "event") return;
// Native ETH transfers
if (message.data.event === "transaction") {
for (const tx of message.data.payload.transactions) {
const dedupKey = `tx:${tx.hash}`;
if (seen.has(dedupKey)) continue;
seen.add(dedupKey);
const value = BigInt(tx.value);
if (value < thresholdWei) continue;
const eth = Number(value) / 1e18;
const direction = tx.to?.hash?.toLowerCase() === watchAddress ? "IN" : "OUT";
await alert(
`π **Whale move detected** (${direction})\n${eth} ETH\nTx: https://robinhoodchain.blockscout.com/tx/${tx.hash}`
);
}
}
// Any token transfer: ERC-20, ERC-721, ERC-1155
if (message.data.event === "token_transfer") {
for (const transfer of message.data.payload.token_transfers) {
const dedupKey = `token:${transfer.transaction_hash}:${transfer.log_index}`;
if (seen.has(dedupKey)) continue;
seen.add(dedupKey);
const token = transfer.token;
const rawValue = transfer.total?.value;
// NFTs (ERC-721/1155) carry a token_id instead of a decimal value; alert on those unconditionally
if (rawValue === undefined || token?.decimals == null) {
const direction = transfer.to?.hash?.toLowerCase() === watchAddress ? "IN" : "OUT";
await alert(
`π **NFT transfer detected** (${direction})\n${token?.symbol ?? token?.name ?? "Unknown token"}\nTx: https://robinhoodchain.blockscout.com/tx/${transfer.transaction_hash}`
);
continue;
}
const amount = Number(rawValue) / 10 ** Number(token.decimals);
if (amount < tokenThreshold) continue;
const direction = transfer.to?.hash?.toLowerCase() === watchAddress ? "IN" : "OUT";
const symbol = token.symbol ?? token.name ?? "tokens";
await alert(
`π **Whale move detected** (${direction})\n${amount} ${symbol}\nTx: https://robinhoodchain.blockscout.com/tx/${transfer.transaction_hash}`
);
}
}
});
socket.on("error", (err) => console.error("Socket error:", err.message));
socket.on("close", (code, reason) => {
console.log(`Closed: ${code} ${reason.toString()}. Reconnecting in ${reconnectDelay / 1000}s...`);
setTimeout(connect, reconnectDelay);
reconnectDelay = Math.min(reconnectDelay * 2, 30000);
});
}
connect();
EOF
```
The reconnect logic is added to protect against random connection drops. If you're testing with multiple scripts open at once, close old ones before starting new ones, since too many open connections at the same time can itself cause drops.
**Run it:**
```bash theme={null}
node watch.js
```
You should see `Connected` and `Subscribed`, then silence until a matching transaction fires.
## Step 5: Trigger a real alert
**Native ETH transfer.** Open your wallet (MetaMask or similar), make sure it's connected to Robinhood Chain mainnet, and send 0.002 ETH to your watched address from any other wallet you control.
Within a second or two of the transaction confirming, your script logs the match and your Discord channel gets a message:
> π **Whale move detected** (IN) 0.002 ETH Tx: [https://robinhoodchain.blockscout.com/tx/0x](https://robinhoodchain.blockscout.com/tx/0x)...
**Token transfer.** If you hold any ERC-20 token on Robinhood Chain, sending even a fraction of one to your watched address triggers the token path instead. Open the token in your wallet the same way you would for any transfer, enter your watched address as the recipient, and send an amount above your `TOKEN_THRESHOLD`. If your wallet doesn't already show the token, you can add it manually using the token contract's address, findable on [robinhoodchain.blockscout.com](http://robinhoodchain.blockscout.com) under that token's page.
You'll see a matching Discord message naming the token symbol instead of ETH.
Whale watch is triggered by sending or receiving tokens from the identified address.
## Watching 10 wallets on one connection
A single WebSocket connection supports up to 100 subscriptions, so watching a whole list of wallets, say, ten known exchange or bridge addresses, is still only a single connection. Ten `subscribe` calls run on the same socket, and one shared handler figures out which address each incoming event belongs to.
To adjust from the single-address version, use the `topic` field the server echoes back on every event to know which watched address just moved.
Same as before, this creates a separate file, `watch-multi.js`, so paste the whole block into your terminal to write it:
```bash theme={null}
cat > watch-multi.js << 'EOF'
import WebSocket from "ws";
const apiKey = process.env.BLOCKSCOUT_API_KEY;
const discordWebhook = process.env.DISCORD_WEBHOOK_URL;
const chainId = "4663"; // Robinhood Chain mainnet
const thresholdWei = BigInt(process.env.THRESHOLD_WEI);
const tokenThreshold = Number(process.env.TOKEN_THRESHOLD);
// Comma-separated list of the 10 addresses to watch
const watchAddresses = process.env.WATCH_ADDRESSES
.split(",")
.map((a) => a.trim().toLowerCase());
const seen = new Set();
let reconnectDelay = 1000;
async function alert(text) {
console.log(text);
await fetch(discordWebhook, {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ content: text }),
});
}
function connect() {
const url = `wss://api.blockscout.com/ws?${new URLSearchParams({ apikey: apiKey })}`;
const socket = new WebSocket(url);
socket.on("open", () => {
console.log(`Connected. Subscribing to ${watchAddresses.length} addresses...`);
reconnectDelay = 1000;
watchAddresses.forEach((address, i) => {
socket.send(JSON.stringify({
id: i + 1, // one id per subscription, so each confirmation maps back to an address
method: "subscribe",
params: {
topic: `addresses:${address}`,
chain_id: chainId,
},
}));
});
});
socket.on("message", async (data) => {
const message = JSON.parse(data.toString());
// Subscription confirmations: ids 1..N map back to watchAddresses[id - 1]
if (typeof message.id === "number") {
const address = watchAddresses[message.id - 1];
if (message.result === "ok" || message.result === "already_subscribed") {
console.log(`Subscribed: ${address}`);
} else {
console.error(`Subscribe failed for ${address}:`, message.error);
}
return;
}
if (message.type !== "event") return;
// message.topic tells you which of the 10 addresses this event belongs to
const watchedAddress = message.topic.replace("addresses:", "");
if (message.data.event === "transaction") {
for (const tx of message.data.payload.transactions) {
const dedupKey = `tx:${tx.hash}`;
if (seen.has(dedupKey)) continue;
seen.add(dedupKey);
const value = BigInt(tx.value);
if (value < thresholdWei) continue;
const eth = Number(value) / 1e18;
const direction = tx.to?.hash?.toLowerCase() === watchedAddress ? "IN" : "OUT";
await alert(
`π **Whale move detected** (${direction})\nWatched: ${watchedAddress}\n${eth} ETH\nTx: https://robinhoodchain.blockscout.com/tx/${tx.hash}`
);
}
}
if (message.data.event === "token_transfer") {
for (const transfer of message.data.payload.token_transfers) {
const dedupKey = `token:${transfer.transaction_hash}:${transfer.log_index}`;
if (seen.has(dedupKey)) continue;
seen.add(dedupKey);
const token = transfer.token;
const rawValue = transfer.total?.value;
const direction = transfer.to?.hash?.toLowerCase() === watchedAddress ? "IN" : "OUT";
if (rawValue === undefined || token?.decimals == null) {
await alert(
`π **NFT transfer detected** (${direction})\nWatched: ${watchedAddress}\n${token?.symbol ?? token?.name ?? "Unknown token"}\nTx: https://robinhoodchain.blockscout.com/tx/${transfer.transaction_hash}`
);
continue;
}
const amount = Number(rawValue) / 10 ** Number(token.decimals);
if (amount < tokenThreshold) continue;
const symbol = token.symbol ?? token.name ?? "tokens";
await alert(
`π **Whale move detected** (${direction})\nWatched: ${watchedAddress}\n${amount} ${symbol}\nTx: https://robinhoodchain.blockscout.com/tx/${transfer.transaction_hash}`
);
}
}
});
socket.on("error", (err) => console.error("Socket error:", err.message));
socket.on("close", (code, reason) => {
console.log(`Closed: ${code} ${reason.toString()}. Reconnecting in ${reconnectDelay / 1000}s...`);
setTimeout(connect, reconnectDelay);
reconnectDelay = Math.min(reconnectDelay * 2, 30000);
});
}
connect();
EOF
```
**Run it with ten addresses:**
```bash theme={null}
export WATCH_ADDRESSES="0xAddr1,0xAddr2,0xAddr3,0xAddr4,0xAddr5,0xAddr6,0xAddr7,0xAddr8,0xAddr9,0xAddr10"
node watch-multi.js
```
You'll see ten `Subscribed: 0x...` lines on startup, one per address, then a single stream of alerts tagged with whichever address triggered each one. Test it the same way as before, a small ETH or token transfer to any one of the ten addresses shows up in Discord within a second or two, with that address named in the message so you know which wallet moved.
## Taking the script to production
A few more things worth doing before you use this for real trading decisions:
* **Keep the dedup set bounded.** `seen` in this example grows forever; in a long-running process, cap it or expire entries after a few minutes. A `Map` storing when each key was first seen, swept periodically, does this cleanly within the code.
```js theme={null}
const seen = new Map(); // dedupKey -> timestamp
const DEDUP_TTL_MS = 5 * 60 * 1000; // forget entries after 5 minutes
function wasSeen(key) {
if (seen.has(key)) return true;
seen.set(key, Date.now());
return false;
}
setInterval(() => {
const cutoff = Date.now() - DEDUP_TTL_MS;
for (const [key, timestamp] of seen) {
if (timestamp < cutoff) seen.delete(key);
}
}, 60 * 1000);
```
Swap `if (seen.has(dedupKey)) continue; seen.add(dedupKey);` for `if (wasSeen(dedupKey)) continue;` wherever it appears above.
* **Add context to the alert**, with more than just the raw number. Whale Alert's alerts are useful because they name the sending and receiving wallets when known (an exchange, a bridge). Pulling `/api/v2/addresses/{hash}` for a name tag before sending the Discord message turns "0.06 ETH moved" into "0.06 ETH moved from Coinbase hot wallet," which is a meaningfully more useful signal. This code snippet can be added to the above code to provide more context.
```js theme={null}
async function getLabel(address) {
const res = await fetch(
`https://api.blockscout.com/4663/api/v2/addresses/${address}?apikey=${apiKey}`
);
const data = await res.json();
return data.metadata?.tags?.[0]?.name ?? data.ens_domain_name ?? null;
}
// Inside the alert-building code, before sending to Discord:
const label = await getLabel(tx.from.hash);
const fromText = label ? `${tx.from.hash} (${label})` : tx.from.hash;
await alert(
`π **Whale move detected** (${direction})\n${eth} ETH\nFrom: ${fromText}\nTx: https://robinhoodchain.blockscout.com/tx/${tx.hash}`
);
```
Most addresses won't have a known label, in which case `getLabel` just returns `null` and the alert falls back to the plain address, so this only adds detail when there's additional detail to add.
## Start building
* Get a free Pro API key: [dev.blockscout.com](http://dev.blockscout.com)
* Full WebSocket API reference: [https://docs.blockscout.com/devs/apis/websocket-api](https://docs.blockscout.com/devs/apis/websocket-api)
* Explore Robinhood Chain: [robinhoodchain.blockscout.com](http://robinhoodchain.blockscout.com)