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
| Namespace | Description |
|---|---|
eventContract | Deployed Gatekeeper1155 contracts |
sale | Sale configurations |
token | ERC1155 token data |
tier | Ticket tier configurations |
balance | Token holder balances |
transfer | Transfer history |
permission | Role grants and permissions |
stub | Check-in events (ticket to stub exchanges) |
void | Voiding 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 contractsonchainToken- Token configurationsonchainTicketTier- Tier configurationsonchainSaleConfig- Sale configurationsonchainOrder- Purchase ordersonchainOrderItem- Order line itemsonchainTicketTransfer- Transfer eventsonchainTicketBalance- Current balancesonchainRoleGrant- Role assignmentsonchainSwap- Check-in swapsonchainVoid- 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
- Client API Reference - Full client API documentation
- EventContract - Query deployed contracts
- Balance - Query token balances
- Permission - Query role assignments