Are you an LLM? Read llms.txt for a summary of the docs, or llms-full.txt for the full context.
Skip to content

Querying Indexed Data

Creating a Client

import { Client } from '@sceneinfrastructure/sdk'
 
const client = Client.create({
  url: 'https://dev.ponder.mesh.ing/sql'
})

The url should point to your Ponder SQL endpoint.

Try It

Point this at your Ponder SQL endpoint to run a live read query in the browser.

Try a live Ponder read
Runs in the browser against your Ponder SQL endpoint. Make sure CORS is enabled on the indexer.
Fetches the current chain sync status.
await client.getStatus()
Browser requests require CORS to be enabled.

Domain Namespaces

The client provides domain-specific namespaces for common query patterns:

import { Client } from '@sceneinfrastructure/sdk'
 
const client = Client.create({
  url: 'https://dev.ponder.mesh.ing/sql'
})
 
const walletAddress = '0x3456789012345678901234567890123456789012'
 
// Query deployed contracts
const contract = await client.eventContract.get({
  contractAddress: '0x1234567890123456789012345678901234567890'
})
 
// List contracts by creator
const myContracts = await client.eventContract.listByCreator({
  creator: walletAddress
})
 
// Check token balances
const balance = await client.balance.get({
  contractAddress: '0x1234567890123456789012345678901234567890',
  tokenId: 1n,
  address: walletAddress
})
 
// Query sale configurations
const sales = await client.sale.listByContract({
  contractAddress: '0x1234567890123456789012345678901234567890'
})

Available Namespaces

NamespaceDescription
eventContractDeployed Gatekeeper1155 contracts
saleSale configurations
tokenERC1155 token data
tierTicket tier configurations
balanceToken holder balances
transferTransfer history
permissionRole grants and permissions
stubCheck-in events (ticket to stub exchanges)
voidVoiding events (burns without stub)

Pagination

import { Client } from '@sceneinfrastructure/sdk'
 
const client = Client.create({
  url: 'https://dev.ponder.mesh.ing/sql'
})
 
const page1 = await client.eventContract.list({ limit: 10, offset: 0 })
const page2 = await client.eventContract.list({ limit: 10, offset: 10 })
 
const sales = await client.sale.listByContract({
  contractAddress: '0x1234567890123456789012345678901234567890',
  orderBy: 'createdAt',
  order: 'desc'
})

Raw Drizzle Queries

For complex queries not covered by the namespaces, use the raw Drizzle query builder:

import { Client } from '@sceneinfrastructure/sdk'
import { eq, and, gt } from '@ponder/client'
 
const client = Client.create({
  url: 'https://dev.ponder.mesh.ing/sql'
})
 
// Access the query builder
const results = await client.db
  .select()
  .from(client.schema.onchainTicketBalance)
  .where(
    and(
      eq(client.schema.onchainTicketBalance.contractAddress, '0x1234567890123456789012345678901234567890'),
      gt(client.schema.onchainTicketBalance.balance, 0n)
    )
  )
  .limit(100)

Available Schema Tables

Access tables via client.schema:

  • onchainEventContract - Deployed contracts
  • onchainToken - Token configurations
  • onchainTicketTier - Tier configurations
  • onchainSaleConfig - Sale configurations
  • onchainOrder - Purchase orders
  • onchainOrderItem - Order line items
  • onchainTicketTransfer - Transfer events
  • onchainTicketBalance - Current balances
  • onchainRoleGrant - Role assignments
  • onchainSwap - Check-in swaps
  • onchainVoid - Void events

Live Subscriptions

Subscribe to real-time updates using Server-Sent Events:

import { Client } from '@sceneinfrastructure/sdk'
 
const client = Client.create({
  url: 'https://dev.ponder.mesh.ing/sql'
})
 
const { unsubscribe } = client.live(
  // Query function
  (db) => db.select().from(client.schema.onchainOrder).limit(10),
  // On result callback
  (result) => {
    console.log('Orders updated:', result)
  },
  // On error callback
  (error) => {
    console.error('Subscription error:', error)
  }
)
 
// Later: clean up the subscription
unsubscribe()

Cleanup Pattern

Always unsubscribe when the component unmounts or the subscription is no longer needed:

import { useEffect, useState } from 'react'
import { Client } from '@sceneinfrastructure/sdk'
 
const client = Client.create({
  url: 'https://dev.ponder.mesh.ing/sql'
})
 
// React example
const [balances, setBalances] = useState<unknown[]>([])
 
useEffect(() => {
  const { unsubscribe } = client.live(
    (db) => db.select().from(client.schema.onchainTicketBalance),
    setBalances,
    console.error
  )
 
  return () => unsubscribe()
}, [])

Indexer Status

Check the indexer sync status for all chains:

import { Client } from '@sceneinfrastructure/sdk'
 
const client = Client.create({
  url: 'https://dev.ponder.mesh.ing/sql'
})
 
const status = await client.getStatus()
 
console.log('Indexer status:', status)

Next Steps