Indexer
A GraphQL API over the protocol's events, for anything the chain cannot answer directly.
The chain can tell you what a market's totals are. It cannot tell you who your borrowers are without replaying every log. That is what the indexer is for.
It is a Ponder indexer over Robinhood Chain mainnet, served at:
https://indexer.paboxo.xyz/graphqlPublic and unauthenticated, rate limited. The Prometheus endpoint behind it is not exposed.
Shape
Ponder's GraphQL: every table is pluralised by appending s — literally, so oracleStatus
becomes oracleStatuss — and wraps rows in items. Root arguments are where,
orderBy, orderDirection, limit and cursor pagination via after / pageInfo.
query Markets {
markets {
totalCount
items {
id # the router address
pool # the pool address — what the app writes to
name
collateralSymbol
ltv
liquidationThreshold
totalSupplyAssets
totalBorrowAssets
utilization
windDown
}
}
}A market's id is its router; pool is the pool. Event rows reference their market by the
router too. Confusing the two produces empty results rather than an error.
Tables
markets | config and current totals per market |
marketSnapshots | totals, utilisation, borrow and supply rate over time |
positions | per-borrower collateral and debt shares |
borrows, repays | borrow-side activity |
supplyLiquiditys, withdrawLiquiditys | liquidity moving between the Earn vault and a market |
supplyCollaterals, withdrawCollaterals | collateral movement |
liquidations, badDebts | what happened when a position failed |
interestAccruals | accrual events |
vaults, vaultMarkets, vaultDeposits, vaultWithdraws, vaultSnapshots | earn vault |
vaultAllocations | the vault's allocation trail: supplied to, withdrawn from, or skipped for a market |
share_balances | share token balance per holder — peUSDG for Earn depositors |
role_holders | who holds which access-control role on which contract, with grant and revoke history |
oracleStatuss | per-token feed status, freshness and last price |
share_balances and role_holders are snake_case: the tables are declared that way in the schema,
and the GraphQL field names follow.
Examples
Positions that currently owe something:
{
positions(where: { borrowShares_gt: "0" }, limit: 500) {
totalCount
items { market user borrowShares liquidated }
}
}A partially liquidated position keeps liquidated: true and outstanding debt, so filter on
borrowShares, not on the flag.
Indexing progress, which is how you tell a stale answer from a current one:
{ _meta { status } }Rates over time
marketSnapshots carries borrowRate and supplyRate as WAD values per year. supplyRate is
net of the effective reserve factor (10% where the stored value is
0), so a chart does not need to recompute it: it is what the market pays its lender, the Earn
vault. On WETH/USDG at the latest snapshot read on 27 October 2026, supplyRate equals
borrowRate × utilization × 0.9.
Amounts
Raw integers in the token's own units. USDG is 6 decimals; everything else is 18.