Documentation

Ponder Indexer

Multi-chain event indexing with GraphQL API powered by Ponder

What is Ponder?

Ponder is a modern blockchain indexing framework that automatically indexes events from multiple chains and provides a type-safe GraphQL API for querying indexed data.

Multi-Chain

Indexes events from both Mantle Sepolia and Sapphire Testnet in a unified database

Real-Time

Auto-syncs with latest blocks and provides WebSocket subscriptions for live updates

Features

GraphQL API

Auto-generated GraphQL schema with type-safe queries and mutations

Type Generation

Automatically generates TypeScript types from your schema and ABIs

Database

SQLite for development, PostgreSQL for production with automatic migrations

Hot Reload

Changes to schema or event handlers automatically trigger re-indexing

What Ponder Indexes

The Cylend indexer tracks the following entities across both chains:

Deposits

Tracks all deposit buckets created by users

depositId, depositor, token, initialAmount,
remainingAmount, isNative, released, createdAt

Actions

Records all encrypted actions (supply, borrow, repay, withdraw)

actionId, depositId, user, actionType, status,
createdAt, processedAt

Positions

Maintains user lending positions (encrypted, only hash visible)

user, token, positionHash, updatedAt

Liquidity

Aggregates protocol-wide liquidity metrics per token

token, totalDeposited, totalReserved,
totalBorrowed, updatedAt

Quick Start

Get the indexer running in a few steps:

  1. 1

    Navigate to indexer directory

    cd cylend-indexer
  2. 2

    Configure environment variables

    Set RPC URLs in .env file (see Configuration)

  3. 3

    Start the indexer

    npm run dev
  4. 4

    Access GraphQL playground

    Open http://localhost:42069/graphql in your browser

Tip

The indexer will automatically sync from the deployment block. Initial indexing may take a few minutes depending on chain history.

Example Queries

Common GraphQL queries you can run:

Get User Deposits

query GetUserDeposits($address: String!) {
  deposits(where: { depositor: $address }) {
    items {
      depositId
      token
      initialAmount
      remainingAmount
      released
      createdAt
    }
  }
}

Get User Actions

query GetUserActions($address: String!) {
  actions(where: { user: $address }, orderBy: "createdAt", orderDirection: "desc") {
    items {
      actionId
      actionType
      status
      createdAt
      processedAt
    }
  }
}

Get Liquidity Metrics

query GetLiquidity {
  liquidities {
    items {
      token
      totalDeposited
      totalReserved
      totalBorrowed
      updatedAt
    }
  }
}
Note

For complete query examples and subscriptions, see the GraphQL Queries documentation.

Learn More