Overview
What is the Doppler Indexer?
The Doppler Indexer is a multi-chain blockchain indexing service built for tracking the state of Doppler protocol contracts and the tokens created by those contracts. It's built to track and process real-time data from Uniswap V2, V3, and V4 protocol deployments across multiple EVM-compatible chains.
The primary goal of this indexer is to provide a reliable, fast, and queryable data source for Doppler-related analytics, front-end applications, and market analysis tools. It aggregates data on pools, tokens, swaps, liquidity, and user activity, normalizing it into a consistent schema.
What is Ponder?
This project is built using Ponder, a powerful open-source framework for building backend applications on top of blockchain data. Ponder simplifies the process of indexing event data from EVM chains by:
Providing a declarative way to define which contracts and events to watch.
Handling real-time indexing, re-orgs, and RPC interactions.
Generating a type-safe GraphQL API based on a defined schema.
Using a standard PostgreSQL database for data storage.
Ponder provides the core indexing engine, while this repository contains the necessary business logic for processing and enriching Doppler protocol data.
Core Concepts
Supported Chains
The indexer is configured to support the following networks:
Mainnet
1
ETH Price Oracle
Base
8453
V2, V3, V4 Protocol Indexing
Unichain
130
V2, V3, V4 Protocol Indexing
Ink
57073
V2, V3, V4 Protocol Indexing
Base Sepolia
84532
V2, V3, V4 Protocol Indexing (Testnet)
The configuration is modular, making it straightforward to add or remove chains. See the Development Guide for more details.
Supported Protocols & Events
The indexer listens to a variety of events across different protocol versions to build a complete picture of market activity.
Airlock
Migrate
V2
A V3 pool migrating its liquidity to a new V2 pool.
UniswapV2Pair
Swap
V2
A trade on a Uniswap V2-style pair.
UniswapV3Initializer
Create
V3
Creation of a new Doppler V3 pool.
UniswapV3Pool
Mint
, Burn
V3
Adding or removing concentrated liquidity.
UniswapV3Pool
Swap
V3
A trade on a Doppler V3 pool.
UniswapV4Initializer
Create
V4
Creation of a new Doppler V4 pool.
UniswapV4Pool
Swap
V4
A trade on a Doppler V4 pool with hooks.
DERC20
, V4DERC20
Transfer
V3/V4
DERC20 token transfers, used to track user balances.
(Block Handlers)
block
-
Periodic tasks for oracle updates and data refresh.
Database Schema Overview
The database schema is defined in ponder.schema.ts
. It is designed to store normalized data from all supported protocols.
Core Entities
user
: Represents a user's wallet address.token
: Detailed information about an ERC20 token, including metadata, total supply, and market data.asset
: Represents a DERC20 token in the context of its specific Doppler pool, linking it to governance, migrators, etc.pool
: The central entity for a liquidity pool, storing aggregated data like price, liquidity, volume, and references to its tokens. This table holds data for V3 and V4 pools.v2Pool
: A specific table for V2 pools that are created via migration, linked back to apool
entity.swap
: A record of an individual trade, including amounts, user, price, and USD value.position
: For V3 concentrated liquidity, tracking a user's liquidity position within specific tick ranges.
Time-Series Data
eth_price
: Stores the price of ETH in USD, fetched periodically from a Chainlink oracle.hour_bucket_usd
: Aggregated OHLC (Open, High, Low, Close) price data in USD for each pool, bucketed by the hour.daily_volume
: Tracks rolling 24-hour trading volume for each pool.
Quirks & Limitations
Quote Currency
The indexer is fundamentally designed to work with pools quoted in ETH or WETH.
All USD price calculations (
priceUsd
,liquidityUsd
,volumeUsd
) are derived by converting the quote currency (ETH) value to USD using the Chainlink ETH/USD oracle price.Pools that use a different numeraire (e.g., USDC) are not fully supported for USD-denominated analytics. While their data will be indexed, USD values may be incorrect or zero.
The system identifies the quote token as ETH by checking if its address is the
zeroAddress
or the configured WETH address for that chain.
Token Metadata Fetching
The indexer attempts to fetch and store metadata (name, symbol, image) for each token from its tokenURI
.
Supported Formats:
IPFS: URIs starting with
ipfs://
are resolved using a Pinata gateway. The indexer looks for animage
orimage_hash
field in the returned JSON.HTTP(S): Direct HTTP/S links are fetched.
Retry Mechanism for Failed Fetches:
If fetching metadata fails, the token is added to a
pending_token_images
table in the database.A periodic block handler (
PendingTokenImagesBase:block
) runs every 50 blocks.This handler retries fetching the images for pending tokens.
Each token has a 5-minute cooldown between retries and a maximum of 10 retry attempts before being abandoned.
This ensures that transient network issues or delayed metadata uploads don't prevent images from being indexed eventually.
Last updated