ワンクリックで
dojo-entities
// Use when querying, fetching, or subscribing to game entities in dojo.js. Triggers: entity query, fetch entities, useModel, useEntityQuery, ToriiQueryBuilder, subscribe entities, getEntities, entity subscription, model data
// Use when querying, fetching, or subscribing to game entities in dojo.js. Triggers: entity query, fetch entities, useModel, useEntityQuery, ToriiQueryBuilder, subscribe entities, getEntities, entity subscription, model data
Use this skill when the user asks to "test dojo contracts", "run integration tests", "start dojo stack", "test with torii", "verify contract behavior", mentions integration testing for Dojo/Cairo contracts, or needs to set up local katana/torii infrastructure.
Update @dojoengine/grpc proto files from Torii repository
Use when debugging and troubleshooting dojo.js applications. Triggers: dojo error, torii connection, entity not found, type mismatch, debug dojo, troubleshoot, subscription error, sync issues
Use when subscribing to game events and tracking tokens in dojo.js. Triggers: subscribe events, game events, token balance, event query, achievements, event subscription, onTokenBalanceUpdated, activity tracking
Use for React integration patterns and best practices in dojo.js. Triggers: dojo react, react hooks, effect atoms, Result.match, infinite scroll dojo, DojoSdkProvider, useDojoSDK, react patterns
Use when setting up dojo.js SDK in a frontend project. Triggers: setup dojo, initialize dojo, configure dojo, dojoengine setup, sdk init, DojoSdkProvider, world address, torii url, dojo config
| name | dojo-entities |
| description | Use when querying, fetching, or subscribing to game entities in dojo.js. Triggers: entity query, fetch entities, useModel, useEntityQuery, ToriiQueryBuilder, subscribe entities, getEntities, entity subscription, model data |
Use this skill when:
Build type-safe queries for entities:
import { ToriiQueryBuilder, KeysClause, MemberClause } from "@dojoengine/sdk";
// Basic query with limit
const query = new ToriiQueryBuilder<typeof schema>()
.withLimit(100)
.build();
// Query with clause filter
const query = new ToriiQueryBuilder<typeof schema>()
.withClause(
KeysClause(["game-Player"], [playerAddress], "VariableLen").build()
)
.withLimit(50)
.build();
// Query with ordering
const query = new ToriiQueryBuilder<typeof schema>()
.addOrderBy("game-Player.score", "Desc")
.withLimit(10)
.build();
// Query specific models
const query = new ToriiQueryBuilder<typeof schema>()
.addEntityModel("game-Player")
.addEntityModel("game-Position")
.withLimit(100)
.build();
const query = new ToriiQueryBuilder<typeof schema>()
.withLimit(50) // Max results
.withCursor(nextCursor) // Pagination cursor
.withDirection("Forward") // "Forward" | "Backward"
.build();
// Keys clause - filter by entity keys
KeysClause(["namespace-Model"], [key1, key2], "VariableLen")
// Member clause - filter by field value
MemberClause("namespace-Model", "fieldName", "Eq", value)
// Composite clause - combine clauses
CompositeClause("And", [clause1, clause2])
const { sdk } = useDojoSDK();
// One-time fetch
const result = await sdk.getEntities({
query: new ToriiQueryBuilder<typeof schema>()
.withClause(clause)
.withLimit(100)
});
// Access results
result.items.forEach(entity => {
console.log(entity.entityId, entity.models);
});
// Pagination
if (result.next_cursor) {
const nextPage = await sdk.getEntities({
query: new ToriiQueryBuilder<typeof schema>()
.withCursor(result.next_cursor)
.withLimit(100)
});
}
const { sdk } = useDojoSDK();
const [initialData, subscription] = await sdk.subscribeEntityQuery({
query: new ToriiQueryBuilder<typeof schema>()
.withClause(clause)
.withLimit(100),
callback: ({ data, error }) => {
if (error) {
console.error("Subscription error:", error);
return;
}
// Handle real-time updates
console.log("Entity updated:", data);
}
});
// Clean up subscription
subscription.cancel();
import { useModel } from "@dojoengine/sdk/react";
function PlayerStats({ entityId }) {
// Format: "namespace-ModelName"
const player = useModel(entityId, "game-Player");
if (!player) return <div>Loading...</div>;
return <div>Score: {player.score}</div>;
}
import { useModels } from "@dojoengine/sdk/react";
function Leaderboard() {
const players = useModels("game-Player");
return (
<ul>
{Object.entries(players).map(([entityId, player]) => (
<li key={entityId}>{player?.name}: {player?.score}</li>
))}
</ul>
);
}
import { useHistoricalModel } from "@dojoengine/sdk/react";
function PlayerHistory({ entityId }) {
const history = useHistoricalModel(entityId, "game-Player");
return (
<ul>
{history.map((snapshot, i) => (
<li key={i}>Score: {snapshot.models.game.Player.score}</li>
))}
</ul>
);
}
import { getEntityIdFromKeys } from "@dojoengine/utils";
// Generate entity ID from keys
const entityId = getEntityIdFromKeys([
BigInt(playerAddress),
BigInt(gameId)
]);
"namespace-ModelName" format (hyphen-separated)entityId.toString() if needed