@zing-protocol/zing-sdk 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/README.md +12 -0
  2. package/package.json +37 -0
  3. package/src/_generated/index.js +6 -0
  4. package/src/_generated/utils/index.ts +181 -0
  5. package/src/_generated/zing_framework/coin_utils.ts +41 -0
  6. package/src/_generated/zing_framework/deps/sui/object.ts +16 -0
  7. package/src/_generated/zing_framework/derived_object_bag.ts +400 -0
  8. package/src/_generated/zing_framework/derived_table.ts +366 -0
  9. package/src/_generated/zing_governance/admin.ts +47 -0
  10. package/src/_generated/zing_governance/deps/sui/object.ts +16 -0
  11. package/src/_generated/zing_governance/treasury.ts +134 -0
  12. package/src/_generated/zing_identity/config.ts +191 -0
  13. package/src/_generated/zing_identity/deps/std/type_name.ts +25 -0
  14. package/src/_generated/zing_identity/deps/sui/object.ts +16 -0
  15. package/src/_generated/zing_identity/deps/sui/object_table.ts +26 -0
  16. package/src/_generated/zing_identity/deps/sui/table.ts +38 -0
  17. package/src/_generated/zing_identity/deps/sui/vec_set.ts +28 -0
  18. package/src/_generated/zing_identity/ecdsa.ts +166 -0
  19. package/src/_generated/zing_identity/identity.ts +661 -0
  20. package/src/_generated/zing_identity/reclaim.ts +803 -0
  21. package/src/_generated/zing_studio/app.ts +855 -0
  22. package/src/_generated/zing_studio/article.ts +598 -0
  23. package/src/_generated/zing_studio/config.ts +475 -0
  24. package/src/_generated/zing_studio/deps/std/type_name.ts +25 -0
  25. package/src/_generated/zing_studio/deps/sui/bag.ts +43 -0
  26. package/src/_generated/zing_studio/deps/sui/balance.ts +20 -0
  27. package/src/_generated/zing_studio/deps/sui/coin.ts +21 -0
  28. package/src/_generated/zing_studio/deps/sui/dynamic_field.ts +272 -0
  29. package/src/_generated/zing_studio/deps/sui/object.ts +16 -0
  30. package/src/_generated/zing_studio/deps/sui/table.ts +38 -0
  31. package/src/_generated/zing_studio/deps/sui/vec_map.ts +39 -0
  32. package/src/_generated/zing_studio/deps/sui/vec_set.ts +28 -0
  33. package/src/_generated/zing_studio/deps/walrus/blob.ts +22 -0
  34. package/src/_generated/zing_studio/deps/walrus/events.ts +124 -0
  35. package/src/_generated/zing_studio/deps/walrus/metadata.ts +137 -0
  36. package/src/_generated/zing_studio/deps/walrus/storage_resource.ts +17 -0
  37. package/src/_generated/zing_studio/deps/zing_framework/derived_object_bag.ts +17 -0
  38. package/src/_generated/zing_studio/deps/zing_framework/derived_table.ts +17 -0
  39. package/src/_generated/zing_studio/donation.ts +18 -0
  40. package/src/_generated/zing_studio/enclave.ts +466 -0
  41. package/src/_generated/zing_studio/nitro_attestation.ts +308 -0
  42. package/src/_generated/zing_studio/referral.ts +447 -0
  43. package/src/_generated/zing_studio/storage.ts +664 -0
  44. package/src/_generated/zing_studio/studio.ts +682 -0
  45. package/src/bcs.ts +139 -0
  46. package/src/client/index.ts +557 -0
  47. package/src/client/types.ts +28 -0
  48. package/src/components/index.ts +3 -0
  49. package/src/components/wallet-provider.tsx +53 -0
  50. package/src/components/walrus-provider.tsx +212 -0
  51. package/src/components/zing-provider.tsx +54 -0
  52. package/src/config/common.ts +82 -0
  53. package/src/config/index.ts +45 -0
  54. package/src/config/mainnet.ts +109 -0
  55. package/src/config/testnet.ts +111 -0
  56. package/src/config/types.ts +69 -0
  57. package/src/const.ts +32 -0
  58. package/src/getters.ts +523 -0
  59. package/src/hooks/index.ts +14 -0
  60. package/src/hooks/useGetStudio.ts +22 -0
  61. package/src/hooks/useGetTierPlan.ts +115 -0
  62. package/src/hooks/useReclaim.ts +165 -0
  63. package/src/hooks/useSignAndExecuteTransaction.ts +57 -0
  64. package/src/hooks/useSignPersonalMessage.ts +28 -0
  65. package/src/hooks/useZingInfiniteQueries.ts +92 -0
  66. package/src/hooks/useZingMutation.ts +66 -0
  67. package/src/hooks/useZingQueries.ts +107 -0
  68. package/src/hooks/useZingQuery.ts +88 -0
  69. package/src/index.ts +15 -0
  70. package/src/lib/utils/colorful-logger.ts +27 -0
  71. package/src/lib/utils/const.ts +25 -0
  72. package/src/lib/utils/helpers.ts +78 -0
  73. package/src/lib/utils/index.ts +5 -0
  74. package/src/lib/utils/init-app-with-shadow.ts +42 -0
  75. package/src/lib/utils/quilt.ts +317 -0
  76. package/src/lib/utils/reclaim.ts +148 -0
  77. package/src/lib/utils/types.ts +14 -0
  78. package/src/mutations/index.ts +3 -0
  79. package/src/mutations/seal.ts +78 -0
  80. package/src/mutations/signer.ts +241 -0
  81. package/src/mutations/walrus.ts +862 -0
  82. package/src/stores/index.ts +3 -0
  83. package/src/stores/walletStore.ts +360 -0
  84. package/src/stores/walrusStore.ts +118 -0
  85. package/src/stores/zkloginStore.ts +53 -0
  86. package/src/types.ts +120 -0
  87. package/tsconfig.json +12 -0
