Paboxo

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/graphql

Public 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

marketsconfig and current totals per market
marketSnapshotstotals, utilisation, borrow and supply rate over time
positionsper-borrower collateral and debt shares
borrows, repaysborrow-side activity
supplyLiquiditys, withdrawLiquiditysliquidity moving between the Earn vault and a market
supplyCollaterals, withdrawCollateralscollateral movement
liquidations, badDebtswhat happened when a position failed
interestAccrualsaccrual events
vaults, vaultMarkets, vaultDeposits, vaultWithdraws, vaultSnapshotsearn vault
vaultAllocationsthe vault's allocation trail: supplied to, withdrawn from, or skipped for a market
share_balancesshare token balance per holder — peUSDG for Earn depositors
role_holderswho holds which access-control role on which contract, with grant and revoke history
oracleStatussper-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.

On this page