Skip to content

Configuring ENSIndexer

ENSIndexer’s behavior can be configured through environment variables. Copy .env.local.example to .env.local and configure all required values.

.env.local.example
# 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-resolvers
RPC_URL_1=
RPC_REQUEST_RATE_LIMIT_1=500
# Optimism Mainnet
# - required by plugins: threedns, reverse-resolvers
RPC_URL_10=
RPC_REQUEST_RATE_LIMIT_10=500
# Base Mainnet
# - required by plugins: basenames, threedns, reverse-resolvers
RPC_URL_8453=
RPC_REQUEST_RATE_LIMIT_8453=500
# Arbitrum Mainnet
# - required by plugins: reverse-resolvers
RPC_URL_42161=
RPC_REQUEST_RATE_LIMIT_42161=500
# Linea Mainnet
# - required by plugins: lineanames, reverse-resolvers
RPC_URL_59144=
RPC_REQUEST_RATE_LIMIT_59144=500
# Scroll Mainnet
# - required by plugins: reverse-resolvers
RPC_URL_534352=
RPC_REQUEST_RATE_LIMIT_534352=500
# === ENS Namespace: Sepolia ===
# Ethereum Sepolia (public testnet)
# - required by plugins: subgraph, reverse-resolvers
RPC_URL_11155111=
RPC_REQUEST_RATE_LIMIT_11155111=500
# Base Sepolia (public testnet)
# - required by plugins: basenames, reverse-resolvers
RPC_URL_84532=
RPC_REQUEST_RATE_LIMIT_84532=500
# Linea Sepolia (public testnet)
# - required by plugins: lineanames, reverse-resolvers
RPC_URL_59141=
RPC_REQUEST_RATE_LIMIT_59141=500
# Optimism Sepolia (public testnet)
# - required by plugins: reverse-resolvers
RPC_URL_11155420=
RPC_REQUEST_RATE_LIMIT_11155420=500
# Arbitrum Sepolia (public testnet)
# - required by plugins: reverse-resolvers
RPC_URL_421614=
RPC_REQUEST_RATE_LIMIT_421614=500
# Scroll Sepolia (public testnet)
# - required by plugins: reverse-resolvers
RPC_URL_534351=
RPC_REQUEST_RATE_LIMIT_534351=500
# === ENS Namespace: Holesky ===
# Ethereum Holesky (public testnet)
# - required by plugins: subgraph
RPC_URL_17000=
RPC_REQUEST_RATE_LIMIT_17000=500
# === ENS Namespace: ens-test-env ===
# ens-test-env (local testnet)
# - required by plugins: subgraph
RPC_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