@mysten/kiosk 0.10.6 → 0.11.0

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # @mysten/kiosk
2
2
 
3
+ ## 0.11.0
4
+
5
+ ### Minor Changes
6
+
7
+ - d76da22: Remove MatchAny filter when loading owned kiosks. This may result in an extra request,
8
+ and a change of cursor format when loading owned kiosks
9
+
10
+ ## 0.10.8
11
+
12
+ ### Patch Changes
13
+
14
+ - Updated dependencies [8baac61]
15
+ - Updated dependencies [8baac61]
16
+ - @mysten/sui@1.23.0
17
+
18
+ ## 0.10.7
19
+
20
+ ### Patch Changes
21
+
22
+ - Updated dependencies [03975f4]
23
+ - @mysten/sui@1.22.0
24
+
3
25
  ## 0.10.6
4
26
 
5
27
  ### Patch Changes
@@ -1,12 +1,6 @@
1
1
  import type { PaginationArguments, SuiClient } from '@mysten/sui/client';
2
2
  import type { FetchKioskOptions, KioskExtension, OwnedKiosks, PagedKioskData } from '../types/index.js';
3
3
  export declare function fetchKiosk(client: SuiClient, kioskId: string, pagination: PaginationArguments<string>, options: FetchKioskOptions): Promise<PagedKioskData>;
