Skip to content

Commit dba78bb

Browse files
committed
fix(sdk): zustand historical hook
1 parent c28a726 commit dba78bb

8 files changed

Lines changed: 114 additions & 19 deletions

File tree

.changeset/heavy-waves-hide.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@dojoengine/sdk": patch
3+
---
4+
5+
fix: zustand historical state hook

examples/example-vite-react-sdk/src/App.tsx

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
import { KeysClause, ToriiQueryBuilder } from "@dojoengine/sdk";
1+
import {
2+
HistoricalToriiQueryBuilder,
3+
KeysClause,
4+
ToriiQueryBuilder,
5+
} from "@dojoengine/sdk";
26

37
import { ModelsMapping } from "./typescript/models.gen.ts";
48
import { useSystemCalls } from "./useSystemCalls.ts";
@@ -9,6 +13,7 @@ import {
913
useDojoSDK,
1014
useEntityId,
1115
useEntityQuery,
16+
useHistoricalEntityQuery,
1217
useModel,
1318
} from "@dojoengine/sdk/react";
1419
import { addAddressPadding, CairoCustomEnum } from "starknet";
@@ -45,6 +50,22 @@ function App() {
4550
)
4651
.includeHashedKeys()
4752
);
53+
useHistoricalEntityQuery(
54+
new HistoricalToriiQueryBuilder()
55+
.withClause(
56+
// Querying Moves and Position models that has at least [account.address] as key
57+
KeysClause(
58+
[ModelsMapping.Moves, ModelsMapping.Position],
59+
[
60+
account?.address
61+
? addAddressPadding(account.address)
62+
: undefined,
63+
],
64+
"FixedLen"
65+
).build()
66+
)
67+
.includeHashedKeys()
68+
);
4869

4970
const moves = useModel(entityId as string, ModelsMapping.Moves);
5071
const position = useModel(entityId as string, ModelsMapping.Position);

packages/sdk/src/__tests__/toriiQueryBuilder.test.ts

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import { describe, expect, it } from "vitest";
2-
import { ToriiQueryBuilder } from "../internal/toriiQueryBuilder";
2+
import {
3+
ToriiQueryBuilder,
4+
HistoricalToriiQueryBuilder,
5+
} from "../internal/toriiQueryBuilder";
36
import type { Clause, OrderBy } from "@dojoengine/torii-wasm";
47
import type { SchemaType } from "../internal/types";
58
import { ClauseBuilder } from "../internal/clauseBuilder";
@@ -177,3 +180,33 @@ describe("ToriiQueryBuilder", () => {
177180
});
178181
});
179182
});
183+
describe("HistoricalToriiQueryBuilder", () => {
184+
it("should be historical", () => {
185+
const builder = new HistoricalToriiQueryBuilder<TestModels>();
186+
const query = builder
187+
.withLimit(10)
188+
.withCursor("cursor")
189+
.addEntityModel("dojo_starter-Position")
190+
.addOrderBy("x", "Asc")
191+
.includeHashedKeys()
192+
.build();
193+
194+
expect(query).toEqual({
195+
pagination: {
196+
limit: 10,
197+
cursor: "cursor",
198+
direction: "Forward",
199+
order_by: [
200+
{
201+
field: "x",
202+
direction: "Asc",
203+
},
204+
],
205+
},
206+
clause: undefined,
207+
no_hashed_keys: false,
208+
models: ["dojo_starter-Position"],
209+
historical: true,
210+
});
211+
});
212+
});

packages/sdk/src/internal/createSDK.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import {
2828
updateTokenBalanceSubscription,
2929
} from "./token.ts";
3030
import { subscribeQueryModelCallback } from "./subscribeQueryModel.ts";
31-
import { Pagination } from "./pagination.ts";
31+
import { defaultToriiPagination, Pagination } from "./pagination.ts";
3232
import { parseEntities } from "./parseEntities.ts";
3333

