Configuring ENSIndexer
ENSIndexer requires private RPC endpoints. Public (rate limited) RPC endpoints will not provide acceptable performance.
You must configure private (paid) RPC services from providers like drpc.org, Alchemy, QuickNode, or Infura or host your own RPC service that can handle high-volume requests.
Warning: Configuring ENSIndexer to use the public ENSRainbow server (https://api.ensrainbow.io
) will significantly slow down indexing.
For optimal indexing performance, always colocate ENSIndexer and ENSRainbow. For example, if you are running ENSIndexer locally, you should also run a local instance of ENSRainbow and set ENSRAINBOW_URL
to your local ENSRainbow server.
ENSIndexer’s behavior can be configured through environment variables. Copy .env.local.example
to .env.local
and configure all required values.
# The port ENSIndexer listens on for HTTP requests.PORT=42069
# RPC configuration# When ENSIndexer starts up it verifies RPCs are defined for each of the chains# that are to be indexed based on the configured NAMESPACE and PLUGINS.## NOTE: You must configure your own private RPC endpoints.# ENSIndexer makes millions of RPC requests during operation.# Public RPC endpoints are rate limited and will not provide acceptable performance.# You must use only private (paid) RPC endpoints or your own self-hosted RPC service# that is prepared to support millions of requests (ex: 500+ requests / second)## Each configured RPC endpoint must be prepared to receive and quickly# process millions of RPC requests. Private RPC service options include:# - drpc.org (paid plan) - https://drpc.org/# - Alchemy (paid plan) - https://www.alchemy.com/# - QuickNode (paid plan) - https://www.quicknode.com/# - Infura (paid plan) - https://infura.io/# - Self-hosted RPC nodes## For the RPC URL of each chain, follow the format: RPC_URL_{chainId}={rpcUrl}## E.g. for Ethereum Mainnet using Alchemy:# RPC_URL_1=https://eth-mainnet.g.alchemy.com/v2/YOUR_API_KEY## For the RPC rate limits of each chain, follow the format:# RPC_REQUEST_RATE_LIMIT_{chainId}={rateLimitInRequestsPerSecond}# The rate limit is the maximum number of requests per second that can be made# to the RPC endpoint. For private (paid) RPC endpoints, the rate limit can be# set to higher values, depending on the capacity of the endpoint.# Default: 500 (suitable for private paid RPC services - public endpoints will fail)# If no rate limit is set for a given chainId, the DEFAULT_RPC_RATE_LIMIT (500)# will be applied.## Note: Ponder dynamically adapts to the configured rate limits to avoid 429 errors and# maximize performance. More details at: https://ponder.sh/docs/config/chains#rpc-endpoints
# === ENS Namespace: Mainnet ===# Ethereum Mainnet# - required by plugins: subgraph, reverse-resolversRPC_URL_1=RPC_REQUEST_RATE_LIMIT_1=500
# Optimism Mainnet# - required by plugins: threedns, reverse-resolversRPC_URL_10=RPC_REQUEST_RATE_LIMIT_10=500
# Base Mainnet# - required by plugins: basenames, threedns, reverse-resolversRPC_URL_8453=RPC_REQUEST_RATE_LIMIT_8453=500
# Arbitrum Mainnet# - required by plugins: reverse-resolversRPC_URL_42161=RPC_REQUEST_RATE_LIMIT_42161=500
# Linea Mainnet# - required by plugins: lineanames, reverse-resolversRPC_URL_59144=RPC_REQUEST_RATE_LIMIT_59144=500
# Scroll Mainnet# - required by plugins: reverse-resolversRPC_URL_534352=RPC_REQUEST_RATE_LIMIT_534352=500
# === ENS Namespace: Sepolia ===# Ethereum Sepolia (public testnet)# - required by plugins: subgraph, reverse-resolversRPC_URL_11155111=RPC_REQUEST_RATE_LIMIT_11155111=500
# Base Sepolia (public testnet)# - required by plugins: basenames, reverse-resolversRPC_URL_84532=RPC_REQUEST_RATE_LIMIT_84532=500
# Linea Sepolia (public testnet)# - required by plugins: lineanames, reverse-resolversRPC_URL_59141=RPC_REQUEST_RATE_LIMIT_59141=500
# Optimism Sepolia (public testnet)# - required by plugins: reverse-resolversRPC_URL_11155420=RPC_REQUEST_RATE_LIMIT_11155420=500
# Arbitrum Sepolia (public testnet)# - required by plugins: reverse-resolversRPC_URL_421614=RPC_REQUEST_RATE_LIMIT_421614=500
# Scroll Sepolia (public testnet)# - required by plugins: reverse-resolversRPC_URL_534351=RPC_REQUEST_RATE_LIMIT_534351=500
# === ENS Namespace: Holesky ===# Ethereum Holesky (public testnet)# - required by plugins: subgraphRPC_URL_17000=RPC_REQUEST_RATE_LIMIT_17000=500
# === ENS Namespace: ens-test-env ===# ens-test-env (local testnet)# - required by plugins: subgraphRPC_URL_1337=RPC_REQUEST_RATE_LIMIT_1337=500
# Database configuration# This is a namespace for the tables that the indexer will create to store indexed data.# It should be a string that is unique to the running indexer instance.## Keeping the database schema unique to the indexer instance is important to# 1) speed up indexing after a restart# 2) prevent data corruption from multiple indexer app instances writing state# concurrently to the same db schema## No two indexer instances can use the same database schema at the same time.## Read more about database schema rules here:# https://ponder.sh/docs/api-reference/database#database-schema-rules## Avoid using the `public` schema as we force that in the `dev` command. Using `public`# cause conflicts as you interchange between dev and start commands so use literally# anything else.DATABASE_SCHEMA=production# This is the connection string for the database that the indexer will use to store data.# It should be in the format of `postgresql://<username>:<password>@<host>:<port>/<database>`DATABASE_URL=postgresql://dbuser:abcd1234@localhost:5432/my_database
# ENS Namespace Configuration# An ENS namespace's Identifier (see `@ensnode/datasources` for available options).NAMESPACE=mainnet
# Plugin Configuration# Identify which indexer plugins to activate (see `src/plugins` for available plugins)# This is a comma separated list of one or more available plugin names (case-sensitive).# NOTE: for subgraph-compatible indexing, the only valid configuration is `PLUGINS=subgraph`PLUGINS=subgraph,basenames,lineanames,threedns,reverse-resolvers
# Unknown label healing# This is the URL of the ENSRainbow server that ENSIndexer will use to heal unknown labels.# The best indexing performance requires a colocated deployments of ENSIndexer and# ENSRainbow services to minimize latency. For example, both services should# communicate over the same local network.# Read more about ENSRainbow here:# https://ensrainbow.io# If you need to temporarily use the public ENSRainbow server for testing, set the following:# ENSRAINBOW_URL=https://api.ensrainbow.io (NOT RECOMMENDED - WILL MAKE INDEXING VERY SLOW!!)ENSRAINBOW_URL=http://localhost:3223
# The ENSIndexer public service URL# When the root route `/` of ENSIndexer receives a request, ENSIndexer redirects to the configured# ENSADMIN_URL with an instruction for that ENSAdmin instance to connect back to this provided URL# for querying state about the ENSNode instance.ENSNODE_PUBLIC_URL=http://localhost:42069
# The ENSAdmin service URL# When the root route `/` of ENSIndexer receives a request, ENSIndexer redirects to this provided# ENSAdmin URL with an instruction for that ENSAdmin instance to connect back to the configured# ENSNODE_PUBLIC_URL.## If this is not set, DEFAULT_ENSADMIN_URL will be used to provide easy access to an ENSAdmin UI.ENSADMIN_URL=https://admin.ensnode.io
# A feature flag to enable or disable healing of addr.reverse subnames# If this is set to true, ENSIndexer will attempt to heal subnames of addr.reverse# If this is not set, the default value is set to `DEFAULT_HEAL_REVERSE_ADDRESSES`.## WARNING: Setting this to `true` results in indexed data no longer being backwards compatible with# the ENS Subgraph. For full data-level backwards compatibility with the ENS Subgraph, set this to `false`.HEAL_REVERSE_ADDRESSES=true
# A feature flag to enable or disable the indexing of additional Resolver record values# If this is set to true, ENSIndexer will track additional Resolver record values.# If this is not set, the default value is set to `DEFAULT_INDEX_ADDITIONAL_RESOLVER_RECORDS` (true).## WARNING: It is unsafe to assume that indexed resolver record values are equivalent to the# result of performing dynamic forward resolution via the ENS protocol, as naively retrieving resolver# record values from indexed data is not ENSIP-10 nor CCIP-Read compliant. At this time we do _not_# recommend anyone directly using the indexed resolver record values; Features are planned in the# ENSNode roadmap that will provide safe use of indexed resolver record values (in appropriate contexts).## NOTE: Setting this to `true` results in indexed data being a strict _superset_ of subgraph data.# For exact subgraph data compatibility, set this to `false`.INDEX_ADDITIONAL_RESOLVER_VALUES=true