4
- /**
5
- * A function to fetch all the user's kiosk Caps
6
- * And a list of the kiosk address ids.
7
- * Returns a list of `kioskOwnerCapIds` and `kioskIds`.
8
- * Extra options allow pagination.
9
- */
10
4
  export declare function getOwnedKiosks(client: SuiClient, address: string, options?: {
11
5
  pagination?: PaginationArguments<string>;
12
6
  personalKioskType: string;
@@ -51,42 +51,101 @@ async function fetchKiosk(client, kioskId, pagination, options) {
51
51
  hasNextPage: false
52
52
  };
53
53
  }
54
+ const DEFAULT_PAGE_SIZE = 50;
55
+ const PERSON_KIOSK_CURSOR = "personal";
56
+ const OWNED_KIOSKS_CURSOR = "owned";
54
57
  async function getOwnedKiosks(client, address, options) {
55
- if (!(0, import_utils.isValidSuiAddress)(address))
58
+ if (!(0, import_utils.isValidSuiAddress)(address)) {
56
59
  return {
57
60
  nextCursor: null,
58
61
  hasNextPage: false,
59
62
  kioskOwnerCaps: [],
60
63
  kioskIds: []
61
64
  };
62
- const filter = {
63
- MatchAny: [
64
- {
65
- StructType: import_types.KIOSK_OWNER_CAP
66
- }
67
- ]
68
- };
69
- if (options?.personalKioskType) {
70
- filter.MatchAny.push({
71
- StructType: options.personalKioskType
72
- });
73
65
  }
74
- const { data, hasNextPage, nextCursor } = await client.getOwnedObjects({
75
- owner: address,
76
- filter,
77
- options: {
78
- showContent: true,
79
- showType: true
80
- },
81
- ...options?.pagination || {}
82
- });
66
+ const limit = options?.pagination?.limit ?? DEFAULT_PAGE_SIZE;
67
+ const [cursorType, cursor] = options?.pagination?.cursor?.split(":") ?? [
68
+ PERSON_KIOSK_CURSOR,
69
+ null
70
+ ];
71
+ if (options?.personalKioskType && cursorType === PERSON_KIOSK_CURSOR) {
72
+ const personalKioskResponse = formatOwnedKioskResponse(
73
+ await client.getOwnedObjects({
74
+ owner: address,
75
+ filter: {
76
+ StructType: options.personalKioskType
77
+ },
78
+ options: {
79
+ showContent: true,
80
+ showType: true
81
+ },
82
+ cursor,
83
+ limit
84
+ }),
85
+ PERSON_KIOSK_CURSOR
86
+ );
87
+ if (personalKioskResponse.hasNextPage) {
88
+ return personalKioskResponse;
89
+ }
90
+ const remainingLimit = limit - personalKioskResponse.kioskOwnerCaps.length;
91
+ if (remainingLimit < 1) {
92
+ return {
93
+ nextCursor: `${OWNED_KIOSKS_CURSOR}:`,
94
+ hasNextPage: true,
95
+ kioskOwnerCaps: personalKioskResponse.kioskOwnerCaps,
96
+ kioskIds: personalKioskResponse.kioskIds
97
+ };
98
+ }
99
+ const ownedKiosksResponse = formatOwnedKioskResponse(
100
+ await client.getOwnedObjects({
101
+ owner: address,
102
+ filter: {
103
+ StructType: import_types.KIOSK_OWNER_CAP
104
+ },
105
+ options: {
106
+ showContent: true,
107
+ showType: true
108
+ },
109
+ limit: remainingLimit
110
+ }),
111
+ OWNED_KIOSKS_CURSOR
112
+ );
113
+ return {
114
+ nextCursor: ownedKiosksResponse.nextCursor,
115
+ hasNextPage: ownedKiosksResponse.hasNextPage,
116
+ kioskOwnerCaps: [
117
+ ...personalKioskResponse.kioskOwnerCaps,
118
+ ...ownedKiosksResponse.kioskOwnerCaps
119
+ ],
120
+ kioskIds: [...personalKioskResponse.kioskIds, ...ownedKiosksResponse.kioskIds]
121
+ };
122
+ }
123
+ return formatOwnedKioskResponse(
124
+ await client.getOwnedObjects({
125
+ owner: address,
126
+ filter: {
127
+ StructType: import_types.KIOSK_OWNER_CAP
128
+ },
129
+ options: {
130
+ showContent: true,
131
+ showType: true
132
+ },
133
+ // cursor might be an empty string if the number of personal kiosks was a multiple of the limit.
134
+ cursor: cursor ? cursor : null,
135
+ limit
136
+ }),
137
+ OWNED_KIOSKS_CURSOR
138
+ );
139
+ }
140
+ function formatOwnedKioskResponse(response, cursorType) {
141
+ const { data, hasNextPage, nextCursor } = response;
83
142
  const kioskIdList = data?.map((x) => {
84
143
  const fields = x.data?.content?.dataType === "moveObject" ? x.data.content.fields : null;
85
144
  return fields?.cap ? fields?.cap?.fields?.for : fields?.for;
86
145
  });
87
146
  const filteredData = data.filter((x) => "data" in x).map((x) => x.data);
88
147
  return {
89
- nextCursor,
148
+ nextCursor: nextCursor ? `${cursorType}:${nextCursor}` : nextCursor,
90
149
  hasNextPage,
91
150
  kioskOwnerCaps: filteredData.map((x, idx) => ({
92
151
  isPersonal: x.type !== import_types.KIOSK_OWNER_CAP,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/query/kiosk.ts"],
4
- "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type {\n\tPaginationArguments,\n\tSuiClient,\n\tSuiObjectData,\n\tSuiObjectDataFilter,\n\tSuiObjectResponse,\n} from '@mysten/sui/client';\nimport { isValidSuiAddress } from '@mysten/sui/utils';\n\nimport type {\n\tFetchKioskOptions,\n\tKioskExtension,\n\tKioskListing,\n\tOwnedKiosks,\n\tPagedKioskData,\n} from '../types/index.js';\nimport { KIOSK_OWNER_CAP } from '../types/index.js';\nimport {\n\tattachListingsAndPrices,\n\tattachLockedItems,\n\tattachObjects,\n\textractKioskData,\n\tgetAllDynamicFields,\n\tgetAllObjects,\n\tgetKioskObject,\n} from '../utils.js';\n\nexport async function fetchKiosk(\n\tclient: SuiClient,\n\tkioskId: string,\n\tpagination: PaginationArguments<string>,\n\toptions: FetchKioskOptions,\n): Promise<PagedKioskData> {\n\t// TODO: Replace the `getAllDynamicFields` with a paginated\n\t// response, once we have better RPC support for\n\t// type filtering & batch fetching.\n\t// This can't work with pagination currently.\n\tconst data = await getAllDynamicFields(client, kioskId, pagination);\n\n\tconst listings: KioskListing[] = [];\n\tconst lockedItemIds: string[] = [];\n\n\t// extracted kiosk data.\n\tconst kioskData = extractKioskData(data, listings, lockedItemIds, kioskId);\n\n\t// split the fetching in two queries as we are most likely passing different options for each kind.\n\t// For items, we usually seek the Display.\n\t// For listings we usually seek the DF value (price) / exclusivity.\n\tconst [kiosk, listingObjects, items] = await Promise.all([\n\t\toptions.withKioskFields ? getKioskObject(client, kioskId) : Promise.resolve(undefined),\n\t\toptions.withListingPrices\n\t\t\t? getAllObjects(client, kioskData.listingIds, {\n\t\t\t\t\tshowContent: true,\n\t\t\t\t})\n\t\t\t: Promise.resolve([]),\n\t\toptions.withObjects\n\t\t\t? getAllObjects(client, kioskData.itemIds, options.objectOptions || { showDisplay: true })\n\t\t\t: Promise.resolve([]),\n\t]);\n\n\tif (options.withKioskFields) kioskData.kiosk = kiosk;\n\t// attach items listings. IF we have `options.withListingPrices === true`, it will also attach the prices.\n\tattachListingsAndPrices(kioskData, listings, listingObjects);\n\t// add `locked` status to items that are locked.\n\tattachLockedItems(kioskData, lockedItemIds);\n\n\t// Attach the objects for the queried items.\n\tattachObjects(\n\t\tkioskData,\n\t\titems.filter((x) => !!x.data).map((x) => x.data!),\n\t);\n\n\treturn {\n\t\tdata: kioskData,\n\t\tnextCursor: null,\n\t\thasNextPage: false,\n\t};\n}\n\n/**\n * A function to fetch all the user's kiosk Caps\n * And a list of the kiosk address ids.\n * Returns a list of `kioskOwnerCapIds` and `kioskIds`.\n * Extra options allow pagination.\n */\nexport async function getOwnedKiosks(\n\tclient: SuiClient,\n\taddress: string,\n\toptions?: {\n\t\tpagination?: PaginationArguments<string>;\n\t\tpersonalKioskType: string;\n\t},\n): Promise<OwnedKiosks> {\n\tif (!isValidSuiAddress(address))\n\t\treturn {\n\t\t\tnextCursor: null,\n\t\t\thasNextPage: false,\n\t\t\tkioskOwnerCaps: [],\n\t\t\tkioskIds: [],\n\t\t};\n\n\tconst filter: SuiObjectDataFilter = {\n\t\tMatchAny: [\n\t\t\t{\n\t\t\t\tStructType: KIOSK_OWNER_CAP,\n\t\t\t},\n\t\t],\n\t};\n\n\tif (options?.personalKioskType) {\n\t\tfilter.MatchAny.push({\n\t\t\tStructType: options.personalKioskType,\n\t\t});\n\t}\n\n\t// fetch owned kiosk caps, paginated.\n\tconst { data, hasNextPage, nextCursor } = await client.getOwnedObjects({\n\t\towner: address,\n\t\tfilter,\n\t\toptions: {\n\t\t\tshowContent: true,\n\t\t\tshowType: true,\n\t\t},\n\t\t...(options?.pagination || {}),\n\t});\n\n\t// get kioskIds from the OwnerCaps.\n\tconst kioskIdList = data?.map((x: SuiObjectResponse) => {\n\t\tconst fields = x.data?.content?.dataType === 'moveObject' ? x.data.content.fields : null;\n\t\t// @ts-ignore-next-line TODO: should i remove ts ignore here?\n\t\treturn (fields?.cap ? fields?.cap?.fields?.for : fields?.for) as string;\n\t\t// return (fields as { for: string })?.for;\n\t});\n\n\t// clean up data that might have an error in them.\n\t// only return valid objects.\n\tconst filteredData = data.filter((x) => 'data' in x).map((x) => x.data) as SuiObjectData[];\n\n\treturn {\n\t\tnextCursor,\n\t\thasNextPage,\n\t\tkioskOwnerCaps: filteredData.map((x, idx) => ({\n\t\t\tisPersonal: x.type !== KIOSK_OWNER_CAP,\n\t\t\tdigest: x.digest,\n\t\t\tversion: x.version,\n\t\t\tobjectId: x.objectId,\n\t\t\tkioskId: kioskIdList[idx],\n\t\t})),\n\t\tkioskIds: kioskIdList,\n\t};\n}\n\n// Get a kiosk extension data for a given kioskId and extensionType.\nexport async function fetchKioskExtension(\n\tclient: SuiClient,\n\tkioskId: string,\n\textensionType: string,\n): Promise<KioskExtension | null> {\n\tconst extension = await client.getDynamicFieldObject({\n\t\tparentId: kioskId,\n\t\tname: {\n\t\t\ttype: `0x2::kiosk_extension::ExtensionKey<${extensionType}>`,\n\t\t\tvalue: {\n\t\t\t\tdummy_field: false,\n\t\t\t},\n\t\t},\n\t});\n\n\tif (!extension.data) return null;\n\n\tconst fields = (extension?.data?.content as { fields: { [k: string]: any } })?.fields?.value\n\t\t?.fields;\n\n\treturn {\n\t\tobjectId: extension.data.objectId,\n\t\ttype: extensionType,\n\t\tisEnabled: fields?.is_enabled,\n\t\tpermissions: fields?.permissions,\n\t\tstorageId: fields?.storage?.fields?.id?.id,\n\t\tstorageSize: fields?.storage?.fields?.size,\n\t};\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type {\n\tPaginatedObjectsResponse,\n\tPaginationArguments,\n\tSuiClient,\n\tSuiObjectData,\n\tSuiObjectResponse,\n} from '@mysten/sui/client';\nimport { isValidSuiAddress } from '@mysten/sui/utils';\n\nimport type {\n\tFetchKioskOptions,\n\tKioskExtension,\n\tKioskListing,\n\tOwnedKiosks,\n\tPagedKioskData,\n} from '../types/index.js';\nimport { KIOSK_OWNER_CAP } from '../types/index.js';\nimport {\n\tattachListingsAndPrices,\n\tattachLockedItems,\n\tattachObjects,\n\textractKioskData,\n\tgetAllDynamicFields,\n\tgetAllObjects,\n\tgetKioskObject,\n} from '../utils.js';\n\nexport async function fetchKiosk(\n\tclient: SuiClient,\n\tkioskId: string,\n\tpagination: PaginationArguments<string>,\n\toptions: FetchKioskOptions,\n): Promise<PagedKioskData> {\n\t// TODO: Replace the `getAllDynamicFields` with a paginated\n\t// response, once we have better RPC support for\n\t// type filtering & batch fetching.\n\t// This can't work with pagination currently.\n\tconst data = await getAllDynamicFields(client, kioskId, pagination);\n\n\tconst listings: KioskListing[] = [];\n\tconst lockedItemIds: string[] = [];\n\n\t// extracted kiosk data.\n\tconst kioskData = extractKioskData(data, listings, lockedItemIds, kioskId);\n\n\t// split the fetching in two queries as we are most likely passing different options for each kind.\n\t// For items, we usually seek the Display.\n\t// For listings we usually seek the DF value (price) / exclusivity.\n\tconst [kiosk, listingObjects, items] = await Promise.all([\n\t\toptions.withKioskFields ? getKioskObject(client, kioskId) : Promise.resolve(undefined),\n\t\toptions.withListingPrices\n\t\t\t? getAllObjects(client, kioskData.listingIds, {\n\t\t\t\t\tshowContent: true,\n\t\t\t\t})\n\t\t\t: Promise.resolve([]),\n\t\toptions.withObjects\n\t\t\t? getAllObjects(client, kioskData.itemIds, options.objectOptions || { showDisplay: true })\n\t\t\t: Promise.resolve([]),\n\t]);\n\n\tif (options.withKioskFields) kioskData.kiosk = kiosk;\n\t// attach items listings. IF we have `options.withListingPrices === true`, it will also attach the prices.\n\tattachListingsAndPrices(kioskData, listings, listingObjects);\n\t// add `locked` status to items that are locked.\n\tattachLockedItems(kioskData, lockedItemIds);\n\n\t// Attach the objects for the queried items.\n\tattachObjects(\n\t\tkioskData,\n\t\titems.filter((x) => !!x.data).map((x) => x.data!),\n\t);\n\n\treturn {\n\t\tdata: kioskData,\n\t\tnextCursor: null,\n\t\thasNextPage: false,\n\t};\n}\n\n/**\n * A function to fetch all the user's kiosk Caps\n * And a list of the kiosk address ids.\n * Returns a list of `kioskOwnerCapIds` and `kioskIds`.\n * Extra options allow pagination.\n */\n\nconst DEFAULT_PAGE_SIZE = 50;\nconst PERSON_KIOSK_CURSOR = 'personal';\nconst OWNED_KIOSKS_CURSOR = 'owned';\nexport async function getOwnedKiosks(\n\tclient: SuiClient,\n\taddress: string,\n\toptions?: {\n\t\tpagination?: PaginationArguments<string>;\n\t\tpersonalKioskType: string;\n\t},\n): Promise<OwnedKiosks> {\n\t// TODO: this should throw an error, but I am not going to change it right now incase it breaks existing code.\n\tif (!isValidSuiAddress(address)) {\n\t\treturn {\n\t\t\tnextCursor: null,\n\t\t\thasNextPage: false,\n\t\t\tkioskOwnerCaps: [],\n\t\t\tkioskIds: [],\n\t\t};\n\t}\n\n\tconst limit = options?.pagination?.limit ?? DEFAULT_PAGE_SIZE;\n\tconst [cursorType, cursor] = options?.pagination?.cursor?.split(':') ?? [\n\t\tPERSON_KIOSK_CURSOR,\n\t\tnull,\n\t];\n\n\tif (options?.personalKioskType && cursorType === PERSON_KIOSK_CURSOR) {\n\t\tconst personalKioskResponse = formatOwnedKioskResponse(\n\t\t\tawait client.getOwnedObjects({\n\t\t\t\towner: address,\n\t\t\t\tfilter: {\n\t\t\t\t\tStructType: options.personalKioskType,\n\t\t\t\t},\n\t\t\t\toptions: {\n\t\t\t\t\tshowContent: true,\n\t\t\t\t\tshowType: true,\n\t\t\t\t},\n\t\t\t\tcursor,\n\t\t\t\tlimit,\n\t\t\t}),\n\t\t\tPERSON_KIOSK_CURSOR,\n\t\t);\n\n\t\tif (personalKioskResponse.hasNextPage) {\n\t\t\treturn personalKioskResponse;\n\t\t}\n\n\t\tconst remainingLimit = limit - personalKioskResponse.kioskOwnerCaps.length;\n\n\t\t// If we have all personal kiosks, but don't have space for the owned kiosks\n\t\t// we need to start loading owned kiosks for the next page, but don't have a real cursor\n\t\tif (remainingLimit < 1) {\n\t\t\treturn {\n\t\t\t\tnextCursor: `${OWNED_KIOSKS_CURSOR}:`,\n\t\t\t\thasNextPage: true,\n\t\t\t\tkioskOwnerCaps: personalKioskResponse.kioskOwnerCaps,\n\t\t\t\tkioskIds: personalKioskResponse.kioskIds,\n\t\t\t};\n\t\t}\n\n\t\tconst ownedKiosksResponse = formatOwnedKioskResponse(\n\t\t\tawait client.getOwnedObjects({\n\t\t\t\towner: address,\n\t\t\t\tfilter: {\n\t\t\t\t\tStructType: KIOSK_OWNER_CAP,\n\t\t\t\t},\n\t\t\t\toptions: {\n\t\t\t\t\tshowContent: true,\n\t\t\t\t\tshowType: true,\n\t\t\t\t},\n\t\t\t\tlimit: remainingLimit,\n\t\t\t}),\n\t\t\tOWNED_KIOSKS_CURSOR,\n\t\t);\n\n\t\treturn {\n\t\t\tnextCursor: ownedKiosksResponse.nextCursor,\n\t\t\thasNextPage: ownedKiosksResponse.hasNextPage,\n\t\t\tkioskOwnerCaps: [\n\t\t\t\t...personalKioskResponse.kioskOwnerCaps,\n\t\t\t\t...ownedKiosksResponse.kioskOwnerCaps,\n\t\t\t],\n\t\t\tkioskIds: [...personalKioskResponse.kioskIds, ...ownedKiosksResponse.kioskIds],\n\t\t};\n\t}\n\n\treturn formatOwnedKioskResponse(\n\t\tawait client.getOwnedObjects({\n\t\t\towner: address,\n\t\t\tfilter: {\n\t\t\t\tStructType: KIOSK_OWNER_CAP,\n\t\t\t},\n\t\t\toptions: {\n\t\t\t\tshowContent: true,\n\t\t\t\tshowType: true,\n\t\t\t},\n\t\t\t// cursor might be an empty string if the number of personal kiosks was a multiple of the limit.\n\t\t\tcursor: cursor ? cursor : null,\n\t\t\tlimit,\n\t\t}),\n\t\tOWNED_KIOSKS_CURSOR,\n\t);\n}\n\nfunction formatOwnedKioskResponse(\n\tresponse: PaginatedObjectsResponse,\n\tcursorType: string,\n): OwnedKiosks {\n\tconst { data, hasNextPage, nextCursor } = response;\n\t// get kioskIds from the OwnerCaps.\n\tconst kioskIdList = data?.map((x: SuiObjectResponse) => {\n\t\tconst fields =\n\t\t\tx.data?.content?.dataType === 'moveObject'\n\t\t\t\t? (x.data.content.fields as unknown as\n\t\t\t\t\t\t| {\n\t\t\t\t\t\t\t\tcap: { fields: { for: string } };\n\t\t\t\t\t\t\t\tfor?: never;\n\t\t\t\t\t\t }\n\t\t\t\t\t\t| {\n\t\t\t\t\t\t\t\tcap?: never;\n\t\t\t\t\t\t\t\tfor: string;\n\t\t\t\t\t\t })\n\t\t\t\t: null;\n\t\treturn fields?.cap ? fields?.cap?.fields?.for : (fields?.for as string);\n\t});\n\n\t// clean up data that might have an error in them.\n\t// only return valid objects.\n\tconst filteredData = data.filter((x) => 'data' in x).map((x) => x.data) as SuiObjectData[];\n\n\treturn {\n\t\tnextCursor: nextCursor ? `${cursorType}:${nextCursor}` : nextCursor,\n\t\thasNextPage,\n\t\tkioskOwnerCaps: filteredData.map((x, idx) => ({\n\t\t\tisPersonal: x.type !== KIOSK_OWNER_CAP,\n\t\t\tdigest: x.digest,\n\t\t\tversion: x.version,\n\t\t\tobjectId: x.objectId,\n\t\t\tkioskId: kioskIdList[idx],\n\t\t})),\n\t\tkioskIds: kioskIdList,\n\t};\n}\n\n// Get a kiosk extension data for a given kioskId and extensionType.\nexport async function fetchKioskExtension(\n\tclient: SuiClient,\n\tkioskId: string,\n\textensionType: string,\n): Promise<KioskExtension | null> {\n\tconst extension = await client.getDynamicFieldObject({\n\t\tparentId: kioskId,\n\t\tname: {\n\t\t\ttype: `0x2::kiosk_extension::ExtensionKey<${extensionType}>`,\n\t\t\tvalue: {\n\t\t\t\tdummy_field: false,\n\t\t\t},\n\t\t},\n\t});\n\n\tif (!extension.data) return null;\n\n\tconst fields = (extension?.data?.content as { fields: { [k: string]: any } })?.fields?.value\n\t\t?.fields;\n\n\treturn {\n\t\tobjectId: extension.data.objectId,\n\t\ttype: extensionType,\n\t\tisEnabled: fields?.is_enabled,\n\t\tpermissions: fields?.permissions,\n\t\tstorageId: fields?.storage?.fields?.id?.id,\n\t\tstorageSize: fields?.storage?.fields?.size,\n\t};\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_utils"]
7
7
  }
@@ -1,12 +1,6 @@
1
1
  import type { PaginationArguments, SuiClient } from '@mysten/sui/client';
2
2
  import type { FetchKioskOptions, KioskExtension, OwnedKiosks, PagedKioskData } from '../types/index.js';
3
3
  export declare function fetchKiosk(client: SuiClient, kioskId: string, pagination: PaginationArguments<string>, options: FetchKioskOptions): Promise<PagedKioskData>;
4
- /**
5
- * A function to fetch all the user's kiosk Caps
6
- * And a list of the kiosk address ids.
7
- * Returns a list of `kioskOwnerCapIds` and `kioskIds`.
8
- * Extra options allow pagination.
9
- */
10
4
  export declare function getOwnedKiosks(client: SuiClient, address: string, options?: {
11
5
  pagination?: PaginationArguments<string>;
12
6
  personalKioskType: string;
@@ -34,42 +34,101 @@ async function fetchKiosk(client, kioskId, pagination, options) {
34
34
  hasNextPage: false
35
35
  };
36
36
  }
37
+ const DEFAULT_PAGE_SIZE = 50;
38
+ const PERSON_KIOSK_CURSOR = "personal";
39
+ const OWNED_KIOSKS_CURSOR = "owned";
37
40
  async function getOwnedKiosks(client, address, options) {
38
- if (!isValidSuiAddress(address))
41
+ if (!isValidSuiAddress(address)) {
39
42
  return {
40
43
  nextCursor: null,
41
44
  hasNextPage: false,
42
45
  kioskOwnerCaps: [],
43
46
  kioskIds: []
44
47
  };
45
- const filter = {
46
- MatchAny: [
47
- {
48
- StructType: KIOSK_OWNER_CAP
49
- }
50
- ]
51
- };
52
- if (options?.personalKioskType) {
53
- filter.MatchAny.push({
54
- StructType: options.personalKioskType
55
- });
56
48
  }
57
- const { data, hasNextPage, nextCursor } = await client.getOwnedObjects({
58
- owner: address,
59
- filter,
60
- options: {
61
- showContent: true,
62
- showType: true
63
- },
64
- ...options?.pagination || {}
65
- });
49
+ const limit = options?.pagination?.limit ?? DEFAULT_PAGE_SIZE;
50
+ const [cursorType, cursor] = options?.pagination?.cursor?.split(":") ?? [
51
+ PERSON_KIOSK_CURSOR,
52
+ null
53
+ ];
54
+ if (options?.personalKioskType && cursorType === PERSON_KIOSK_CURSOR) {
55
+ const personalKioskResponse = formatOwnedKioskResponse(
56
+ await client.getOwnedObjects({
57
+ owner: address,
58
+ filter: {
59
+ StructType: options.personalKioskType
60
+ },
61
+ options: {
62
+ showContent: true,
63
+ showType: true
64
+ },
65
+ cursor,
66
+ limit
67
+ }),
68
+ PERSON_KIOSK_CURSOR
69
+ );
70
+ if (personalKioskResponse.hasNextPage) {
71
+ return personalKioskResponse;
72
+ }
73
+ const remainingLimit = limit - personalKioskResponse.kioskOwnerCaps.length;
74
+ if (remainingLimit < 1) {
75
+ return {
76
+ nextCursor: `${OWNED_KIOSKS_CURSOR}:`,
77
+ hasNextPage: true,
78
+ kioskOwnerCaps: personalKioskResponse.kioskOwnerCaps,
79
+ kioskIds: personalKioskResponse.kioskIds
80
+ };
81
+ }
82
+ const ownedKiosksResponse = formatOwnedKioskResponse(
83
+ await client.getOwnedObjects({
84
+ owner: address,
85
+ filter: {
86
+ StructType: KIOSK_OWNER_CAP
87
+ },
88
+ options: {
89
+ showContent: true,
90
+ showType: true
91
+ },
92
+ limit: remainingLimit
93
+ }),
94
+ OWNED_KIOSKS_CURSOR
95
+ );
96
+ return {
97
+ nextCursor: ownedKiosksResponse.nextCursor,
98
+ hasNextPage: ownedKiosksResponse.hasNextPage,
99
+ kioskOwnerCaps: [
100
+ ...personalKioskResponse.kioskOwnerCaps,
101
+ ...ownedKiosksResponse.kioskOwnerCaps
102
+ ],
103
+ kioskIds: [...personalKioskResponse.kioskIds, ...ownedKiosksResponse.kioskIds]
104
+ };
105
+ }
106
+ return formatOwnedKioskResponse(
107
+ await client.getOwnedObjects({
108
+ owner: address,
109
+ filter: {
110
+ StructType: KIOSK_OWNER_CAP
111
+ },
112
+ options: {
113
+ showContent: true,
114
+ showType: true
115
+ },
116
+ // cursor might be an empty string if the number of personal kiosks was a multiple of the limit.
117
+ cursor: cursor ? cursor : null,
118
+ limit
119
+ }),
120
+ OWNED_KIOSKS_CURSOR
121
+ );
122
+ }
123
+ function formatOwnedKioskResponse(response, cursorType) {
124
+ const { data, hasNextPage, nextCursor } = response;
66
125
  const kioskIdList = data?.map((x) => {
67
126
  const fields = x.data?.content?.dataType === "moveObject" ? x.data.content.fields : null;
68
127
  return fields?.cap ? fields?.cap?.fields?.for : fields?.for;
69
128
  });
70
129
  const filteredData = data.filter((x) => "data" in x).map((x) => x.data);
71
130
  return {
72
- nextCursor,
131
+ nextCursor: nextCursor ? `${cursorType}:${nextCursor}` : nextCursor,
73
132
  hasNextPage,
74
133
  kioskOwnerCaps: filteredData.map((x, idx) => ({
75
134
  isPersonal: x.type !== KIOSK_OWNER_CAP,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/query/kiosk.ts"],
4
- "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type {\n\tPaginationArguments,\n\tSuiClient,\n\tSuiObjectData,\n\tSuiObjectDataFilter,\n\tSuiObjectResponse,\n} from '@mysten/sui/client';\nimport { isValidSuiAddress } from '@mysten/sui/utils';\n\nimport type {\n\tFetchKioskOptions,\n\tKioskExtension,\n\tKioskListing,\n\tOwnedKiosks,\n\tPagedKioskData,\n} from '../types/index.js';\nimport { KIOSK_OWNER_CAP } from '../types/index.js';\nimport {\n\tattachListingsAndPrices,\n\tattachLockedItems,\n\tattachObjects,\n\textractKioskData,\n\tgetAllDynamicFields,\n\tgetAllObjects,\n\tgetKioskObject,\n} from '../utils.js';\n\nexport async function fetchKiosk(\n\tclient: SuiClient,\n\tkioskId: string,\n\tpagination: PaginationArguments<string>,\n\toptions: FetchKioskOptions,\n): Promise<PagedKioskData> {\n\t// TODO: Replace the `getAllDynamicFields` with a paginated\n\t// response, once we have better RPC support for\n\t// type filtering & batch fetching.\n\t// This can't work with pagination currently.\n\tconst data = await getAllDynamicFields(client, kioskId, pagination);\n\n\tconst listings: KioskListing[] = [];\n\tconst lockedItemIds: string[] = [];\n\n\t// extracted kiosk data.\n\tconst kioskData = extractKioskData(data, listings, lockedItemIds, kioskId);\n\n\t// split the fetching in two queries as we are most likely passing different options for each kind.\n\t// For items, we usually seek the Display.\n\t// For listings we usually seek the DF value (price) / exclusivity.\n\tconst [kiosk, listingObjects, items] = await Promise.all([\n\t\toptions.withKioskFields ? getKioskObject(client, kioskId) : Promise.resolve(undefined),\n\t\toptions.withListingPrices\n\t\t\t? getAllObjects(client, kioskData.listingIds, {\n\t\t\t\t\tshowContent: true,\n\t\t\t\t})\n\t\t\t: Promise.resolve([]),\n\t\toptions.withObjects\n\t\t\t? getAllObjects(client, kioskData.itemIds, options.objectOptions || { showDisplay: true })\n\t\t\t: Promise.resolve([]),\n\t]);\n\n\tif (options.withKioskFields) kioskData.kiosk = kiosk;\n\t// attach items listings. IF we have `options.withListingPrices === true`, it will also attach the prices.\n\tattachListingsAndPrices(kioskData, listings, listingObjects);\n\t// add `locked` status to items that are locked.\n\tattachLockedItems(kioskData, lockedItemIds);\n\n\t// Attach the objects for the queried items.\n\tattachObjects(\n\t\tkioskData,\n\t\titems.filter((x) => !!x.data).map((x) => x.data!),\n\t);\n\n\treturn {\n\t\tdata: kioskData,\n\t\tnextCursor: null,\n\t\thasNextPage: false,\n\t};\n}\n\n/**\n * A function to fetch all the user's kiosk Caps\n * And a list of the kiosk address ids.\n * Returns a list of `kioskOwnerCapIds` and `kioskIds`.\n * Extra options allow pagination.\n */\nexport async function getOwnedKiosks(\n\tclient: SuiClient,\n\taddress: string,\n\toptions?: {\n\t\tpagination?: PaginationArguments<string>;\n\t\tpersonalKioskType: string;\n\t},\n): Promise<OwnedKiosks> {\n\tif (!isValidSuiAddress(address))\n\t\treturn {\n\t\t\tnextCursor: null,\n\t\t\thasNextPage: false,\n\t\t\tkioskOwnerCaps: [],\n\t\t\tkioskIds: [],\n\t\t};\n\n\tconst filter: SuiObjectDataFilter = {\n\t\tMatchAny: [\n\t\t\t{\n\t\t\t\tStructType: KIOSK_OWNER_CAP,\n\t\t\t},\n\t\t],\n\t};\n\n\tif (options?.personalKioskType) {\n\t\tfilter.MatchAny.push({\n\t\t\tStructType: options.personalKioskType,\n\t\t});\n\t}\n\n\t// fetch owned kiosk caps, paginated.\n\tconst { data, hasNextPage, nextCursor } = await client.getOwnedObjects({\n\t\towner: address,\n\t\tfilter,\n\t\toptions: {\n\t\t\tshowContent: true,\n\t\t\tshowType: true,\n\t\t},\n\t\t...(options?.pagination || {}),\n\t});\n\n\t// get kioskIds from the OwnerCaps.\n\tconst kioskIdList = data?.map((x: SuiObjectResponse) => {\n\t\tconst fields = x.data?.content?.dataType === 'moveObject' ? x.data.content.fields : null;\n\t\t// @ts-ignore-next-line TODO: should i remove ts ignore here?\n\t\treturn (fields?.cap ? fields?.cap?.fields?.for : fields?.for) as string;\n\t\t// return (fields as { for: string })?.for;\n\t});\n\n\t// clean up data that might have an error in them.\n\t// only return valid objects.\n\tconst filteredData = data.filter((x) => 'data' in x).map((x) => x.data) as SuiObjectData[];\n\n\treturn {\n\t\tnextCursor,\n\t\thasNextPage,\n\t\tkioskOwnerCaps: filteredData.map((x, idx) => ({\n\t\t\tisPersonal: x.type !== KIOSK_OWNER_CAP,\n\t\t\tdigest: x.digest,\n\t\t\tversion: x.version,\n\t\t\tobjectId: x.objectId,\n\t\t\tkioskId: kioskIdList[idx],\n\t\t})),\n\t\tkioskIds: kioskIdList,\n\t};\n}\n\n// Get a kiosk extension data for a given kioskId and extensionType.\nexport async function fetchKioskExtension(\n\tclient: SuiClient,\n\tkioskId: string,\n\textensionType: string,\n): Promise<KioskExtension | null> {\n\tconst extension = await client.getDynamicFieldObject({\n\t\tparentId: kioskId,\n\t\tname: {\n\t\t\ttype: `0x2::kiosk_extension::ExtensionKey<${extensionType}>`,\n\t\t\tvalue: {\n\t\t\t\tdummy_field: false,\n\t\t\t},\n\t\t},\n\t});\n\n\tif (!extension.data) return null;\n\n\tconst fields = (extension?.data?.content as { fields: { [k: string]: any } })?.fields?.value\n\t\t?.fields;\n\n\treturn {\n\t\tobjectId: extension.data.objectId,\n\t\ttype: extensionType,\n\t\tisEnabled: fields?.is_enabled,\n\t\tpermissions: fields?.permissions,\n\t\tstorageId: fields?.storage?.fields?.id?.id,\n\t\tstorageSize: fields?.storage?.fields?.size,\n\t};\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type {\n\tPaginatedObjectsResponse,\n\tPaginationArguments,\n\tSuiClient,\n\tSuiObjectData,\n\tSuiObjectResponse,\n} from '@mysten/sui/client';\nimport { isValidSuiAddress } from '@mysten/sui/utils';\n\nimport type {\n\tFetchKioskOptions,\n\tKioskExtension,\n\tKioskListing,\n\tOwnedKiosks,\n\tPagedKioskData,\n} from '../types/index.js';\nimport { KIOSK_OWNER_CAP } from '../types/index.js';\nimport {\n\tattachListingsAndPrices,\n\tattachLockedItems,\n\tattachObjects,\n\textractKioskData,\n\tgetAllDynamicFields,\n\tgetAllObjects,\n\tgetKioskObject,\n} from '../utils.js';\n\nexport async function fetchKiosk(\n\tclient: SuiClient,\n\tkioskId: string,\n\tpagination: PaginationArguments<string>,\n\toptions: FetchKioskOptions,\n): Promise<PagedKioskData> {\n\t// TODO: Replace the `getAllDynamicFields` with a paginated\n\t// response, once we have better RPC support for\n\t// type filtering & batch fetching.\n\t// This can't work with pagination currently.\n\tconst data = await getAllDynamicFields(client, kioskId, pagination);\n\n\tconst listings: KioskListing[] = [];\n\tconst lockedItemIds: string[] = [];\n\n\t// extracted kiosk data.\n\tconst kioskData = extractKioskData(data, listings, lockedItemIds, kioskId);\n\n\t// split the fetching in two queries as we are most likely passing different options for each kind.\n\t// For items, we usually seek the Display.\n\t// For listings we usually seek the DF value (price) / exclusivity.\n\tconst [kiosk, listingObjects, items] = await Promise.all([\n\t\toptions.withKioskFields ? getKioskObject(client, kioskId) : Promise.resolve(undefined),\n\t\toptions.withListingPrices\n\t\t\t? getAllObjects(client, kioskData.listingIds, {\n\t\t\t\t\tshowContent: true,\n\t\t\t\t})\n\t\t\t: Promise.resolve([]),\n\t\toptions.withObjects\n\t\t\t? getAllObjects(client, kioskData.itemIds, options.objectOptions || { showDisplay: true })\n\t\t\t: Promise.resolve([]),\n\t]);\n\n\tif (options.withKioskFields) kioskData.kiosk = kiosk;\n\t// attach items listings. IF we have `options.withListingPrices === true`, it will also attach the prices.\n\tattachListingsAndPrices(kioskData, listings, listingObjects);\n\t// add `locked` status to items that are locked.\n\tattachLockedItems(kioskData, lockedItemIds);\n\n\t// Attach the objects for the queried items.\n\tattachObjects(\n\t\tkioskData,\n\t\titems.filter((x) => !!x.data).map((x) => x.data!),\n\t);\n\n\treturn {\n\t\tdata: kioskData,\n\t\tnextCursor: null,\n\t\thasNextPage: false,\n\t};\n}\n\n/**\n * A function to fetch all the user's kiosk Caps\n * And a list of the kiosk address ids.\n * Returns a list of `kioskOwnerCapIds` and `kioskIds`.\n * Extra options allow pagination.\n */\n\nconst DEFAULT_PAGE_SIZE = 50;\nconst PERSON_KIOSK_CURSOR = 'personal';\nconst OWNED_KIOSKS_CURSOR = 'owned';\nexport async function getOwnedKiosks(\n\tclient: SuiClient,\n\taddress: string,\n\toptions?: {\n\t\tpagination?: PaginationArguments<string>;\n\t\tpersonalKioskType: string;\n\t},\n): Promise<OwnedKiosks> {\n\t// TODO: this should throw an error, but I am not going to change it right now incase it breaks existing code.\n\tif (!isValidSuiAddress(address)) {\n\t\treturn {\n\t\t\tnextCursor: null,\n\t\t\thasNextPage: false,\n\t\t\tkioskOwnerCaps: [],\n\t\t\tkioskIds: [],\n\t\t};\n\t}\n\n\tconst limit = options?.pagination?.limit ?? DEFAULT_PAGE_SIZE;\n\tconst [cursorType, cursor] = options?.pagination?.cursor?.split(':') ?? [\n\t\tPERSON_KIOSK_CURSOR,\n\t\tnull,\n\t];\n\n\tif (options?.personalKioskType && cursorType === PERSON_KIOSK_CURSOR) {\n\t\tconst personalKioskResponse = formatOwnedKioskResponse(\n\t\t\tawait client.getOwnedObjects({\n\t\t\t\towner: address,\n\t\t\t\tfilter: {\n\t\t\t\t\tStructType: options.personalKioskType,\n\t\t\t\t},\n\t\t\t\toptions: {\n\t\t\t\t\tshowContent: true,\n\t\t\t\t\tshowType: true,\n\t\t\t\t},\n\t\t\t\tcursor,\n\t\t\t\tlimit,\n\t\t\t}),\n\t\t\tPERSON_KIOSK_CURSOR,\n\t\t);\n\n\t\tif (personalKioskResponse.hasNextPage) {\n\t\t\treturn personalKioskResponse;\n\t\t}\n\n\t\tconst remainingLimit = limit - personalKioskResponse.kioskOwnerCaps.length;\n\n\t\t// If we have all personal kiosks, but don't have space for the owned kiosks\n\t\t// we need to start loading owned kiosks for the next page, but don't have a real cursor\n\t\tif (remainingLimit < 1) {\n\t\t\treturn {\n\t\t\t\tnextCursor: `${OWNED_KIOSKS_CURSOR}:`,\n\t\t\t\thasNextPage: true,\n\t\t\t\tkioskOwnerCaps: personalKioskResponse.kioskOwnerCaps,\n\t\t\t\tkioskIds: personalKioskResponse.kioskIds,\n\t\t\t};\n\t\t}\n\n\t\tconst ownedKiosksResponse = formatOwnedKioskResponse(\n\t\t\tawait client.getOwnedObjects({\n\t\t\t\towner: address,\n\t\t\t\tfilter: {\n\t\t\t\t\tStructType: KIOSK_OWNER_CAP,\n\t\t\t\t},\n\t\t\t\toptions: {\n\t\t\t\t\tshowContent: true,\n\t\t\t\t\tshowType: true,\n\t\t\t\t},\n\t\t\t\tlimit: remainingLimit,\n\t\t\t}),\n\t\t\tOWNED_KIOSKS_CURSOR,\n\t\t);\n\n\t\treturn {\n\t\t\tnextCursor: ownedKiosksResponse.nextCursor,\n\t\t\thasNextPage: ownedKiosksResponse.hasNextPage,\n\t\t\tkioskOwnerCaps: [\n\t\t\t\t...personalKioskResponse.kioskOwnerCaps,\n\t\t\t\t...ownedKiosksResponse.kioskOwnerCaps,\n\t\t\t],\n\t\t\tkioskIds: [...personalKioskResponse.kioskIds, ...ownedKiosksResponse.kioskIds],\n\t\t};\n\t}\n\n\treturn formatOwnedKioskResponse(\n\t\tawait client.getOwnedObjects({\n\t\t\towner: address,\n\t\t\tfilter: {\n\t\t\t\tStructType: KIOSK_OWNER_CAP,\n\t\t\t},\n\t\t\toptions: {\n\t\t\t\tshowContent: true,\n\t\t\t\tshowType: true,\n\t\t\t},\n\t\t\t// cursor might be an empty string if the number of personal kiosks was a multiple of the limit.\n\t\t\tcursor: cursor ? cursor : null,\n\t\t\tlimit,\n\t\t}),\n\t\tOWNED_KIOSKS_CURSOR,\n\t);\n}\n\nfunction formatOwnedKioskResponse(\n\tresponse: PaginatedObjectsResponse,\n\tcursorType: string,\n): OwnedKiosks {\n\tconst { data, hasNextPage, nextCursor } = response;\n\t// get kioskIds from the OwnerCaps.\n\tconst kioskIdList = data?.map((x: SuiObjectResponse) => {\n\t\tconst fields =\n\t\t\tx.data?.content?.dataType === 'moveObject'\n\t\t\t\t? (x.data.content.fields as unknown as\n\t\t\t\t\t\t| {\n\t\t\t\t\t\t\t\tcap: { fields: { for: string } };\n\t\t\t\t\t\t\t\tfor?: never;\n\t\t\t\t\t\t }\n\t\t\t\t\t\t| {\n\t\t\t\t\t\t\t\tcap?: never;\n\t\t\t\t\t\t\t\tfor: string;\n\t\t\t\t\t\t })\n\t\t\t\t: null;\n\t\treturn fields?.cap ? fields?.cap?.fields?.for : (fields?.for as string);\n\t});\n\n\t// clean up data that might have an error in them.\n\t// only return valid objects.\n\tconst filteredData = data.filter((x) => 'data' in x).map((x) => x.data) as SuiObjectData[];\n\n\treturn {\n\t\tnextCursor: nextCursor ? `${cursorType}:${nextCursor}` : nextCursor,\n\t\thasNextPage,\n\t\tkioskOwnerCaps: filteredData.map((x, idx) => ({\n\t\t\tisPersonal: x.type !== KIOSK_OWNER_CAP,\n\t\t\tdigest: x.digest,\n\t\t\tversion: x.version,\n\t\t\tobjectId: x.objectId,\n\t\t\tkioskId: kioskIdList[idx],\n\t\t})),\n\t\tkioskIds: kioskIdList,\n\t};\n}\n\n// Get a kiosk extension data for a given kioskId and extensionType.\nexport async function fetchKioskExtension(\n\tclient: SuiClient,\n\tkioskId: string,\n\textensionType: string,\n): Promise<KioskExtension | null> {\n\tconst extension = await client.getDynamicFieldObject({\n\t\tparentId: kioskId,\n\t\tname: {\n\t\t\ttype: `0x2::kiosk_extension::ExtensionKey<${extensionType}>`,\n\t\t\tvalue: {\n\t\t\t\tdummy_field: false,\n\t\t\t},\n\t\t},\n\t});\n\n\tif (!extension.data) return null;\n\n\tconst fields = (extension?.data?.content as { fields: { [k: string]: any } })?.fields?.value\n\t\t?.fields;\n\n\treturn {\n\t\tobjectId: extension.data.objectId,\n\t\ttype: extensionType,\n\t\tisEnabled: fields?.is_enabled,\n\t\tpermissions: fields?.permissions,\n\t\tstorageId: fields?.storage?.fields?.id?.id,\n\t\tstorageSize: fields?.storage?.fields?.size,\n\t};\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }