en un clic
en un clic
| 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.
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