3434
export interface CreateSDKOptions {
@@ -316,9 +316,15 @@ export function createSDK<T extends SchemaType>({
316316
* @returns {Promise<torii.Controllers>}
317317
*/
318318
getControllers: async (
319-
contract_addresses: string[]
319+
contract_addresses: string[],
320+
usernames: string[],
321+
pagination: torii.Pagination = defaultToriiPagination
320322
): Promise<torii.Controllers> => {
321-
return await client.getControllers(contract_addresses, []);
323+
return await client.getControllers({
324+
contract_addresses,
325+
usernames,
326+
pagination,
327+
});
322328
},
323329

324330
/**

packages/sdk/src/internal/pagination.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,16 @@
1-
import type { PaginationDirection } from "@dojoengine/torii-wasm/types";
1+
import type {
2+
PaginationDirection,
3+
Pagination as ToriiPagination,
4+
} from "@dojoengine/torii-wasm/types";
25
import type { SchemaType, ToriiQueryBuilder } from "./types.ts";
36

47
const DEFAULT_LIMIT = 1000;
8+
export const defaultToriiPagination: ToriiPagination = {
9+
limit: DEFAULT_LIMIT,
10+
cursor: undefined,
11+
direction: "Forward",
12+
order_by: [],
13+
};
514

615
/**
716
* A generic pagination class that handles cursor-based pagination for query results.

packages/sdk/src/internal/token.ts

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ import type {
99
} from "./types.ts";
1010

1111
import { addAddressPadding } from "starknet";
12+
import { defaultToriiPagination } from "./pagination.ts";
13+
14+
type Strict<T> = {
15+
[K in keyof T]-?: NonNullable<T[K]>;
16+
};
1217

1318
/**
1419
* Creates a safe callback wrapper that handles errors
@@ -49,7 +54,7 @@ export const defaultTokenBalance: torii.TokenBalance = {
4954

5055
function parseTokenRequest<T extends GetTokenRequest & GetTokenBalanceRequest>(
5156
req: T
52-
): T {
57+
): Strict<T> {
5358
if (req.contractAddresses) {
5459
req.contractAddresses = req.contractAddresses.map((r) =>
5560
addAddressPadding(r)
@@ -62,7 +67,12 @@ function parseTokenRequest<T extends GetTokenRequest & GetTokenBalanceRequest>(
6267
);
6368
}
6469

65-
return req;
70+
return {
71+
contractAddresses: req.accountAddresses ?? [],
72+
accountAddresses: req.accountAddresses ?? [],
73+
tokenIds: req.tokenIds ?? [],
74+
pagination: req.pagination ?? defaultToriiPagination,
75+
} as Strict<T>;
6676
}
6777
/**
6878
* @param {GetTokenRequest} request
@@ -72,8 +82,13 @@ export async function getTokens(
7282
client: torii.ToriiClient,
7383
request: GetTokenRequest
7484
): Promise<torii.Tokens> {
75-
const { contractAddresses, tokenIds } = parseTokenRequest(request);
76-
return await client.getTokens(contractAddresses ?? [], tokenIds ?? []);
85+
const { contractAddresses, tokenIds, pagination } =
86+
parseTokenRequest(request);
87+
return await client.getTokens({
88+
contract_addresses: contractAddresses,
89+
token_ids: tokenIds,
90+
pagination,
91+
});
7792
}
7893

7994
/**
@@ -84,13 +99,14 @@ export async function getTokenBalances(
8499
client: torii.ToriiClient,
85100
request: GetTokenBalanceRequest
86101
): Promise<torii.TokenBalances> {
87-
const { contractAddresses, accountAddresses, tokenIds } =
102+
const { contractAddresses, accountAddresses, tokenIds, pagination } =
88103
parseTokenRequest(request);
89-
return await client.getTokenBalances(
90-
contractAddresses ?? [],
91-
accountAddresses ?? [],
92-
tokenIds ?? []
93-
);
104+
return await client.getTokenBalances({
105+
contract_addresses: contractAddresses,
106+
account_addresses: accountAddresses,
107+
token_ids: tokenIds,
108+
pagination,
109+
});
94110
}
95111

96112
/**

packages/sdk/src/internal/types.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ export type ToriiResponse<T extends SchemaType> = Pagination<
121121
*/
122122
export type SubscribeResponse<T extends SchemaType> = [
123123
ToriiResponse<T>,
124-
torii.Subscription
124+
torii.Subscription,
125125
];
126126

127127
/**
@@ -130,6 +130,7 @@ export type SubscribeResponse<T extends SchemaType> = [
130130
export interface GetTokenRequest {
131131
contractAddresses?: string[];
132132
tokenIds?: string[];
133+
pagination?: torii.Pagination;
133134
}
134135

135136
/**
@@ -449,10 +450,14 @@ export interface SDK<T extends SchemaType> {
449450
* Gets controller information for the specified contract addresses.
450451
*
451452
* @param {string[]} contract_addresses - Contract addresses to query (empty for all)
453+
* @param {string[]} usernames - usernames to query (empty for all)
454+
* @param {torii.Pagination} pagination - torii pagination object
452455
* @returns {Promise<torii.Controllers>} - Controller information
453456
*/
454457
getControllers: (
455-
contract_addresses: string[]
458+
contract_addresses: string[],
459+
usernames: string[],
460+
pagination?: torii.Pagination
456461
) => Promise<torii.Controllers>;
457462
}
458463

packages/sdk/src/web/react/hooks/entities.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ export function useEntityQuery<Schema extends SchemaType>(
5050
export function useHistoricalEntityQuery<Schema extends SchemaType>(
5151
query: ToriiQueryBuilder<Schema>
5252
) {
53-
if (query.isHistorical()) {
53+
if (!query.isHistorical()) {
5454
throw new Error("Query must be HistoricalToriiQueryBuilder");
5555
}
5656
const { sdk, useDojoStore } = useDojoSDK<() => any, Schema>();

0 commit comments

Comments
 (0)