Set up and configure Torii indexer for GraphQL queries, gRPC subscriptions, and SQL access. Use when indexing your deployed world for client queries or real-time updates.
84
Does it follow best practices?
If you maintain this skill, you can automatically optimize it using the tessl CLI to improve its score:
npx tessl skill review --optimize ./path/to/skillValidation for skill structure
Set up and use Torii, the Dojo indexer, for efficient querying and real-time subscriptions to your world state.
Manages Torii indexer:
Start Torii:
torii --world <WORLD_ADDRESS>This starts Torii with default settings:
http://localhost:8080/graphqlhttp://localhost:8080With Controller indexing (recommended):
torii --world <WORLD_ADDRESS> --indexing.controllersProduction configuration:
torii --world <WORLD_ADDRESS> --db-dir ./torii-db --indexing.controllersTorii is the Dojo indexer that:
Why use Torii:
Torii provides GraphQL endpoint at http://localhost:8080/graphql
Use the GraphiQL IDE in your browser to explore the schema and test queries.
Torii generates two types of queries:
Generic Queries:
entities - Access all entities with filteringmodels - Retrieve model definitionstransactions - Query indexed transactionsModel-Specific Queries:
{modelName}Models - Custom queries for each modelpositionModels, movesModelsGet all entities of a model:
query {
movesModels {
edges {
node {
player
remaining
last_direction
}
}
}
}Get model metadata:
query {
models {
edges {
node {
id
name
classHash
contractAddress
}
}
totalCount
}
}Cursor-based pagination:
query {
entities(first: 10) {
edges {
cursor
node {
id
}
}
pageInfo {
hasNextPage
endCursor
}
}
}Get next page:
query {
entities(first: 10, after: "cursor_value") {
edges {
cursor
node { id }
}
}
}Offset/limit pagination:
query {
entities(offset: 20, limit: 10) {
edges {
node { id }
}
totalCount
}
}Subscribe to world state changes via WebSocket.
subscription {
entityUpdated(id: "0x54f58...") {
id
updatedAt
models {
__typename
... on Position {
vec {
x
y
}
}
... on Moves {
remaining
}
}
}
}Monitor all world events:
subscription {
eventEmitted {
id
keys
data
transactionHash
}
}Listen for new model registrations:
subscription {
modelRegistered {
id
name
namespace
}
}Torii stores data in SQLite, accessible for complex queries.
Connect to database:
sqlite3 torii.dbExample queries:
-- Count entities
SELECT COUNT(*) FROM entities;
-- Custom aggregations
SELECT AVG(value) FROM model_data WHERE model_name = 'Health';import { createClient } from '@dojoengine/torii-client';
const client = await createClient({
rpcUrl: "http://localhost:5050",
toriiUrl: "http://localhost:8080",
worldAddress: WORLD_ADDRESS,
});
// Query entities
const positions = await client.getEntities({
model: "Position",
limit: 10
});
// Subscribe to updates
await client.onEntityUpdated(
[{ model: "Position", keys: [playerId] }],
(entity) => console.log("Position updated:", entity)
);import { ApolloClient, InMemoryCache, gql } from '@apollo/client';
const client = new ApolloClient({
uri: 'http://localhost:8080/graphql',
cache: new InMemoryCache(),
});
const { data } = await client.query({
query: gql`
query GetMoves {
movesModels {
edges {
node {
player
remaining
}
}
}
}
`
});| Option | Description | Default |
|---|---|---|
--world | World contract address | Optional (since Torii 1.6.0) |
--rpc | RPC endpoint URL | http://localhost:5050 |
--db-dir | Database directory | In-memory |
--config | Path to TOML configuration file | None |
--http.cors_origins | CORS origins | * |
Slot provides hosted Torii instances. Slot requires a TOML configuration file.
# torii.toml
world_address = "<WORLD_ADDRESS>"
rpc = "<RPC_URL>"
[indexing]
controllers = trueSee the Torii configuration guide for all TOML options (indexing, polling, namespaces, etc.).
slot auth login
slot deployments create <PROJECT_NAME> torii --config torii.toml --version <DOJO_VERSION># Stream logs
slot deployments logs <PROJECT_NAME> torii -f
# Delete and recreate (safe — all data is on-chain)
slot deployments delete <PROJECT_NAME> toriiTerminal 1: Start Katana
katana --dev --dev.no-feeTerminal 2: Deploy world
sozo build && sozo migrateTerminal 3: Start Torii
torii --world <WORLD_ADDRESS> --http.cors_origins "*"entitiesAfter Torii setup:
dojo-client skill)3c1874f
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.