
Endpoints
One indexer runs per chain. Each serves the same GraphQL API over the chain’s own data.
The Robinhood testnet indexer sits behind a path prefix on the mainnet host, so its routes are
/testnet/graphql, /testnet/status and so on.
Every indexer answers these routes:
The web app also exposes two JSON routes of its own on
https://windrose.market: /api/chains lists every registered chain and whether it is deployed, and /api/deployment?chainId=<id> returns the contract addresses for a chain. They are documented with the other HTTP endpoints generated from the OpenAPI file.
All responses carry access-control-allow-origin: *, so a browser can query the indexer directly from any origin.
First request
The plural query for launches, newest first, with the fields the launch cards use:bigint column arrives as a decimal string. Prices are 1e18 fixed point and amounts are 18-decimal “quote units”, so divide before you display anything. The GraphQL conventions page covers pagination, filters and units; the query pages cover one table each.
GraphQL conventions
Query shape, filters, cursors, units and the semantics that trip people up.
Launches
One row per launch: curve state, price, volume, holders, graduation.
Trades
Curve buys and sells, plus pool swaps where they are indexed.
Candles
1-minute and 1-hour OHLC in the launch currency.
Holders
Current balances per launch, or one wallet across launches.
Currencies
Registry state per currency with the latest oracle rate.
Vaults
Collateral snapshots and mint, redeem, deposit and withdraw events.
Rates
Every rate the keeper oracle has posted.
How the data is produced
The indexer is a Ponder app (packages/indexer in the repository). It reads the deployment file for its chain and follows these contracts from the deployment block:
Pool swaps are the one source that differs per chain. On Robinhood Chain the launchpad uses the official Uniswap v4
PoolManager, which emits every swap on the chain, so the mainnet indexer runs with INDEX_POOL_SWAPS=false and does not follow it. Post-graduation trades on Robinhood Chain are therefore not in trades or candles, and launch.lastPriceQuote stops at the graduation price; the app reads the live pool price from StateView instead. Robinhood testnet and Arc testnet deploy their own PoolManager, so their indexers do record swaps.
Handlers read contract state at the event’s block (curve parameters at creation,
vault.status() at every vault event), so each indexer needs an archive RPC. That is why the public testnet RPCs are not enough to run one yourself; see Indexer.Chains and addresses
The chain id decides which base URL you talk to, and the addresses page lists the contracts each indexer follows.GET https://windrose.market/api/chains returns the same list at runtime, including the indexer URL the app uses per chain.