원클릭으로
원클릭으로
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.
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 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 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 | update-grpc-proto |
| description | Update @dojoengine/grpc proto files from Torii repository |
| triggers | ["update grpc proto","update proto files","sync torii proto","grpc proto update","torii proto sync"] |
Update the @dojoengine/grpc package with the latest proto files from the Torii repository.
Use this skill when:
cd packages/grpc && bun run update:proto
This downloads the latest proto files from:
https://raw.githubusercontent.com/dojoengine/torii/main/crates/proto/proto/git diff packages/grpc/proto/
Document what changed:
cd packages/grpc && bun run build:proto
This generates TypeScript from proto files using protobuf-ts.
Compare src/generated/world.client.ts with src/torii-client.ts:
// Generated client interface - IWorldClient
interface IWorldClient {
subscribeContracts(...): ServerStreamingCall<...>;
worlds(...): UnaryCall<...>;
// ... all RPC methods
}
Check which methods in IWorldClient are not yet wrapped in ToriiGrpcClient.
For each new RPC, follow these patterns:
export function createRetrieveNewThingRequest(
query: NewThingQuery
): RetrieveNewThingRequest {
return {
query: {
// Map SDK types to proto types
field: query.field,
pagination: mapPagination(query.pagination),
},
};
}
export function mapNewThingResponse(
response: RetrieveNewThingResponse
): NewThingPage {
return {
items: response.items.map(mapNewThing),
nextCursor: response.next_cursor || undefined,
};
}
export function mapNewThing(thing: ProtoNewThing): NewThingView {
return {
id: thing.id,
// Map proto fields to SDK types
address: bufferToHex(thing.address),
};
}
export interface NewThingView {
id: string;
address: string;
}
export interface NewThingPage {
items: NewThingView[];
nextCursor?: string;
}
For query methods:
async getNewThings(query: NewThingQuery): Promise<NewThingPage> {
const request = createRetrieveNewThingRequest(query);
const response = await this.client.worldClient.retrieveNewThings(request).response;
return this.mappers.newThingsResponse(response);
}
For subscription methods:
async onNewThingUpdated(
filters: string[] | null | undefined,
callback: Function
): Promise<Subscription> {
return this.createStreamSubscription({
createStream: () =>
this.client.worldClient.subscribeNewThings({
filters: filters?.map(hexToBuffer) || [],
}),
onMessage: (response: SubscribeNewThingsResponse) => {
if (response.thing) {
callback(
this.mappers.newThing(response.thing),
response.subscription_id
);
}
},
});
}
For update subscription methods:
async updateNewThingSubscription(
subscription: Subscription,
filters: string[]
): Promise<void> {
const grpcSubscription = this.findSubscription(subscription);
if (!grpcSubscription) {
throw new Error("Subscription not found");
}
await this.client.worldClient.updateNewThingsSubscription({
subscription_id: BigInt(grpcSubscription.id),
filters: filters.map(hexToBuffer),
}).response;
}
export type { NewThingView, NewThingPage } from "./types";
cd packages/grpc && bun run test
Add new tests for new methods if needed.
cd packages/grpc && bun run lint && bun run format
cd packages/grpc && bun run build
bun run changeset
Select @dojoengine/grpc and describe the proto updates.
| File | Purpose |
|---|---|
packages/grpc/scripts/update-proto.sh | Downloads proto from Torii |
packages/grpc/scripts/build-proto.sh | Generates TypeScript |
packages/grpc/proto/*.proto | Proto definitions |
packages/grpc/src/generated/world.client.ts | Generated gRPC client |
packages/grpc/src/torii-client.ts | SDK client implementation |
packages/grpc/src/mappings/query.ts | Request mappers |
packages/grpc/src/mappings/types.ts | Response mappers |
packages/grpc/src/types.ts | SDK type definitions |
packages/grpc/src/index.ts | Package exports |
Check network connectivity and verify Torii repo URL is correct.
Check for breaking changes in proto definitions. May need to update mappers.
Re-run bun run build:proto to regenerate. Check protobuf-ts version compatibility.
Update tests to match new proto structure. Check mapper implementations.