@@ -0,0 +1,69 @@
1
+ import type { CoinSymbol, PlatformType, WorkType } from "./common.js";
2
+ import type { KeyServerConfig } from "@mysten/seal";
3
+ import type { WalrusClient } from "@mysten/walrus";
4
+
5
+ export interface SharedObjectRef {
6
+ objectId: string;
7
+ initialSharedVersion: number;
8
+ mutable: boolean;
9
+ }
10
+
11
+ export interface PlatformConfig {
12
+ PLATFORM_UPDATE_PROOF_TARGET: string;
13
+ PLATFORM_TYPE: string;
14
+ // managers
15
+ RECLAIM_MANAGER_SHARED_OBJECT_REF: SharedObjectRef;
16
+ IDENTITY_MANAGER_SHARED_OBJECT_REF: SharedObjectRef;
17
+ // dynamic-field
18
+ IDENTITY_MANAGER_IDENTIFIER_INFO_DF_ID: string;
19
+ IDENTITY_MANAGER_ADDRESS_TO_IDENTIFIER_DF_ID: string;
20
+ }
21
+
22
+ export interface ZingConfig {
23
+ // Packages
24
+ ZING_FRAMEWORK_PACKAGE_ADDRESS: string;
25
+ ZING_IDENTITY_PACKAGE_ADDRESS: string;
26
+ ZING_STUDIO_PACKAGE_ADDRESS: string;
27
+ ZING_STUDIO_V0_PACKAGE_ADDRESS: string;
28
+ // Configs
29
+ // - zing_governance
30
+ ZING_TREASURY_SHARED_OBJECT_REF: SharedObjectRef;
31
+ // - zing_identity
32
+ ZING_IDENTITY_CONFIG_SHARED_OBJECT_REF: SharedObjectRef;
33
+ PROOF_COMMITMENT_TYPE: string;
34
+ IDENTITY_PLATFORMS: Record<PlatformType, PlatformConfig>;
35
+ // - zing_studio
36
+ ZING_STUDIO_CONFIG_SHARED_OBJECT_REF: SharedObjectRef;
37
+ ZING_STORAGE_TREASURY_SHARED_OBJECT_REF: SharedObjectRef;
38
+ ZING_WORKS_TYPE: Record<WorkType, string>;
39
+ // events
40
+ EVENT_TYPES: Record<"publishArticleEvent", string>;
41
+ }
42
+
43
+ export interface WalrusConfig {
44
+ WALRUS_PACKAGE: string;
45
+ WAL_STAKING_INNER_FIELD: string;
46
+ WALRUS_SYSTEM_SHARED_OBJECT_REF: SharedObjectRef;
47
+ WALRUS_AGGREGATORS: string[];
48
+ WALRUS_UPLOAD_RELAY_BASE_URL: string;
49
+ // events
50
+ EVENT_TYPES: Record<"blobRegistered", string>;
51
+ }
52
+
53
+ export interface SealConfig {
54
+ serverConfigs: KeyServerConfig[];
55
+ }
56
+
57
+ export interface Config {
58
+ zing: ZingConfig;
59
+ walrus: WalrusConfig;
60
+ seal: SealConfig;
61
+ coins: Record<CoinSymbol, string>;
62
+ }
63
+
64
+ export type WalrusStakingState = Awaited<
65
+ ReturnType<WalrusClient["stakingState"]>
66
+ >;
67
+ export type WalrusSystemState = Awaited<
68
+ ReturnType<WalrusClient["systemState"]>
69
+ >;
package/src/const.ts ADDED
@@ -0,0 +1,32 @@
1
+ import type { SuiNetwork } from "./types.js";
2
+ import type { KeyServerConfig } from "@mysten/seal";
3
+
4
+ // // Walrus upload relay
5
+ export const WALRUS_UPLOAD_RELAY_BASE_URL: Record<SuiNetwork, string> = {
6
+ mainnet: "https://walrus-upload-relay-production-73a4.up.railway.app",
7
+ testnet: "https://walrus-upload-relay-production-73a4.up.railway.app",
8
+ };
9
+
10
+ // Platform
11
+ // seal
12
+ export const SEAL_SERVERS_CONFIGS: Record<SuiNetwork, KeyServerConfig[]> = {
13
+ mainnet: [
14
+ {
15
+ objectId:
16
+ "0xe0eb52eba9261b96e895bbb4deca10dcd64fbc626a1133017adcd5131353fd10",
17
+ weight: 1,
18
+ },
19
+ ],
20
+ testnet: [
21
+ {
22
+ objectId:
23
+ "0x73d05d62c18d9374e3ea529e8e0ed6161da1a141a94d3f76ae3fe4e99356db75",
24
+ weight: 1,
25
+ },
26
+ {
27
+ objectId:
28
+ "0xf5d14a81a982144ae441cd7d64b09027f116a468bd36e7eca494f750591623c8",
29
+ weight: 1,
30
+ },
31
+ ],
32
+ };
package/src/getters.ts ADDED
@@ -0,0 +1,523 @@
1
+ import { TypeName } from "./_generated/zing_identity/deps/std/type_name.js";
2
+ import { IdentifierInfo } from "./_generated/zing_identity/identity.js";
3
+ import {
4
+ Article,
5
+ PublishArticleEvent,
6
+ } from "./_generated/zing_studio/article.js";
7
+ import { Field } from "./_generated/zing_studio/deps/sui/dynamic_field.js";
8
+ import { VecMap } from "./_generated/zing_studio/deps/sui/vec_map.js";
9
+ import { BlobRegistered } from "./_generated/zing_studio/deps/walrus/events.js";
10
+ import {
11
+ StorageSpace,
12
+ StorageTreasury,
13
+ } from "./_generated/zing_studio/storage.js";
14
+ import { Member, Studio } from "./_generated/zing_studio/studio.js";
15
+ import { QuiltPatchId, SuiMoveObject } from "./bcs.js";
16
+ import { bcs } from "@mysten/sui/bcs";
17
+ import {
18
+ deriveDynamicFieldID,
19
+ deriveObjectID,
20
+ fromBase64,
21
+ normalizeStructTag,
22
+ toBase64,
23
+ } from "@mysten/sui/utils";
24
+ import type { MoveObjectType } from "./bcs.js";
25
+ import type { WalrusSystemState } from "./config/types.js";
26
+ import type { SuiGrpcClient } from "@mysten/sui/grpc";
27
+ import type { SuiJsonRpcClient } from "@mysten/sui/jsonRpc";
28
+ import type { EncodingType, WalrusClient } from "@mysten/walrus";
29
+
30
+ // Walrus
31
+ const DIGEST_LEN = 32;
32
+ const BLOB_ID_LEN = 32;
33
+
34
+ // Zing
35
+ export function getDerivedStudioID(studioConfigId: string, address: string) {
36
+ return deriveObjectID(
37
+ studioConfigId,
38
+ "address",
39
+ bcs.Address.serialize(address).toBytes(),
40
+ );
41
+ }
42
+
43
+ export function getDerivedStorageID(studioConfigId: string, address: string) {
44
+ const studioId = getDerivedStudioID(studioConfigId, address);
45
+ const key = new TextEncoder().encode("storage");
46
+ return deriveObjectID(
47
+ studioId,
48
+ "vector<u8>",
49
+ bcs.vector(bcs.u8()).serialize(key).toBytes(),
50
+ );
51
+ }
52
+
53
+ export function getDerivedWorksID(studioConfigId: string, address: string) {
54
+ const studioId = getDerivedStudioID(studioConfigId, address);
55
+ const key = new TextEncoder().encode("works");
56
+ return deriveObjectID(
57
+ studioId,
58
+ "vector<u8>",
59
+ bcs.vector(bcs.u8()).serialize(key).toBytes(),
60
+ );
61
+ }
62
+
63
+ export function getDerivedMembershipID(
64
+ studioConfigId: string,
65
+ address: string,
66
+ ) {
67
+ const studioId = getDerivedStudioID(studioConfigId, address);
68
+ const key = new TextEncoder().encode("membership");
69
+ return deriveObjectID(
70
+ studioId,
71
+ "vector<u8>",
72
+ bcs.vector(bcs.u8()).serialize(key).toBytes(),
73
+ );
74
+ }
75
+
76
+ export async function getIdentifierByAddress(
77
+ suiGrpcClient: SuiGrpcClient,
78
+ addressToIdentifierDynamicFieldId: string,
79
+ address: string,
80
+ ) {
81
+ const dfObjectId = deriveDynamicFieldID(
82
+ addressToIdentifierDynamicFieldId,
83
+ "address",
84
+ bcs.Address.serialize(address).toBytes(),
85
+ );
86
+ const res = await suiGrpcClient.ledgerService.getObject({
87
+ objectId: dfObjectId,
88
+ readMask: {
89
+ paths: ["bcs"],
90
+ },
91
+ });
92
+ if (!res.response.object?.bcs?.value) {
93
+ return null;
94
+ }
95
+
96
+ const suiMoveObject = SuiMoveObject.parse(res.response.object.bcs.value);
97
+ const field = Field(bcs.Address, bcs.String).parse(
98
+ suiMoveObject.data.MoveObject.contents,
99
+ );
100
+
101
+ return field.value;
102
+ }
103
+
104
+ export async function getIdentifierInfoByIdentifier(
105
+ suiGrpcClient: SuiGrpcClient,
106
+ identifierInfoDynamicFieldId: string,
107
+ identifier: string,
108
+ ) {
109
+ const dfObjectId = deriveDynamicFieldID(
110
+ identifierInfoDynamicFieldId,
111
+ "0x1::ascii::String",
112
+ bcs.Address.serialize(identifier).toBytes(),
113
+ );
114
+ const res = await suiGrpcClient.ledgerService.getObject({
115
+ objectId: dfObjectId,
116
+ readMask: {
117
+ paths: ["bcs"],
118
+ },
119
+ });
120
+ if (!res.response.object?.bcs?.value) {
121
+ return null;
122
+ }
123
+
124
+ const suiMoveObject = SuiMoveObject.parse(res.response.object.bcs.value);
125
+ const field = Field(bcs.String, IdentifierInfo).parse(
126
+ suiMoveObject.data.MoveObject.contents,
127
+ );
128
+
129
+ return field.value;
130
+ }
131
+
132
+ export async function getDonationByIdentifier(
133
+ suiGrpcClient: SuiGrpcClient,
134
+ donationTableId: string,
135
+ identifier: string,
136
+ ) {
137
+ const dfObjectId = deriveDynamicFieldID(
138
+ donationTableId,
139
+ "0x1::ascii::String",
140
+ bcs.Address.serialize(identifier).toBytes(),
141
+ );
142
+ const res = await suiGrpcClient.ledgerService.getObject({
143
+ objectId: dfObjectId,
144
+ readMask: {
145
+ paths: ["bcs"],
146
+ },
147
+ });
148
+ if (!res.response.object?.bcs?.value) {
149
+ return null;
150
+ }
151
+
152
+ const suiMoveObject = SuiMoveObject.parse(res.response.object.bcs.value);
153
+ const field = Field(bcs.String, VecMap(TypeName, bcs.U64)).parse(
154
+ suiMoveObject.data.MoveObject.contents,
155
+ );
156
+
157
+ return field.value;
158
+ }
159
+
160
+ export async function getStudio(
161
+ suiGrpcClient: SuiGrpcClient,
162
+ studioId: string,
163
+ ) {
164
+ try {
165
+ const res = await suiGrpcClient.ledgerService.getObject({
166
+ objectId: studioId,
167
+ readMask: {
168
+ paths: ["bcs"],
169
+ },
170
+ });
171
+
172
+ if (!res.response.object?.bcs?.value) {
173
+ return null;
174
+ }
175
+
176
+ const suiMoveObject = SuiMoveObject.parse(res.response.object.bcs.value);
177
+
178
+ return Studio.parse(suiMoveObject.data.MoveObject.contents);
179
+ } catch (error) {
180
+ console.error(error);
181
+ return null;
182
+ }
183
+ }
184
+
185
+ export async function getStorageSpace(
186
+ suiGrpcClient: SuiGrpcClient,
187
+ storageSpaceId: string,
188
+ ) {
189
+ try {
190
+ const res = await suiGrpcClient.ledgerService.getObject({
191
+ objectId: storageSpaceId,
192
+ readMask: {
193
+ paths: ["bcs"],
194
+ },
195
+ });
196
+
197
+ if (!res.response.object?.bcs?.value) {
198
+ return null;
199
+ }
200
+
201
+ const suiMoveObject = SuiMoveObject.parse(res.response.object.bcs.value);
202
+
203
+ return StorageSpace.parse(suiMoveObject.data.MoveObject.contents);
204
+ } catch (error) {
205
+ console.error(error);
206
+ return null;
207
+ }
208
+ }
209
+
210
+ export async function getStorageTreasury(
211
+ suiGrpcClient: SuiGrpcClient,
212
+ storageTreasuryId: string,
213
+ ) {
214
+ const res = await suiGrpcClient.ledgerService.getObject({
215
+ objectId: storageTreasuryId,
216
+ readMask: {
217
+ paths: ["bcs"],
218
+ },
219
+ });
220
+ if (!res.response.object?.bcs?.value) {
221
+ return null;
222
+ }
223
+
224
+ const suiMoveObject = SuiMoveObject.parse(res.response.object.bcs.value);
225
+ return StorageTreasury.parse(suiMoveObject.data.MoveObject.contents);
226
+ }
227
+
228
+ export async function getMember(
229
+ suiGrpcClient: SuiGrpcClient,
230
+ membershipTableId: string,
231
+ member: string,
232
+ ) {
233
+ const dfObjectId = deriveDynamicFieldID(
234
+ membershipTableId,
235
+ "address",
236
+ bcs.Address.serialize(member).toBytes(),
237
+ );
238
+
239
+ const res = await suiGrpcClient.ledgerService.getObject({
240
+ objectId: dfObjectId,
241
+ readMask: {
242
+ paths: ["bcs"],
243
+ },
244
+ });
245
+ if (!res.response.object?.bcs?.value) {
246
+ return null;
247
+ }
248
+
249
+ const suiMoveObject = SuiMoveObject.parse(res.response.object.bcs.value);
250
+ const field = Field(bcs.Address, Member).parse(
251
+ suiMoveObject.data.MoveObject.contents,
252
+ );
253
+
254
+ return field.value;
255
+ }
256
+
257
+ export async function getMembers(
258
+ suiGrpcClient: SuiGrpcClient,
259
+ membershipTableId: string,
260
+ cursor?: string,
261
+ limit = 20,
262
+ ) {
263
+ const res = await suiGrpcClient.stateService.listDynamicFields({
264
+ parent: membershipTableId,
265
+ pageToken: cursor ? fromBase64(cursor) : undefined,
266
+ pageSize: limit,
267
+ readMask: {
268
+ paths: ["field_object.bcs"],
269
+ },
270
+ });
271
+
272
+ const data = res.response.dynamicFields.map((df) => {
273
+ if (!df.fieldObject?.bcs?.value)
274
+ throw new Error("Wrong readMask for reading members");
275
+ const suiMoveObject = SuiMoveObject.parse(df.fieldObject.bcs.value);
276
+ // Wrapped in dynamicFields
277
+ const field = Field(bcs.Address, Member).parse(
278
+ suiMoveObject.data.MoveObject.contents,
279
+ );
280
+
281
+ return {
282
+ member: field.name,
283
+ level: field.value.level,
284
+ expiredAt: field.value.expired_at,
285
+ };
286
+ });
287
+
288
+ return {
289
+ data,
290
+ nextCursor: res.response.nextPageToken
291
+ ? toBase64(res.response.nextPageToken)
292
+ : undefined,
293
+ hasNextPage: res.response.nextPageToken !== undefined,
294
+ };
295
+ }
296
+
297
+ export async function getWork(
298
+ suiGrpcClient: SuiGrpcClient,
299
+ walrusSystem: WalrusSystemState,
300
+ workId: string,
301
+ workType?: string,
302
+ ) {
303
+ const res = await suiGrpcClient.ledgerService.getObject({
304
+ objectId: workId,
305
+ readMask: {
306
+ paths: ["bcs"],
307
+ },
308
+ });
309
+
310
+ if (!res.response.object?.bcs?.value) {
311
+ return null;
312
+ }
313
+
314
+ const suiMoveObject = SuiMoveObject.parse(res.response.object.bcs.value);
315
+
316
+ const type = suiMoveObject.data.MoveObject
317
+ .type as typeof MoveObjectType.$inferType;
318
+
319
+ if (
320
+ type.$kind !== "Other" ||
321
+ normalizeStructTag(type.Other as any) !== workType
322
+ )
323
+ return null;
324
+
325
+ return Article.parse(suiMoveObject.data.MoveObject.contents);
326
+ }
327
+
328
+ export async function getWorks(
329
+ suiGrpcClient: SuiGrpcClient,
330
+ walrusSystem: WalrusSystemState,
331
+ workTableId: string,
332
+ workType?: string,
333
+ cursor?: string,
334
+ limit = 20,
335
+ ) {
336
+ const res = await suiGrpcClient.stateService.listDynamicFields({
337
+ parent: workTableId,
338
+ pageToken: cursor ? fromBase64(cursor) : undefined,
339
+ pageSize: limit,
340
+ readMask: {
341
+ paths: ["child_object"],
342
+ },
343
+ });
344
+
345
+ const works = res.response.dynamicFields.map((df) => {
346
+ if (!df.childObject?.contents?.value)
347
+ throw new Error("Wrong readMask for reading members");
348
+ // Wrapped in dynamicObjectFields
349
+ const objectType = df.childObject.objectType;
350
+
351
+ if (objectType !== workType) return null;
352
+ return Article.parse(df.childObject.contents.value);
353
+ });
354
+
355
+ const data = works
356
+ .filter((d): d is typeof Article.$inferType => {
357
+ if (!d || d.blobs.length === 0 || d.deleted) return false;
358
+ const minEndEpoch = Math.min(...d.blobs.map((b) => b.storage.end_epoch));
359
+ return minEndEpoch > walrusSystem.committee.epoch;
360
+ })
361
+ .sort((a, b) => Number(b.created_at) - Number(a.created_at));
362
+
363
+ console.log({ getWorksData: data });
364
+
365
+ return {
366
+ data,
367
+ nextCursor: res.response.nextPageToken
368
+ ? toBase64(res.response.nextPageToken)
369
+ : undefined,
370
+ hasNextPage: res.response.nextPageToken !== undefined,
371
+ };
372
+ }
373
+
374
+ export async function getPublishedArticleAndBlobId(
375
+ suiGrpcClient: SuiGrpcClient,
376
+ suiClient: SuiJsonRpcClient,
377
+ walrusClient: WalrusClient,
378
+ digest: string,
379
+ blobRegisteredEventType: string,
380
+ publishArticleEventType: string,
381
+ ) {
382
+ // suiGrpcClient waitForTransaction calling core.getTransaction which is broken
383
+ await suiClient.waitForTransaction({
384
+ digest,
385
+ });
386
+
387
+ if (!digest) throw new Error("fail to get transaction hash");
388
+
389
+ const res = await suiGrpcClient.ledgerService.getTransaction({
390
+ digest,
391
+ readMask: {
392
+ paths: ["events"],
393
+ },
394
+ });
395
+
396
+ const blobRegisteredEvent = res.response.transaction?.events?.events?.find(
397
+ (e) => e.contents?.name === blobRegisteredEventType,
398
+ );
399
+ const publishArticleEvent = res.response.transaction?.events?.events?.find(
400
+ (e) => e.contents?.name === publishArticleEventType,
401
+ );
402
+
403
+ if (!blobRegisteredEvent || !blobRegisteredEvent.contents?.value) {
404
+ throw new Error("fail to get blobRegisteredEvent");
405
+ }
406
+ if (!publishArticleEvent || !publishArticleEvent.contents?.value) {
407
+ throw new Error("fail to get publishArticleEvent");
408
+ }
409
+
410
+ const blobObjectId = BlobRegistered.parse(
411
+ blobRegisteredEvent.contents?.value,
412
+ ).object_id;
413
+ const parsedPublishArticleEvent = PublishArticleEvent.parse(
414
+ publishArticleEvent.contents.value,
415
+ );
416
+
417
+ return { parsedPublishArticleEvent, blobObjectId };
418
+ }
419
+
420
+ export function encodeQuiltPatchId(id: typeof QuiltPatchId.$inferInput) {
421
+ return urlSafeBase64(QuiltPatchId.serialize(id).toBytes());
422
+ }
423
+
424
+ export function urlSafeBase64(bytes: Uint8Array): string {
425
+ return toBase64(bytes).replace(/=*$/, "").replace("+", "-").replace("/", "_");
426
+ }
427
+
428
+ export function getMaxFaultyNodes(nShards: number): number {
429
+ return Math.floor((nShards - 1) / 3);
430
+ }
431
+
432
+ export function decodingSafetyLimit(
433
+ nShards: number,
434
+ encodingType: EncodingType,
435
+ ): number {
436
+ switch (encodingType) {
437
+ case "RedStuff":
438
+ return Math.min(5, Math.floor(getMaxFaultyNodes(nShards) / 5));
439
+ case "RS2":
440
+ return 0;
441
+ default:
442
+ throw new Error(`Encountered unknown encoding type of ${encodingType}`);
443
+ }
444
+ }
445
+
446
+ export function signersToBitmap(
447
+ signers: number[],
448
+ committeeSize: number,
449
+ ): Uint8Array {
450
+ const bitmapSize = Math.ceil(committeeSize / 8);
451
+ const bitmap = new Uint8Array(bitmapSize);
452
+
453
+ for (const signer of signers) {
454
+ const byteIndex = Math.floor(signer / 8);
455
+ const bitIndex = signer % 8;
456
+ bitmap[byteIndex] |= 1 << bitIndex;
457
+ }
458
+
459
+ return bitmap;
460
+ }
461
+
462
+ export function getSourceSymbols(
463
+ nShards: number,
464
+ encodingType: EncodingType = "RS2",
465
+ ) {
466
+ const safetyLimit = decodingSafetyLimit(nShards, encodingType);
467
+ const maxFaulty = getMaxFaultyNodes(nShards);
468
+ const minCorrect = nShards - maxFaulty;
469
+
470
+ return {
471
+ primarySymbols: minCorrect - maxFaulty - safetyLimit,
472
+ secondarySymbols: minCorrect - safetyLimit,
473
+ };
474
+ }
475
+
476
+ /**
477
+ * Calculate the encoded sliver size.
478
+ * This matches the Walrus SDK's encodedSliverSize function.
479
+ */
480
+ export function encodedSliverSize(
481
+ unencodedLength: number,
482
+ nShards: number,
483
+ encodingType: EncodingType = "RS2",
484
+ ): number {
485
+ const { primarySymbols, secondarySymbols } = getSourceSymbols(
486
+ nShards,
487
+ encodingType,
488
+ );
489
+
490
+ // Calculate symbol size with proper rounding
491
+ let symbolSize =
492
+ Math.floor(
493
+ (Math.max(unencodedLength, 1) - 1) / (primarySymbols * secondarySymbols),
494
+ ) + 1;
495
+
496
+ // RS2 requires even symbol sizes
497
+ if (encodingType === "RS2" && symbolSize % 2 === 1) {
498
+ symbolSize = symbolSize + 1;
499
+ }
500
+
501
+ const singleShardSize = (primarySymbols + secondarySymbols) * symbolSize;
502
+
503
+ console.log("encodedSliverSize breakdown:", {
504
+ unencodedLength,
505
+ primarySymbols,
506
+ secondarySymbols,
507
+ calculatedSymbolSize: symbolSize,
508
+ singleShardSize,
509
+ totalSliverSize: singleShardSize * nShards,
510
+ });
511
+
512
+ return singleShardSize * nShards;
513
+ }
514
+
515
+ export function encodedBlobLength(
516
+ unencodedLength: number,
517
+ nShards: number,
518
+ encodingType: EncodingType = "RS2",
519
+ ): number {
520
+ const sliverSize = encodedSliverSize(unencodedLength, nShards, encodingType);
521
+ const metadata = nShards * DIGEST_LEN * 2 + BLOB_ID_LEN;
522
+ return nShards * metadata + sliverSize;
523
+ }
@@ -0,0 +1,14 @@
1
+ export * from "./useSignAndExecuteTransaction.js";
2
+ export * from "./useReclaim.js";
3
+ export * from "./useGetStudio.js";
4
+ export * from "./useZingMutation.js";
5
+ export * from "./useZingQuery.js";
6
+ export * from "./useZingQueries.js";
7
+ export * from "./useZingInfiniteQueries.js";
8
+ export * from "./useGetTierPlan.js";
9
+ export * from "./useSignPersonalMessage.js";
10
+
11
+ export type InfiniteQueryResult<TData> = {
12
+ pages: TData[];
13
+ pageParams: number[];
14
+ };
@@ -0,0 +1,22 @@
1
+ import { useZingQuery } from "./useZingQuery.js";
2
+
3
+ export function useGetStudio(suiAddress?: string) {
4
+ return useZingQuery(
5
+ {
6
+ method: "getStudio",
7
+ params: [suiAddress || ""],
8
+ },
9
+ {
10
+ enabled: !!suiAddress,
11
+ retry: (failureCount, error) => {
12
+ if (error instanceof Error && error.message.includes("notExists")) {
13
+ return false;
14
+ }
15
+ return failureCount < 1;
16
+ },
17
+ staleTime: 5 * 60 * 1000, // 5 minutes
18
+ gcTime: 10 * 60 * 1000, // 10 minutes (formerly cacheTime)
19
+ },
20
+ [suiAddress || ""],
21
+ );
22
+ }