Indexer API
A read-only REST API (Ponder + Postgres, hosted on Railway) that indexes every IndexPad contract — including tokens launched after deployment, via the factory pattern. CORS is open; all bigint values are serialized as strings.
Base URL (testnet): https://indexpad-indexer-production.up.railway.app
The indexer is a convenience for UIs. Nothing in the protocol depends on it — every value can be read directly from the contracts.
GET /stats
Global protocol totals.
{
"id": "global",
"indexCount": 1,
"reserveProcessed": "4000000000000000000000",
"protocolCutTotal": "400000000000000000000",
"distSpentTotal": "3000000000000000000000",
"ipadRedeemedReserve": "0"
}
GET /indexes?limit=50
All index tokens, newest first (limit ≤ 100). Each row includes the launch config (name, symbol, totalSupply, buyFeeBps, sellFeeBps, stocks[], rfvShareBps, treasury, creator, createdAt, txHash) plus a live holders count.
GET /index/:address
One index with its recent history:
{
"address": "0xa4d1…58ee",
"symbol": "MAG7",
"rfvShareBps": 1500,
"holders": 3,
"converts": [ { "reserveIn": "…", "protocolCut": "…", "rfvCut": "…", "distSpent": "…", "timestamp": 1752…, "txHash": "0x…" } ],
"dividends": [ { "stock": "0x…", "amount": "…", "timestamp": 1752…, "txHash": "0x…" } ],
"claims": [ { "account": "0x…", "stock": "0x…", "amount": "…" } ],
"redemptions": [ { "burned": "…", "reserveOut": "…" } ]
}
Returns 404 {"error": "not found"} for unknown addresses. Limits: 25 converts, 50 dividends, 50 claims, 25 redemptions.
GET /activity?limit=8
A merged, time-sorted feed across all indexes (limit ≤ 30) — powers the app's live activity panel. Event shapes by type:
type | Extra fields |
|---|---|
launch | symbol, stockCount |
convert | reserveIn, distSpent |
dividend | stock, amount |
redemption | burned, reserveOut |
All events carry index, symbol, timestamp, txHash.
GET /token-holders/:address
Every non-zero holder of an index:
[ { "account": "0x9C10…30C8e", "balance": "989999999999999999999900" } ]
Running your own
The indexer lives in indexer/ — configuration via CHAIN_ID, PONDER_RPC_URL, INDEX_FACTORY_ADDRESS, FEE_PROCESSOR_ADDRESS, PROTOCOL_TREASURY_ADDRESS, START_BLOCK, and DATABASE_URL (PGlite locally). See the deployment runbook.