@mysten/kiosk 0.0.0-experimental-20230529214729 → 0.0.0-experimental-20230530145812

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,6 +1,12 @@
1
1
  # @mysten/kiosk
2
2
 
3
- ## 0.0.0-experimental-20230529214729
3
+ ## 0.0.0-experimental-20230530145812
4
+
5
+ ### Minor Changes
6
+
7
+ - c322a230da: Fix fetchKiosk consistency/naming, include locked state in items
8
+
9
+ ## 1.0.0
4
10
 
5
11
  ### Major Changes
6
12
 
@@ -10,10 +16,11 @@
10
16
 
11
17
  - 528cfec314: fixes publishing flow
12
18
  - Updated dependencies [4ea96d909a]
19
+ - Updated dependencies [bcbb178c44]
13
20
  - Updated dependencies [470c27af50]
14
21
  - Updated dependencies [03828224c9]
15
22
  - Updated dependencies [671faefe3c]
16
23
  - Updated dependencies [9ce7e051b4]
17
24
  - Updated dependencies [9ce7e051b4]
18
25
  - Updated dependencies [bb50698551]
19
- - @mysten/sui.js@0.0.0-experimental-20230529214729
26
+ - @mysten/sui.js@0.35.0
package/README.md CHANGED
@@ -3,7 +3,6 @@
3
3
  > **This package is still in active development. Use at your own risk**.
4
4
  > Currently, the only supported environment is **Sui Testnet**.
5
5
 
6
-
7
6
  This Kiosk SDK library provides different utilities to interact/create/manage a [Kiosk](https://github.com/MystenLabs/sui/tree/main/kiosk).
8
7
 
9
8
  ## Installation
@@ -38,9 +37,14 @@ const getKiosk = async () => {
38
37
  data: res,
39
38
  nextCursor,
40
39
  hasNextPage,
41
- } = await fetchKiosk(provider, kioskAddress, { limit: 100 }); // could also add `cursor` for pagination
42
-
43
- console.log(res); // { listings: [], items: [], itemIds: [], listingIds: [] }
40
+ } = await fetchKiosk(
41
+ provider,
42
+ kioskAddress,
43
+ { limit: 100 },
44
+ { withListingPrices: true, withKioskFields: true },
45
+ ); // could also add `cursor` for pagination
46
+
47
+ console.log(res); // { items: [], itemIds: [], listingIds: [], kiosk: {...} }
44
48
  console.log(nextCursor); // null
45
49
  console.log(hasNextPage); // false
46
50
  };
@@ -48,6 +52,55 @@ const getKiosk = async () => {
48
52
 
49
53
  </details>
50
54
 
55
+ <details>
56
+ <summary>Purchasing an item (currently supports royalty rule deployed on testnet or no rules)</summary>
57
+
58
+ ```typescript
59
+ import { fetchKiosk } from '@mysten/kiosk';
60
+ import { Connection, JsonRpcProvider } from '@mysten/sui.js';
61
+
62
+ const provider = new JsonRpcProvider(
63
+ new Connection({ fullnode: 'https://fullnode.testnet.sui.io:443' }),
64
+ );
65
+
66
+ // the kiosk we're purchasing from
67
+ const kioskId = `0xSomeKioskAddress`;
68
+ // a sample item retrieved from `fetchKiosk` function (or hard-coded)
69
+ const item = {
70
+ isLocked: false,
71
+ objectId: "0xb892d61a9992a10c9453efcdbd14ca9720d7dc1000a2048224209c9e544ed223"
72
+ type: "0x52852c4ba80040395b259c641e70b702426a58990ff73cecf5afd31954429090::test::TestItem",
73
+ listing: {
74
+ isExclusive: false,
75
+ listingId: "0x368b512ff2514dbea814f26ec9a3d41198c00e8ed778099961e9ed22a9f0032b",
76
+ price: "20000000000" // in MIST
77
+ }
78
+ }
79
+ const purchaseItem = async (item, kioskId) => {
80
+
81
+ // fetch the policy of the item (could be an array, if there's more than one transfer policy)
82
+ const policies = await queryTransferPolicy(provider, item.type);
83
+ // selecting the first one for simplicity.
84
+ const policyId = policy[0]?.id;
85
+ // initialize tx block.
86
+ const tx = new TransactionBlock();
87
+
88
+ // Purchases the item. Right now it also resolves a royalty rule, if one exists.
89
+ // There will be some additional work to support further rules & custom ones soon.
90
+ const purchasedItem = purchaseAndResolvePolicies(tx, item.type, item.listing, kioskId, item.objectId, policy[0]);
91
+
92
+ // now we need to decide what to do with the item
93
+ // ... e.g. place() // places the item to the user's kiosk.
94
+ // (NOT YET SUPPORTED BUT WORTH MENTIONING if the item has the `kiosk_lock` rule, the resolver will place it in the kiosk automatically.
95
+ // For now, to support this rule, we need to manually resolve the `kiosk_lock` rule and place it in our owned kiosk.)
96
+
97
+ // ...finally, sign PTB & execute it.
98
+
99
+ };
100
+ ```
101
+
102
+ </details>
103
+
51
104
  <details>
52
105
  <summary>Create a kiosk, share it and get transfer the `kioskOwnerCap` to the wallet's address</summary>
53
106
 
package/dist/index.js CHANGED
@@ -26,6 +26,8 @@ __export(src_exports, {
26
26
  TRANSFER_POLICY_CREATED_EVENT: () => TRANSFER_POLICY_CREATED_EVENT,
27
27
  TRANSFER_POLICY_MODULE: () => TRANSFER_POLICY_MODULE,
28
28
  TRANSFER_POLICY_RULES_PACKAGE_ADDRESS: () => TRANSFER_POLICY_RULES_PACKAGE_ADDRESS,
29
+ attachListingsAndPrices: () => attachListingsAndPrices,
30
+ attachLockedItems: () => attachLockedItems,
29
31
  bcs: () => import_sui.bcs,
30
32
  borrow: () => borrow,
31
33
  borrowMut: () => borrowMut,
@@ -38,7 +40,6 @@ __export(src_exports, {
38
40
  extractKioskData: () => extractKioskData,
39
41
  fetchKiosk: () => fetchKiosk,
40
42
  getKioskObject: () => getKioskObject,
41
- getObjects: () => getObjects,
42
43
  getTypeWithoutPackageAddress: () => getTypeWithoutPackageAddress,
43
44
  list: () => list,
44
45
  lock: () => lock,
@@ -57,6 +58,9 @@ __export(src_exports, {
57
58
  });
58
59
  module.exports = __toCommonJS(src_exports);
59
60
 
61
+ // src/utils.ts
62
+ var import_sui2 = require("@mysten/sui.js");
63
+
60
64
  // src/bcs.ts
61
65
  var import_sui = require("@mysten/sui.js");
62
66
  import_sui.bcs.registerStructType("0x2::kiosk::Kiosk", {
@@ -107,7 +111,7 @@ async function getKioskObject(provider, id) {
107
111
  }
108
112
  return import_sui.bcs.de("0x2::kiosk::Kiosk", queryRes.data.bcs.bcsBytes, "base64");
109
113
  }
110
- function extractKioskData(data) {
114
+ function extractKioskData(data, listings, lockedItemIds) {
111
115
  return data.reduce(
112
116
  (acc, val) => {
113
117
  const type = getTypeWithoutPackageAddress(val.name.type);
@@ -115,33 +119,61 @@ function extractKioskData(data) {
115
119
  case "kiosk::Item":
116
120
  acc.itemIds.push(val.objectId);
117
121
  acc.items.push({
118
- itemId: val.objectId,
119
- itemType: val.objectType
122
+ objectId: val.objectId,
123
+ type: val.objectType,
124
+ isLocked: false
120
125
  });
121
126
  break;
122
127
  case "kiosk::Listing":
123
128
  acc.listingIds.push(val.objectId);
124
- acc.listings.push({
125
- itemId: val.name.value.id,
129
+ listings.push({
130
+ objectId: val.name.value.id,
126
131
  listingId: val.objectId,
127
132
  isExclusive: val.name.value.is_exclusive
128
133
  });
129
134
  break;
135
+ case "kiosk::Lock":
136
+ lockedItemIds?.push(val.name.value.id);
137
+ break;
130
138
  }
131
139
  return acc;
132
140
  },
133
- { listings: [], items: [], itemIds: [], listingIds: [] }
141
+ { items: [], itemIds: [], listingIds: [], extensions: [] }
134
142
  );
135
143
  }
136
- function getObjects(provider, ids, options) {
137
- if (ids.length === 0) {
138
- return Promise.resolve([]);
139
- }
140
- return provider.multiGetObjects({ ids, options });
141
- }
142
144
  var getTypeWithoutPackageAddress = (type) => {
143
145
  return type.split("::").slice(-2).join("::");
144
146
  };
147
+ var attachListingsAndPrices = (kioskData, listings, listingObjects) => {
148
+ const itemListings = listings.reduce(
149
+ (acc, item, idx) => {
150
+ acc[item.objectId] = { ...item };
151
+ if (listingObjects.length === 0)
152
+ return acc;
153
+ const data = (0, import_sui2.getObjectFields)(listingObjects[idx]);
154
+ if (!data)
155
+ return acc;
156
+ acc[item.objectId].price = data.value;
157
+ return acc;
158
+ },
159
+ {}
160
+ );
161
+ kioskData.items.map((item) => {
162
+ item.listing = itemListings[item.objectId] || void 0;
163
+ });
164
+ };
165
+ var attachLockedItems = (kioskData, lockedItemIds) => {
166
+ const lockedStatuses = lockedItemIds.reduce(
167
+ (acc, item) => {
168
+ acc[item] = true;
169
+ return acc;
170
+ },
171
+ {}
172
+ );
173
+ kioskData.items.map((item) => {
174
+ item.isLocked = lockedStatuses[item.objectId] || false;
175
+ });
176
+ };
145
177
 
146
178
  // src/tx/transfer-policy.ts
147
179
  var TRANSFER_POLICY_MODULE = "0x2::transfer_policy";
@@ -379,36 +411,27 @@ function purchaseAndResolvePolicies(tx, itemType, listing, kioskId, itemId, poli
379
411
  }
380
412
 
381
413
  // src/query/kiosk.ts
382
- var import_sui2 = require("@mysten/sui.js");
383
- async function fetchKiosk(provider, kioskId, pagination, {
384
- includeKioskFields = false,
385
- includeItems = false,
386
- withListingPrices = false,
387
- itemOptions = { showDisplay: true, showType: true }
388
- }) {
414
+ async function fetchKiosk(provider, kioskId, pagination, options) {
389
415
  const { data, nextCursor, hasNextPage } = await provider.getDynamicFields({
390
416
  parentId: kioskId,
391
417
  ...pagination
392
418
  });
393
- const kioskData = extractKioskData(data);
394
- const [kiosk, itemObjects, listingObjects] = await Promise.all([
395
- includeKioskFields ? getKioskObject(provider, kioskId) : Promise.resolve(void 0),
396
- includeItems ? getObjects(provider, kioskData.itemIds, itemOptions) : Promise.resolve([]),
397
- withListingPrices ? getObjects(provider, kioskData.listingIds, {
398
- showBcs: true,
399
- showContent: true
419
+ const listings = [];
420
+ const lockedItemIds = [];
421
+ const kioskData = extractKioskData(data, listings, lockedItemIds);
422
+ const [kiosk, listingObjects] = await Promise.all([
423
+ options.withKioskFields ? getKioskObject(provider, kioskId) : Promise.resolve(void 0),
424
+ options.withListingPrices ? provider.multiGetObjects({
425
+ ids: kioskData.listingIds,
426
+ options: {
427
+ showContent: true
428
+ }
400
429
  }) : Promise.resolve([])
401
430
  ]);
402
- if (includeKioskFields)
431
+ if (options.withKioskFields)
403
432
  kioskData.kiosk = kiosk;
404
- if (includeItems)
405
- kioskData.items = itemObjects;
406
- if (withListingPrices)
407
- kioskData.listings.map((l, i) => {
408
- const fields = (0, import_sui2.getObjectFields)(listingObjects[i]);
409
- l.price = fields?.value;
410
- return l;
411
- });
433
+ attachListingsAndPrices(kioskData, listings, listingObjects);
434
+ attachLockedItems(kioskData, lockedItemIds);
412
435
  return {
413
436
  data: kioskData,
414
437
  nextCursor,
@@ -457,6 +480,8 @@ async function queryTransferPolicy(provider, type) {
457
480
  TRANSFER_POLICY_CREATED_EVENT,
458
481
  TRANSFER_POLICY_MODULE,
459
482
  TRANSFER_POLICY_RULES_PACKAGE_ADDRESS,
483
+ attachListingsAndPrices,
484
+ attachLockedItems,
460
485
  bcs,
461
486
  borrow,
462
487
  borrowMut,
@@ -469,7 +494,6 @@ async function queryTransferPolicy(provider, type) {
469
494
  extractKioskData,
470
495
  fetchKiosk,
471
496
  getKioskObject,
472
- getObjects,
473
497
  getTypeWithoutPackageAddress,
474
498
  list,
475
499
  lock,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/bcs.ts","../src/utils.ts","../src/tx/transfer-policy.ts","../src/tx/kiosk.ts","../src/query/kiosk.ts","../src/query/transfer-policy.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nexport * from './tx/kiosk';\nexport * from './tx/transfer-policy';\nexport * from './query/kiosk';\nexport * from './bcs';\nexport * from './utils';\nexport * from './query/transfer-policy';\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { ObjectOwner, bcs } from '@mysten/sui.js';\n\n/**\n * The Kiosk object fields (for BCS queries).\n */\nexport type Kiosk = {\n id: string;\n profits: string;\n owner: string;\n itemCount: number;\n allowExtensions: boolean;\n};\n\n// Register the `Kiosk` struct for faster queries.\nbcs.registerStructType('0x2::kiosk::Kiosk', {\n id: 'address',\n profits: 'u64',\n owner: 'address',\n itemCount: 'u32',\n allowExtensions: 'bool',\n});\n\n/**\n * PurchaseCap object fields (for BCS queries).\n */\nexport type PurchaseCap = {\n id: string;\n kioskId: string;\n itemId: string;\n minPrice: string;\n};\n\n// Register the `PurchaseCap` for faster queries.\nbcs.registerStructType('0x2::kiosk::PurchaseCap', {\n id: 'address',\n kioskId: 'address',\n itemId: 'address',\n minPrice: 'u64',\n});\n\n/** Event emitted when a TransferPolicy is created. */\nexport type TransferPolicyCreated = {\n id: string;\n};\n\n// Register the `TransferPolicyCreated` event data.\nbcs.registerStructType('0x2::transfer_policy::TransferPolicyCreated', {\n id: 'address',\n});\n\n/** The `TransferPolicy` object */\nexport type TransferPolicy = {\n id: string;\n type: string;\n balance: string;\n rules: string[];\n owner: ObjectOwner;\n};\n\nbcs.registerStructType('0x2::transfer_policy::TransferPolicy', {\n id: 'address',\n balance: 'u64',\n rules: ['vector', 'string'],\n});\n\nexport { bcs };\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n JsonRpcProvider,\n SharedObjectRef,\n SuiObjectDataOptions,\n SuiObjectRef,\n TransactionArgument,\n TransactionBlock,\n} from '@mysten/sui.js';\nimport { KioskData } from './query/kiosk';\nimport { DynamicFieldInfo } from '@mysten/sui.js/dist/types/dynamic_fields';\nimport { bcs, Kiosk } from './bcs';\n\n/**\n * A valid argument for any of the Kiosk functions.\n */\nexport type ObjectArgument =\n | string\n | TransactionArgument\n | SharedObjectRef\n | SuiObjectRef;\n\n/**\n * Convert any valid input into a TransactionArgument.\n *\n * @param tx The transaction to use for creating the argument.\n * @param arg The argument to convert.\n * @returns The converted TransactionArgument.\n */\nexport function objArg(\n tx: TransactionBlock,\n arg: string | SharedObjectRef | SuiObjectRef | TransactionArgument,\n): TransactionArgument {\n if (typeof arg === 'string') {\n return tx.object(arg);\n }\n\n if ('digest' in arg && 'version' in arg && 'objectId' in arg) {\n return tx.objectRef(arg);\n }\n\n if ('objectId' in arg && 'initialSharedVersion' in arg && 'mutable' in arg) {\n return tx.sharedObjectRef(arg);\n }\n\n if ('kind' in arg) {\n return arg;\n }\n\n throw new Error('Invalid argument type');\n}\n\nexport async function getKioskObject(\n provider: JsonRpcProvider,\n id: string,\n): Promise<Kiosk> {\n const queryRes = await provider.getObject({ id, options: { showBcs: true } });\n\n if (!queryRes || queryRes.error || !queryRes.data) {\n throw new Error(`Kiosk ${id} not found; ${queryRes.error}`);\n }\n\n if (!queryRes.data.bcs || !('bcsBytes' in queryRes.data.bcs)) {\n throw new Error(`Invalid kiosk query: ${id}, expected object, got package`);\n }\n\n return bcs.de('0x2::kiosk::Kiosk', queryRes.data.bcs!.bcsBytes, 'base64');\n}\n\n// helper to extract kiosk data from dynamic fields.\nexport function extractKioskData(data: DynamicFieldInfo[]): KioskData {\n return data.reduce<KioskData>(\n (acc: KioskData, val: DynamicFieldInfo) => {\n const type = getTypeWithoutPackageAddress(val.name.type);\n\n switch (type) {\n case 'kiosk::Item':\n acc.itemIds.push(val.objectId);\n acc.items.push({\n itemId: val.objectId,\n itemType: val.objectType,\n });\n break;\n case 'kiosk::Listing':\n acc.listingIds.push(val.objectId);\n acc.listings.push({\n itemId: val.name.value.id,\n listingId: val.objectId,\n isExclusive: val.name.value.is_exclusive,\n });\n break;\n }\n return acc;\n },\n { listings: [], items: [], itemIds: [], listingIds: [] },\n );\n}\n\n// simple multiGetObjects wrapper to simplify cases on functions.\nexport function getObjects(\n provider: JsonRpcProvider,\n ids: string[],\n options: SuiObjectDataOptions,\n) {\n if (ids.length === 0) {\n return Promise.resolve([]);\n }\n\n return provider.multiGetObjects({ ids, options });\n}\n\n// e.g. 0x2::kiosk::Item -> kiosk::Item\nexport const getTypeWithoutPackageAddress = (type: string) => {\n return type.split('::').slice(-2).join('::');\n};\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { TransactionArgument, TransactionBlock } from '@mysten/sui.js';\nimport { ObjectArgument, objArg } from '../utils';\n\n/** The Transfer Policy module. */\nexport const TRANSFER_POLICY_MODULE = '0x2::transfer_policy';\n\n/** The Transer Policy Rules package address */\n// TODO: Figure out how we serve this for both testnet & mainnet (different package)\nexport const TRANSFER_POLICY_RULES_PACKAGE_ADDRESS =\n 'bd8fc1947cf119350184107a3087e2dc27efefa0dd82e25a1f699069fe81a585';\n\n/**\n * Call the `transfer_policy::new` function to create a new transfer policy.\n * Returns `transferPolicyCap`\n */\nexport function createTransferPolicy(\n tx: TransactionBlock,\n itemType: string,\n publisher: ObjectArgument,\n): TransactionArgument {\n let [transferPolicy, transferPolicyCap] = tx.moveCall({\n target: `${TRANSFER_POLICY_MODULE}::new`,\n typeArguments: [itemType],\n arguments: [objArg(tx, publisher)],\n });\n\n tx.moveCall({\n target: `0x2::transfer::public_share_object`,\n typeArguments: [itemType],\n arguments: [transferPolicy],\n });\n\n return transferPolicyCap;\n}\n\n/**\n * Call the `transfer_policy::withdraw` function to withdraw profits from a transfer policy.\n */\nexport function withdrawFromPolicy(\n tx: TransactionBlock,\n itemType: string,\n policy: ObjectArgument,\n policyCap: ObjectArgument,\n amount: string | bigint | null,\n): TransactionArgument {\n let amountArg =\n amount !== null\n ? tx.pure(amount, 'Option<u64>')\n : tx.pure({ None: true }, 'Option<u64>');\n\n let [profits] = tx.moveCall({\n target: `${TRANSFER_POLICY_MODULE}::withdraw`,\n typeArguments: [itemType],\n arguments: [objArg(tx, policy), objArg(tx, policyCap), amountArg],\n });\n\n return profits;\n}\n\n/**\n * Call the `transfer_policy::confirm_request` function to unblock the\n * transaction.\n */\nexport function confirmRequest(\n tx: TransactionBlock,\n itemType: string,\n policy: ObjectArgument,\n request: TransactionArgument,\n): void {\n tx.moveCall({\n target: `${TRANSFER_POLICY_MODULE}::confirm_request`,\n typeArguments: [itemType],\n arguments: [objArg(tx, policy), request],\n });\n}\n\n/**\n * Calls the `transfer_policy::remove_rule` function to remove a Rule from the transfer policy's ruleset.\n */\nexport function removeTransferPolicyRule(\n tx: TransactionBlock,\n itemType: string,\n ruleType: string,\n configType: string,\n policy: ObjectArgument,\n policyCap: TransactionArgument,\n): void {\n tx.moveCall({\n target: `${TRANSFER_POLICY_MODULE}::remove_rule`,\n typeArguments: [itemType, ruleType, configType],\n arguments: [objArg(tx, policy), policyCap],\n });\n}\n\n/**\n * Calculates the amount to be paid for the royalty rule to be resolved,\n * splits the coin to pass the exact amount,\n * then calls the `royalty_rule::pay` function to resolve the royalty rule.\n */\nexport function resolveRoyaltyRule(\n tx: TransactionBlock,\n itemType: string,\n price: string,\n policyId: string,\n transferRequest: TransactionArgument,\n) {\n const policyObj = objArg(tx, policyId);\n // calculates the amount\n const [amount] = tx.moveCall({\n target: `${TRANSFER_POLICY_RULES_PACKAGE_ADDRESS}::royalty_rule::fee_amount`,\n typeArguments: [itemType],\n arguments: [policyObj, objArg(tx, price)],\n });\n\n // splits the coin.\n const feeCoin = tx.splitCoins(tx.gas, [amount]);\n\n // pays the policy\n tx.moveCall({\n target: `${TRANSFER_POLICY_RULES_PACKAGE_ADDRESS}::royalty_rule::pay`,\n typeArguments: [itemType],\n arguments: [policyObj, transferRequest, feeCoin],\n });\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n SuiAddress,\n TransactionArgument,\n TransactionBlock,\n} from '@mysten/sui.js';\n\nimport { ObjectArgument, getTypeWithoutPackageAddress, objArg } from '../utils';\nimport { KioskListing } from '../query/kiosk';\nimport { TransferPolicy } from '../bcs';\nimport { confirmRequest, resolveRoyaltyRule } from './transfer-policy';\n\n/** The Kiosk module. */\nexport const KIOSK_MODULE = '0x2::kiosk';\n\n/** The Kiosk type. */\nexport const KIOSK_TYPE = `${KIOSK_MODULE}::Kiosk`;\n\n/** The Kiosk Owner Cap Type */\nexport const KIOSK_OWNER_CAP = `${KIOSK_MODULE}::KioskOwnerCap`;\n\n/**\n * Create a new shared Kiosk and returns the [kiosk, kioskOwnerCap] tuple.\n */\nexport function createKiosk(\n tx: TransactionBlock,\n): [TransactionArgument, TransactionArgument] {\n let [kiosk, kioskOwnerCap] = tx.moveCall({\n target: `${KIOSK_MODULE}::new`,\n });\n\n return [kiosk, kioskOwnerCap];\n}\n\n/**\n * Calls the `kiosk::new()` function and shares the kiosk.\n * Returns the `kioskOwnerCap` object.\n */\nexport function createKioskAndShare(tx: TransactionBlock): TransactionArgument {\n let [kiosk, kioskOwnerCap] = tx.moveCall({\n target: `${KIOSK_MODULE}::new`,\n });\n\n tx.moveCall({\n target: `0x2::transfer::public_share_object`,\n typeArguments: [KIOSK_TYPE],\n arguments: [kiosk],\n });\n\n return kioskOwnerCap;\n}\n\n/**\n * Call the `kiosk::place<T>(Kiosk, KioskOwnerCap, Item)` function.\n * Place an item to the Kiosk.\n */\nexport function place(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n item: ObjectArgument,\n): void {\n tx.moveCall({\n target: `${KIOSK_MODULE}::place`,\n typeArguments: [itemType],\n arguments: [objArg(tx, kiosk), objArg(tx, kioskCap), objArg(tx, item)],\n });\n}\n\n/**\n * Call the `kiosk::lock<T>(Kiosk, KioskOwnerCap, TransferPolicy, Item)`\n * function. Lock an item in the Kiosk.\n *\n * Unlike `place` this function requires a `TransferPolicy` to exist\n * and be passed in. This is done to make sure the item does not get\n * locked without an option to take it out.\n */\nexport function lock(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n policy: ObjectArgument,\n item: ObjectArgument,\n): void {\n tx.moveCall({\n target: `${KIOSK_MODULE}::lock`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n objArg(tx, policy),\n objArg(tx, item),\n ],\n });\n}\n\n/**\n * Call the `kiosk::take<T>(Kiosk, KioskOwnerCap, ID)` function.\n * Take an item from the Kiosk.\n */\nexport function take(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n itemId: SuiAddress,\n): TransactionArgument {\n let [item] = tx.moveCall({\n target: `${KIOSK_MODULE}::take`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n tx.pure(itemId, 'address'),\n ],\n });\n\n return item;\n}\n\n/**\n * Call the `kiosk::list<T>(Kiosk, KioskOwnerCap, ID, u64)` function.\n * List an item for sale.\n */\nexport function list(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n itemId: SuiAddress,\n price: string | bigint,\n): void {\n tx.moveCall({\n target: `${KIOSK_MODULE}::list`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n tx.pure(itemId, 'address'),\n tx.pure(price, 'u64'),\n ],\n });\n}\n\n/**\n * Call the `kiosk::list<T>(Kiosk, KioskOwnerCap, ID, u64)` function.\n * List an item for sale.\n */\nexport function delist(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n itemId: SuiAddress,\n): void {\n tx.moveCall({\n target: `${KIOSK_MODULE}::delist`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n tx.pure(itemId, 'address'),\n ],\n });\n}\n\n/**\n * Call the `kiosk::place_and_list<T>(Kiosk, KioskOwnerCap, Item, u64)` function.\n * Place an item to the Kiosk and list it for sale.\n */\nexport function placeAndList(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n item: ObjectArgument,\n price: string | bigint,\n): void {\n tx.moveCall({\n target: `${KIOSK_MODULE}::place_and_list`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n objArg(tx, item),\n tx.pure(price, 'u64'),\n ],\n });\n}\n\n/**\n * Call the `kiosk::purchase<T>(Kiosk, ID, Coin<SUI>)` function and receive an Item and\n * a TransferRequest which needs to be dealt with (via a matching TransferPolicy).\n */\nexport function purchase(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n itemId: SuiAddress,\n payment: ObjectArgument,\n): [TransactionArgument, TransactionArgument] {\n let [item, transferRequest] = tx.moveCall({\n target: `${KIOSK_MODULE}::purchase`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n tx.pure(itemId, 'address'),\n objArg(tx, payment),\n ],\n });\n\n return [item, transferRequest];\n}\n\n/**\n * Call the `kiosk::withdraw(Kiosk, KioskOwnerCap, Option<u64>)` function and receive a Coin<SUI>.\n * If the amount is null, then the entire balance will be withdrawn.\n */\nexport function withdrawFromKiosk(\n tx: TransactionBlock,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n amount: string | bigint | null,\n): TransactionArgument {\n let amountArg =\n amount !== null\n ? tx.pure(amount, 'Option<u64>')\n : tx.pure({ None: true }, 'Option<u64>');\n\n let [coin] = tx.moveCall({\n target: `${KIOSK_MODULE}::withdraw`,\n arguments: [objArg(tx, kiosk), objArg(tx, kioskCap), amountArg],\n });\n\n return coin;\n}\n\n/**\n * Call the `kiosk::borrow<T>(Kiosk, KioskOwnerCap, ID): &T` function.\n * Immutably borrow an item from the Kiosk.\n */\nexport function borrow(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n itemId: SuiAddress,\n): TransactionArgument {\n let [item] = tx.moveCall({\n target: `${KIOSK_MODULE}::borrow`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n tx.pure(itemId, 'address'),\n ],\n });\n\n return item;\n}\n\n/**\n * Call the `kiosk::borrow_mut<T>(Kiosk, KioskOwnerCap, ID): &mut T` function.\n * Mutably borrow an item from the Kiosk.\n */\nexport function borrowMut(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n itemId: SuiAddress,\n): TransactionArgument {\n let [item] = tx.moveCall({\n target: `${KIOSK_MODULE}::borrow_mut`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n tx.pure(itemId, 'address'),\n ],\n });\n\n return item;\n}\n\n/**\n * Call the `kiosk::borrow_value<T>(Kiosk, KioskOwnerCap, ID): T` function.\n * Immutably borrow an item from the Kiosk and return it in the end.\n *\n * Requires calling `returnValue` to return the item.\n */\nexport function borrowValue(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n itemId: SuiAddress,\n): [TransactionArgument, TransactionArgument] {\n let [item, promise] = tx.moveCall({\n target: `${KIOSK_MODULE}::borrow_val`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n tx.pure(itemId, 'address'),\n ],\n });\n\n return [item, promise];\n}\n\n/**\n * Call the `kiosk::return_value<T>(Kiosk, Item, Borrow)` function.\n * Return an item to the Kiosk after it was `borrowValue`-d.\n */\nexport function returnValue(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n item: TransactionArgument,\n promise: TransactionArgument,\n): void {\n tx.moveCall({\n target: `${KIOSK_MODULE}::return_val`,\n typeArguments: [itemType],\n arguments: [objArg(tx, kiosk), item, promise],\n });\n}\n\n/**\n * Completes the full purchase flow that includes:\n * 1. Purchasing the item.\n * 2. Resolving all the transfer policies (if any).\n * 3. Returns the PurchasedItem OR places the item in the user's kiosk (if there's a kiosk lock policy).\n */\nexport function purchaseAndResolvePolicies(\n tx: TransactionBlock,\n itemType: string,\n listing: KioskListing,\n kioskId: string,\n itemId: string,\n policy: TransferPolicy,\n): TransactionArgument | null {\n // if we don't pass the listing or the listing doens't have a price, return.\n if (!listing || listing?.price === undefined) return null;\n\n // Split the coin for the amount of the listing.\n const coin = tx.splitCoins(tx.gas, [tx.pure(listing.price)]);\n\n // initialize the purchase `kiosk::purchase`\n const [purchasedItem, transferRequest] = purchase(\n tx,\n itemType,\n kioskId,\n itemId,\n coin,\n );\n\n // Start resolving rules.\n // For now, we only support royalty rule.\n // Will need some tweaking to make it function properly with the other\n // ruleset.\n for (let rule of policy.rules) {\n const ruleWithoutAddr = getTypeWithoutPackageAddress(rule);\n\n switch (ruleWithoutAddr) {\n case 'royalty_rule::Rule':\n resolveRoyaltyRule(\n tx,\n itemType,\n listing.price,\n policy.id,\n transferRequest,\n );\n break;\n default:\n break;\n }\n }\n\n // confirm the Transfer Policy request.\n confirmRequest(tx, itemType, policy.id, transferRequest);\n\n return purchasedItem;\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n JsonRpcProvider,\n PaginationArguments,\n SuiAddress,\n SuiObjectDataOptions,\n SuiObjectResponse,\n getObjectFields,\n} from '@mysten/sui.js';\nimport { extractKioskData, getKioskObject, getObjects } from '../utils';\nimport { Kiosk } from '../bcs';\n\n/**\n * A dynamic field `Listing { ID, isExclusive }` attached to the Kiosk.\n * Holds a `u64` value - the price of the item.\n */\nexport type KioskListing = {\n /** The ID of the Item */\n itemId: string;\n /**\n * Whether or not there's a `PurchaseCap` issued. `true` means that\n * the listing is controlled by some logic and can't be purchased directly.\n *\n * TODO: consider renaming the field for better indication.\n */\n isExclusive: boolean;\n /** The ID of the listing */\n listingId: string;\n price?: string;\n};\n\n/**\n * A dynamic field `Item { ID }` attached to the Kiosk.\n * Holds an Item `T`. The type of the item is known upfront.\n */\nexport type KioskItem = {\n /** The ID of the Item */\n itemId: string;\n /** The type of the Item */\n itemType: string;\n};\n\n/**\n * Aggregated data from the Kiosk.\n */\nexport type KioskData = {\n items: KioskItem[] | SuiObjectResponse[];\n listings: KioskListing[];\n itemIds: string[];\n listingIds: string[];\n kiosk?: Kiosk;\n};\n\nexport type PagedKioskData = {\n data: KioskData;\n nextCursor: string | null;\n hasNextPage: boolean;\n};\n\nexport type FetchKioskOptions = {\n includeKioskFields?: boolean;\n includeItems?: boolean;\n itemOptions?: SuiObjectDataOptions;\n withListingPrices?: boolean;\n listingOptions?: SuiObjectDataOptions;\n};\n\n/**\n *\n */\nexport async function fetchKiosk(\n provider: JsonRpcProvider,\n kioskId: SuiAddress,\n pagination: PaginationArguments<string>,\n {\n includeKioskFields = false,\n includeItems = false,\n withListingPrices = false,\n itemOptions = { showDisplay: true, showType: true },\n }: FetchKioskOptions,\n): Promise<PagedKioskData> {\n const { data, nextCursor, hasNextPage } = await provider.getDynamicFields({\n parentId: kioskId,\n ...pagination,\n });\n\n // extracted kiosk data.\n const kioskData = extractKioskData(data);\n\n // split the fetching in two queries as we are most likely passing different options for each kind.\n // For items, we usually seek the Display.\n // For listings we usually seek the DF value (price) / exclusivity.\n const [kiosk, itemObjects, listingObjects] = await Promise.all([\n includeKioskFields\n ? getKioskObject(provider, kioskId)\n : Promise.resolve(undefined),\n includeItems\n ? getObjects(provider, kioskData.itemIds, itemOptions)\n : Promise.resolve([]),\n withListingPrices\n ? getObjects(provider, kioskData.listingIds, {\n showBcs: true,\n showContent: true,\n })\n : Promise.resolve([]),\n ]);\n\n if (includeKioskFields) kioskData.kiosk = kiosk;\n if (includeItems) kioskData.items = itemObjects;\n if (withListingPrices)\n kioskData.listings.map((l, i) => {\n const fields = getObjectFields(listingObjects[i]);\n // l.price = bcs.de('u64', listingObjects[i].data?.bcs.bcsBytes, 'base64');\n // TODO: Figure out a way to do this with BCS to avoid querying content.\n l.price = fields?.value;\n return l;\n });\n\n return {\n data: kioskData,\n nextCursor,\n hasNextPage,\n };\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { JsonRpcProvider } from '@mysten/sui.js';\nimport { TransferPolicy, bcs } from '../bcs';\n\n/** Name of the event emitted when a TransferPolicy for T is created. */\nexport const TRANSFER_POLICY_CREATED_EVENT = `0x2::transfer_policy::TransferPolicyCreated`;\n\n/**\n * Searches the `TransferPolicy`-s for the given type. The seach is performed via\n * the `TransferPolicyCreated` event. The policy can either be owned or shared,\n * and the caller needs to filter the results accordingly (ie single owner can not\n * be accessed by anyone but the owner).\n *\n * @param provider\n * @param type\n */\nexport async function queryTransferPolicy(\n provider: JsonRpcProvider,\n type: string,\n): Promise<TransferPolicy[]> {\n // console.log('event type: %s', `${TRANSFER_POLICY_CREATED_EVENT}<${type}>`);\n const { data } = await provider.queryEvents({\n query: {\n MoveEventType: `${TRANSFER_POLICY_CREATED_EVENT}<${type}>`,\n },\n });\n\n const search = data.map((event) => event.parsedJson as { id: string });\n const policies = await provider.multiGetObjects({\n ids: search.map((policy) => policy.id),\n options: { showBcs: true, showOwner: true },\n });\n\n return policies\n .filter((policy) => !!policy && 'data' in policy)\n .map(({ data: policy }) => {\n // should never happen; policies are objects and fetched via an event.\n // policies are filtered for null and undefined above.\n if (!policy || !policy.bcs || !('bcsBytes' in policy.bcs)) {\n throw new Error(\n `Invalid policy: ${policy?.objectId}, expected object, got package`,\n );\n }\n\n let parsed = bcs.de(\n '0x2::transfer_policy::TransferPolicy',\n policy.bcs.bcsBytes,\n 'base64',\n );\n\n return {\n id: policy?.objectId,\n type: `0x2::transfer_policy::TransferPolicy<${type}>`,\n owner: policy?.owner!,\n rules: parsed.rules,\n balance: parsed.balance,\n } as TransferPolicy;\n });\n}\n"],"mappings":"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","names":["import_sui"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/bcs.ts","../src/tx/transfer-policy.ts","../src/tx/kiosk.ts","../src/query/kiosk.ts","../src/query/transfer-policy.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nexport * from './tx/kiosk';\nexport * from './tx/transfer-policy';\nexport * from './query/kiosk';\nexport * from './bcs';\nexport * from './utils';\nexport * from './query/transfer-policy';\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n JsonRpcProvider,\n ObjectId,\n SharedObjectRef,\n SuiObjectRef,\n SuiObjectResponse,\n TransactionArgument,\n TransactionBlock,\n getObjectFields,\n} from '@mysten/sui.js';\nimport { KioskData, KioskListing } from './query/kiosk';\nimport { DynamicFieldInfo } from '@mysten/sui.js/dist/types/dynamic_fields';\nimport { bcs, Kiosk } from './bcs';\n\n/**\n * A valid argument for any of the Kiosk functions.\n */\nexport type ObjectArgument =\n | string\n | TransactionArgument\n | SharedObjectRef\n | SuiObjectRef;\n\n/**\n * Convert any valid input into a TransactionArgument.\n *\n * @param tx The transaction to use for creating the argument.\n * @param arg The argument to convert.\n * @returns The converted TransactionArgument.\n */\nexport function objArg(\n tx: TransactionBlock,\n arg: string | SharedObjectRef | SuiObjectRef | TransactionArgument,\n): TransactionArgument {\n if (typeof arg === 'string') {\n return tx.object(arg);\n }\n\n if ('digest' in arg && 'version' in arg && 'objectId' in arg) {\n return tx.objectRef(arg);\n }\n\n if ('objectId' in arg && 'initialSharedVersion' in arg && 'mutable' in arg) {\n return tx.sharedObjectRef(arg);\n }\n\n if ('kind' in arg) {\n return arg;\n }\n\n throw new Error('Invalid argument type');\n}\n\nexport async function getKioskObject(\n provider: JsonRpcProvider,\n id: string,\n): Promise<Kiosk> {\n const queryRes = await provider.getObject({ id, options: { showBcs: true } });\n\n if (!queryRes || queryRes.error || !queryRes.data) {\n throw new Error(`Kiosk ${id} not found; ${queryRes.error}`);\n }\n\n if (!queryRes.data.bcs || !('bcsBytes' in queryRes.data.bcs)) {\n throw new Error(`Invalid kiosk query: ${id}, expected object, got package`);\n }\n\n return bcs.de('0x2::kiosk::Kiosk', queryRes.data.bcs!.bcsBytes, 'base64');\n}\n\n// helper to extract kiosk data from dynamic fields.\nexport function extractKioskData(\n data: DynamicFieldInfo[],\n listings: KioskListing[],\n lockedItemIds: string[],\n): KioskData {\n return data.reduce<KioskData>(\n (acc: KioskData, val: DynamicFieldInfo) => {\n const type = getTypeWithoutPackageAddress(val.name.type);\n\n switch (type) {\n case 'kiosk::Item':\n acc.itemIds.push(val.objectId);\n acc.items.push({\n objectId: val.objectId,\n type: val.objectType,\n isLocked: false,\n });\n break;\n case 'kiosk::Listing':\n acc.listingIds.push(val.objectId);\n listings.push({\n objectId: val.name.value.id,\n listingId: val.objectId,\n isExclusive: val.name.value.is_exclusive,\n });\n break;\n case 'kiosk::Lock':\n lockedItemIds?.push(val.name.value.id);\n break;\n }\n return acc;\n },\n { items: [], itemIds: [], listingIds: [], extensions: [] },\n );\n}\n\n// e.g. 0x2::kiosk::Item -> kiosk::Item\nexport const getTypeWithoutPackageAddress = (type: string) => {\n return type.split('::').slice(-2).join('::');\n};\n\n/**\n * A helper that attaches the listing prices to kiosk listings.\n */\nexport const attachListingsAndPrices = (\n kioskData: KioskData,\n listings: KioskListing[],\n listingObjects: SuiObjectResponse[],\n) => {\n // map item listings as {item_id: KioskListing}\n // for easier mapping on the nex\n const itemListings = listings.reduce<Record<ObjectId, KioskListing>>(\n (acc: Record<ObjectId, KioskListing>, item, idx) => {\n acc[item.objectId] = { ...item };\n\n // return in case we don't have any listing objects.\n // that's the case when we don't have the `listingPrices` included.\n if (listingObjects.length === 0) return acc;\n\n const data = getObjectFields(listingObjects[idx]);\n if (!data) return acc;\n\n acc[item.objectId].price = data.value;\n return acc;\n },\n {},\n );\n\n kioskData.items.map((item) => {\n item.listing = itemListings[item.objectId] || undefined;\n });\n};\n\n/**\n * A Helper to attach locked state to items in Kiosk Data.\n */\nexport const attachLockedItems = (\n kioskData: KioskData,\n lockedItemIds: ObjectId[],\n) => {\n // map lock status in an array of type { item_id: true }\n const lockedStatuses = lockedItemIds.reduce<Record<ObjectId, boolean>>(\n (acc: Record<ObjectId, boolean>, item: string) => {\n acc[item] = true;\n return acc;\n },\n {},\n );\n\n // parse lockedItemIds and attach their locked status.\n kioskData.items.map((item) => {\n item.isLocked = lockedStatuses[item.objectId] || false;\n });\n};\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { ObjectOwner, bcs } from '@mysten/sui.js';\n\n/**\n * The Kiosk object fields (for BCS queries).\n */\nexport type Kiosk = {\n id: string;\n profits: string;\n owner: string;\n itemCount: number;\n allowExtensions: boolean;\n};\n\n// Register the `Kiosk` struct for faster queries.\nbcs.registerStructType('0x2::kiosk::Kiosk', {\n id: 'address',\n profits: 'u64',\n owner: 'address',\n itemCount: 'u32',\n allowExtensions: 'bool',\n});\n\n/**\n * PurchaseCap object fields (for BCS queries).\n */\nexport type PurchaseCap = {\n id: string;\n kioskId: string;\n itemId: string;\n minPrice: string;\n};\n\n// Register the `PurchaseCap` for faster queries.\nbcs.registerStructType('0x2::kiosk::PurchaseCap', {\n id: 'address',\n kioskId: 'address',\n itemId: 'address',\n minPrice: 'u64',\n});\n\n/** Event emitted when a TransferPolicy is created. */\nexport type TransferPolicyCreated = {\n id: string;\n};\n\n// Register the `TransferPolicyCreated` event data.\nbcs.registerStructType('0x2::transfer_policy::TransferPolicyCreated', {\n id: 'address',\n});\n\n/** The `TransferPolicy` object */\nexport type TransferPolicy = {\n id: string;\n type: string;\n balance: string;\n rules: string[];\n owner: ObjectOwner;\n};\n\nbcs.registerStructType('0x2::transfer_policy::TransferPolicy', {\n id: 'address',\n balance: 'u64',\n rules: ['vector', 'string'],\n});\n\nexport { bcs };\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { TransactionArgument, TransactionBlock } from '@mysten/sui.js';\nimport { ObjectArgument, objArg } from '../utils';\n\n/** The Transfer Policy module. */\nexport const TRANSFER_POLICY_MODULE = '0x2::transfer_policy';\n\n/** The Transer Policy Rules package address */\n// TODO: Figure out how we serve this for both testnet & mainnet (different package)\nexport const TRANSFER_POLICY_RULES_PACKAGE_ADDRESS =\n 'bd8fc1947cf119350184107a3087e2dc27efefa0dd82e25a1f699069fe81a585';\n\n/**\n * Call the `transfer_policy::new` function to create a new transfer policy.\n * Returns `transferPolicyCap`\n */\nexport function createTransferPolicy(\n tx: TransactionBlock,\n itemType: string,\n publisher: ObjectArgument,\n): TransactionArgument {\n let [transferPolicy, transferPolicyCap] = tx.moveCall({\n target: `${TRANSFER_POLICY_MODULE}::new`,\n typeArguments: [itemType],\n arguments: [objArg(tx, publisher)],\n });\n\n tx.moveCall({\n target: `0x2::transfer::public_share_object`,\n typeArguments: [itemType],\n arguments: [transferPolicy],\n });\n\n return transferPolicyCap;\n}\n\n/**\n * Call the `transfer_policy::withdraw` function to withdraw profits from a transfer policy.\n */\nexport function withdrawFromPolicy(\n tx: TransactionBlock,\n itemType: string,\n policy: ObjectArgument,\n policyCap: ObjectArgument,\n amount: string | bigint | null,\n): TransactionArgument {\n let amountArg =\n amount !== null\n ? tx.pure(amount, 'Option<u64>')\n : tx.pure({ None: true }, 'Option<u64>');\n\n let [profits] = tx.moveCall({\n target: `${TRANSFER_POLICY_MODULE}::withdraw`,\n typeArguments: [itemType],\n arguments: [objArg(tx, policy), objArg(tx, policyCap), amountArg],\n });\n\n return profits;\n}\n\n/**\n * Call the `transfer_policy::confirm_request` function to unblock the\n * transaction.\n */\nexport function confirmRequest(\n tx: TransactionBlock,\n itemType: string,\n policy: ObjectArgument,\n request: TransactionArgument,\n): void {\n tx.moveCall({\n target: `${TRANSFER_POLICY_MODULE}::confirm_request`,\n typeArguments: [itemType],\n arguments: [objArg(tx, policy), request],\n });\n}\n\n/**\n * Calls the `transfer_policy::remove_rule` function to remove a Rule from the transfer policy's ruleset.\n */\nexport function removeTransferPolicyRule(\n tx: TransactionBlock,\n itemType: string,\n ruleType: string,\n configType: string,\n policy: ObjectArgument,\n policyCap: TransactionArgument,\n): void {\n tx.moveCall({\n target: `${TRANSFER_POLICY_MODULE}::remove_rule`,\n typeArguments: [itemType, ruleType, configType],\n arguments: [objArg(tx, policy), policyCap],\n });\n}\n\n/**\n * Calculates the amount to be paid for the royalty rule to be resolved,\n * splits the coin to pass the exact amount,\n * then calls the `royalty_rule::pay` function to resolve the royalty rule.\n */\nexport function resolveRoyaltyRule(\n tx: TransactionBlock,\n itemType: string,\n price: string,\n policyId: string,\n transferRequest: TransactionArgument,\n) {\n const policyObj = objArg(tx, policyId);\n // calculates the amount\n const [amount] = tx.moveCall({\n target: `${TRANSFER_POLICY_RULES_PACKAGE_ADDRESS}::royalty_rule::fee_amount`,\n typeArguments: [itemType],\n arguments: [policyObj, objArg(tx, price)],\n });\n\n // splits the coin.\n const feeCoin = tx.splitCoins(tx.gas, [amount]);\n\n // pays the policy\n tx.moveCall({\n target: `${TRANSFER_POLICY_RULES_PACKAGE_ADDRESS}::royalty_rule::pay`,\n typeArguments: [itemType],\n arguments: [policyObj, transferRequest, feeCoin],\n });\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n SuiAddress,\n TransactionArgument,\n TransactionBlock,\n} from '@mysten/sui.js';\n\nimport { ObjectArgument, getTypeWithoutPackageAddress, objArg } from '../utils';\nimport { KioskListing } from '../query/kiosk';\nimport { TransferPolicy } from '../bcs';\nimport { confirmRequest, resolveRoyaltyRule } from './transfer-policy';\n\n/** The Kiosk module. */\nexport const KIOSK_MODULE = '0x2::kiosk';\n\n/** The Kiosk type. */\nexport const KIOSK_TYPE = `${KIOSK_MODULE}::Kiosk`;\n\n/** The Kiosk Owner Cap Type */\nexport const KIOSK_OWNER_CAP = `${KIOSK_MODULE}::KioskOwnerCap`;\n\n/**\n * Create a new shared Kiosk and returns the [kiosk, kioskOwnerCap] tuple.\n */\nexport function createKiosk(\n tx: TransactionBlock,\n): [TransactionArgument, TransactionArgument] {\n let [kiosk, kioskOwnerCap] = tx.moveCall({\n target: `${KIOSK_MODULE}::new`,\n });\n\n return [kiosk, kioskOwnerCap];\n}\n\n/**\n * Calls the `kiosk::new()` function and shares the kiosk.\n * Returns the `kioskOwnerCap` object.\n */\nexport function createKioskAndShare(tx: TransactionBlock): TransactionArgument {\n let [kiosk, kioskOwnerCap] = tx.moveCall({\n target: `${KIOSK_MODULE}::new`,\n });\n\n tx.moveCall({\n target: `0x2::transfer::public_share_object`,\n typeArguments: [KIOSK_TYPE],\n arguments: [kiosk],\n });\n\n return kioskOwnerCap;\n}\n\n/**\n * Call the `kiosk::place<T>(Kiosk, KioskOwnerCap, Item)` function.\n * Place an item to the Kiosk.\n */\nexport function place(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n item: ObjectArgument,\n): void {\n tx.moveCall({\n target: `${KIOSK_MODULE}::place`,\n typeArguments: [itemType],\n arguments: [objArg(tx, kiosk), objArg(tx, kioskCap), objArg(tx, item)],\n });\n}\n\n/**\n * Call the `kiosk::lock<T>(Kiosk, KioskOwnerCap, TransferPolicy, Item)`\n * function. Lock an item in the Kiosk.\n *\n * Unlike `place` this function requires a `TransferPolicy` to exist\n * and be passed in. This is done to make sure the item does not get\n * locked without an option to take it out.\n */\nexport function lock(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n policy: ObjectArgument,\n item: ObjectArgument,\n): void {\n tx.moveCall({\n target: `${KIOSK_MODULE}::lock`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n objArg(tx, policy),\n objArg(tx, item),\n ],\n });\n}\n\n/**\n * Call the `kiosk::take<T>(Kiosk, KioskOwnerCap, ID)` function.\n * Take an item from the Kiosk.\n */\nexport function take(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n itemId: SuiAddress,\n): TransactionArgument {\n let [item] = tx.moveCall({\n target: `${KIOSK_MODULE}::take`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n tx.pure(itemId, 'address'),\n ],\n });\n\n return item;\n}\n\n/**\n * Call the `kiosk::list<T>(Kiosk, KioskOwnerCap, ID, u64)` function.\n * List an item for sale.\n */\nexport function list(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n itemId: SuiAddress,\n price: string | bigint,\n): void {\n tx.moveCall({\n target: `${KIOSK_MODULE}::list`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n tx.pure(itemId, 'address'),\n tx.pure(price, 'u64'),\n ],\n });\n}\n\n/**\n * Call the `kiosk::list<T>(Kiosk, KioskOwnerCap, ID, u64)` function.\n * List an item for sale.\n */\nexport function delist(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n itemId: SuiAddress,\n): void {\n tx.moveCall({\n target: `${KIOSK_MODULE}::delist`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n tx.pure(itemId, 'address'),\n ],\n });\n}\n\n/**\n * Call the `kiosk::place_and_list<T>(Kiosk, KioskOwnerCap, Item, u64)` function.\n * Place an item to the Kiosk and list it for sale.\n */\nexport function placeAndList(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n item: ObjectArgument,\n price: string | bigint,\n): void {\n tx.moveCall({\n target: `${KIOSK_MODULE}::place_and_list`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n objArg(tx, item),\n tx.pure(price, 'u64'),\n ],\n });\n}\n\n/**\n * Call the `kiosk::purchase<T>(Kiosk, ID, Coin<SUI>)` function and receive an Item and\n * a TransferRequest which needs to be dealt with (via a matching TransferPolicy).\n */\nexport function purchase(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n itemId: SuiAddress,\n payment: ObjectArgument,\n): [TransactionArgument, TransactionArgument] {\n let [item, transferRequest] = tx.moveCall({\n target: `${KIOSK_MODULE}::purchase`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n tx.pure(itemId, 'address'),\n objArg(tx, payment),\n ],\n });\n\n return [item, transferRequest];\n}\n\n/**\n * Call the `kiosk::withdraw(Kiosk, KioskOwnerCap, Option<u64>)` function and receive a Coin<SUI>.\n * If the amount is null, then the entire balance will be withdrawn.\n */\nexport function withdrawFromKiosk(\n tx: TransactionBlock,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n amount: string | bigint | null,\n): TransactionArgument {\n let amountArg =\n amount !== null\n ? tx.pure(amount, 'Option<u64>')\n : tx.pure({ None: true }, 'Option<u64>');\n\n let [coin] = tx.moveCall({\n target: `${KIOSK_MODULE}::withdraw`,\n arguments: [objArg(tx, kiosk), objArg(tx, kioskCap), amountArg],\n });\n\n return coin;\n}\n\n/**\n * Call the `kiosk::borrow<T>(Kiosk, KioskOwnerCap, ID): &T` function.\n * Immutably borrow an item from the Kiosk.\n */\nexport function borrow(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n itemId: SuiAddress,\n): TransactionArgument {\n let [item] = tx.moveCall({\n target: `${KIOSK_MODULE}::borrow`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n tx.pure(itemId, 'address'),\n ],\n });\n\n return item;\n}\n\n/**\n * Call the `kiosk::borrow_mut<T>(Kiosk, KioskOwnerCap, ID): &mut T` function.\n * Mutably borrow an item from the Kiosk.\n */\nexport function borrowMut(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n itemId: SuiAddress,\n): TransactionArgument {\n let [item] = tx.moveCall({\n target: `${KIOSK_MODULE}::borrow_mut`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n tx.pure(itemId, 'address'),\n ],\n });\n\n return item;\n}\n\n/**\n * Call the `kiosk::borrow_value<T>(Kiosk, KioskOwnerCap, ID): T` function.\n * Immutably borrow an item from the Kiosk and return it in the end.\n *\n * Requires calling `returnValue` to return the item.\n */\nexport function borrowValue(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n itemId: SuiAddress,\n): [TransactionArgument, TransactionArgument] {\n let [item, promise] = tx.moveCall({\n target: `${KIOSK_MODULE}::borrow_val`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n tx.pure(itemId, 'address'),\n ],\n });\n\n return [item, promise];\n}\n\n/**\n * Call the `kiosk::return_value<T>(Kiosk, Item, Borrow)` function.\n * Return an item to the Kiosk after it was `borrowValue`-d.\n */\nexport function returnValue(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n item: TransactionArgument,\n promise: TransactionArgument,\n): void {\n tx.moveCall({\n target: `${KIOSK_MODULE}::return_val`,\n typeArguments: [itemType],\n arguments: [objArg(tx, kiosk), item, promise],\n });\n}\n\n/**\n * Completes the full purchase flow that includes:\n * 1. Purchasing the item.\n * 2. Resolving all the transfer policies (if any).\n * 3. Returns the PurchasedItem OR places the item in the user's kiosk (if there's a kiosk lock policy).\n */\nexport function purchaseAndResolvePolicies(\n tx: TransactionBlock,\n itemType: string,\n listing: KioskListing,\n kioskId: string,\n itemId: string,\n policy: TransferPolicy,\n): TransactionArgument | null {\n // if we don't pass the listing or the listing doens't have a price, return.\n if (!listing || listing?.price === undefined) return null;\n\n // Split the coin for the amount of the listing.\n const coin = tx.splitCoins(tx.gas, [tx.pure(listing.price)]);\n\n // initialize the purchase `kiosk::purchase`\n const [purchasedItem, transferRequest] = purchase(\n tx,\n itemType,\n kioskId,\n itemId,\n coin,\n );\n\n // Start resolving rules.\n // For now, we only support royalty rule.\n // Will need some tweaking to make it function properly with the other\n // ruleset.\n for (let rule of policy.rules) {\n const ruleWithoutAddr = getTypeWithoutPackageAddress(rule);\n\n switch (ruleWithoutAddr) {\n case 'royalty_rule::Rule':\n resolveRoyaltyRule(\n tx,\n itemType,\n listing.price,\n policy.id,\n transferRequest,\n );\n break;\n default:\n break;\n }\n }\n\n // confirm the Transfer Policy request.\n confirmRequest(tx, itemType, policy.id, transferRequest);\n\n return purchasedItem;\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n JsonRpcProvider,\n ObjectId,\n ObjectType,\n PaginationArguments,\n SuiAddress,\n} from '@mysten/sui.js';\nimport {\n attachListingsAndPrices,\n attachLockedItems,\n extractKioskData,\n getKioskObject,\n} from '../utils';\nimport { Kiosk } from '../bcs';\n\n/**\n * A dynamic field `Listing { ID, isExclusive }` attached to the Kiosk.\n * Holds a `u64` value - the price of the item.\n */\nexport type KioskListing = {\n /** The ID of the Item */\n objectId: ObjectId;\n /**\n * Whether or not there's a `PurchaseCap` issued. `true` means that\n * the listing is controlled by some logic and can't be purchased directly.\n *\n * TODO: consider renaming the field for better indication.\n */\n isExclusive: boolean;\n /** The ID of the listing */\n listingId: ObjectId;\n price?: string;\n};\n\n/**\n * A dynamic field `Item { ID }` attached to the Kiosk.\n * Holds an Item `T`. The type of the item is known upfront.\n */\nexport type KioskItem = {\n /** The ID of the Item */\n objectId: ObjectId;\n /** The type of the Item */\n type: ObjectType;\n /** Whether the item is Locked (there must be a `Lock` Dynamic Field) */\n isLocked: boolean;\n /** Optional listing */\n listing?: KioskListing;\n};\n/**\n * Aggregated data from the Kiosk.\n */\nexport type KioskData = {\n items: KioskItem[];\n itemIds: ObjectId[];\n listingIds: ObjectId[];\n kiosk?: Kiosk;\n extensions: any[]; // type will be defined on later versions of the SDK.\n};\n\nexport type PagedKioskData = {\n data: KioskData;\n nextCursor: string | null;\n hasNextPage: boolean;\n};\n\nexport type FetchKioskOptions = {\n withKioskFields?: boolean;\n withListingPrices?: boolean;\n};\n\nexport async function fetchKiosk(\n provider: JsonRpcProvider,\n kioskId: SuiAddress,\n pagination: PaginationArguments<string>,\n options: FetchKioskOptions,\n): Promise<PagedKioskData> {\n const { data, nextCursor, hasNextPage } = await provider.getDynamicFields({\n parentId: kioskId,\n ...pagination,\n });\n\n const listings: KioskListing[] = [];\n const lockedItemIds: ObjectId[] = [];\n\n // extracted kiosk data.\n const kioskData = extractKioskData(data, listings, lockedItemIds);\n\n // split the fetching in two queries as we are most likely passing different options for each kind.\n // For items, we usually seek the Display.\n // For listings we usually seek the DF value (price) / exclusivity.\n const [kiosk, listingObjects] = await Promise.all([\n options.withKioskFields\n ? getKioskObject(provider, kioskId)\n : Promise.resolve(undefined),\n options.withListingPrices\n ? provider.multiGetObjects({\n ids: kioskData.listingIds,\n options: {\n showContent: true,\n },\n })\n : Promise.resolve([]),\n ]);\n\n if (options.withKioskFields) kioskData.kiosk = kiosk;\n // attach items listings. IF we have `options.withListingPrices === true`, it will also attach the prices.\n attachListingsAndPrices(kioskData, listings, listingObjects);\n // add `locked` status to items that are locked.\n attachLockedItems(kioskData, lockedItemIds);\n\n return {\n data: kioskData,\n nextCursor,\n hasNextPage,\n };\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { JsonRpcProvider } from '@mysten/sui.js';\nimport { TransferPolicy, bcs } from '../bcs';\n\n/** Name of the event emitted when a TransferPolicy for T is created. */\nexport const TRANSFER_POLICY_CREATED_EVENT = `0x2::transfer_policy::TransferPolicyCreated`;\n\n/**\n * Searches the `TransferPolicy`-s for the given type. The seach is performed via\n * the `TransferPolicyCreated` event. The policy can either be owned or shared,\n * and the caller needs to filter the results accordingly (ie single owner can not\n * be accessed by anyone but the owner).\n *\n * @param provider\n * @param type\n */\nexport async function queryTransferPolicy(\n provider: JsonRpcProvider,\n type: string,\n): Promise<TransferPolicy[]> {\n // console.log('event type: %s', `${TRANSFER_POLICY_CREATED_EVENT}<${type}>`);\n const { data } = await provider.queryEvents({\n query: {\n MoveEventType: `${TRANSFER_POLICY_CREATED_EVENT}<${type}>`,\n },\n });\n\n const search = data.map((event) => event.parsedJson as { id: string });\n const policies = await provider.multiGetObjects({\n ids: search.map((policy) => policy.id),\n options: { showBcs: true, showOwner: true },\n });\n\n return policies\n .filter((policy) => !!policy && 'data' in policy)\n .map(({ data: policy }) => {\n // should never happen; policies are objects and fetched via an event.\n // policies are filtered for null and undefined above.\n if (!policy || !policy.bcs || !('bcsBytes' in policy.bcs)) {\n throw new Error(\n `Invalid policy: ${policy?.objectId}, expected object, got package`,\n );\n }\n\n let parsed = bcs.de(\n '0x2::transfer_policy::TransferPolicy',\n policy.bcs.bcsBytes,\n 'base64',\n );\n\n return {\n id: policy?.objectId,\n type: `0x2::transfer_policy::TransferPolicy<${type}>`,\n owner: policy?.owner!,\n rules: parsed.rules,\n balance: parsed.balance,\n } as TransferPolicy;\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACGA,IAAAA,cASO;;;ACTP,iBAAiC;AAcjC,eAAI,mBAAmB,qBAAqB;AAAA,EAC1C,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,OAAO;AAAA,EACP,WAAW;AAAA,EACX,iBAAiB;AACnB,CAAC;AAaD,eAAI,mBAAmB,2BAA2B;AAAA,EAChD,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AACZ,CAAC;AAQD,eAAI,mBAAmB,+CAA+C;AAAA,EACpE,IAAI;AACN,CAAC;AAWD,eAAI,mBAAmB,wCAAwC;AAAA,EAC7D,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,OAAO,CAAC,UAAU,QAAQ;AAC5B,CAAC;;;ADjCM,SAAS,OACd,IACA,KACqB;AACrB,MAAI,OAAO,QAAQ,UAAU;AAC3B,WAAO,GAAG,OAAO,GAAG;AAAA,EACtB;AAEA,MAAI,YAAY,OAAO,aAAa,OAAO,cAAc,KAAK;AAC5D,WAAO,GAAG,UAAU,GAAG;AAAA,EACzB;AAEA,MAAI,cAAc,OAAO,0BAA0B,OAAO,aAAa,KAAK;AAC1E,WAAO,GAAG,gBAAgB,GAAG;AAAA,EAC/B;AAEA,MAAI,UAAU,KAAK;AACjB,WAAO;AAAA,EACT;AAEA,QAAM,IAAI,MAAM,uBAAuB;AACzC;AAEA,eAAsB,eACpB,UACA,IACgB;AAChB,QAAM,WAAW,MAAM,SAAS,UAAU,EAAE,IAAI,SAAS,EAAE,SAAS,KAAK,EAAE,CAAC;AAE5E,MAAI,CAAC,YAAY,SAAS,SAAS,CAAC,SAAS,MAAM;AACjD,UAAM,IAAI,MAAM,SAAS,iBAAiB,SAAS,OAAO;AAAA,EAC5D;AAEA,MAAI,CAAC,SAAS,KAAK,OAAO,EAAE,cAAc,SAAS,KAAK,MAAM;AAC5D,UAAM,IAAI,MAAM,wBAAwB,kCAAkC;AAAA,EAC5E;AAEA,SAAO,eAAI,GAAG,qBAAqB,SAAS,KAAK,IAAK,UAAU,QAAQ;AAC1E;AAGO,SAAS,iBACd,MACA,UACA,eACW;AACX,SAAO,KAAK;AAAA,IACV,CAAC,KAAgB,QAA0B;AACzC,YAAM,OAAO,6BAA6B,IAAI,KAAK,IAAI;AAEvD,cAAQ,MAAM;AAAA,QACZ,KAAK;AACH,cAAI,QAAQ,KAAK,IAAI,QAAQ;AAC7B,cAAI,MAAM,KAAK;AAAA,YACb,UAAU,IAAI;AAAA,YACd,MAAM,IAAI;AAAA,YACV,UAAU;AAAA,UACZ,CAAC;AACD;AAAA,QACF,KAAK;AACH,cAAI,WAAW,KAAK,IAAI,QAAQ;AAChC,mBAAS,KAAK;AAAA,YACZ,UAAU,IAAI,KAAK,MAAM;AAAA,YACzB,WAAW,IAAI;AAAA,YACf,aAAa,IAAI,KAAK,MAAM;AAAA,UAC9B,CAAC;AACD;AAAA,QACF,KAAK;AACH,yBAAe,KAAK,IAAI,KAAK,MAAM,EAAE;AACrC;AAAA,MACJ;AACA,aAAO;AAAA,IACT;AAAA,IACA,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,GAAG,YAAY,CAAC,GAAG,YAAY,CAAC,EAAE;AAAA,EAC3D;AACF;AAGO,IAAM,+BAA+B,CAAC,SAAiB;AAC5D,SAAO,KAAK,MAAM,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,IAAI;AAC7C;AAKO,IAAM,0BAA0B,CACrC,WACA,UACA,mBACG;AAGH,QAAM,eAAe,SAAS;AAAA,IAC5B,CAAC,KAAqC,MAAM,QAAQ;AAClD,UAAI,KAAK,QAAQ,IAAI,EAAE,GAAG,KAAK;AAI/B,UAAI,eAAe,WAAW;AAAG,eAAO;AAExC,YAAM,WAAO,6BAAgB,eAAe,GAAG,CAAC;AAChD,UAAI,CAAC;AAAM,eAAO;AAElB,UAAI,KAAK,QAAQ,EAAE,QAAQ,KAAK;AAChC,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AAEA,YAAU,MAAM,IAAI,CAAC,SAAS;AAC5B,SAAK,UAAU,aAAa,KAAK,QAAQ,KAAK;AAAA,EAChD,CAAC;AACH;AAKO,IAAM,oBAAoB,CAC/B,WACA,kBACG;AAEH,QAAM,iBAAiB,cAAc;AAAA,IACnC,CAAC,KAAgC,SAAiB;AAChD,UAAI,IAAI,IAAI;AACZ,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AAGA,YAAU,MAAM,IAAI,CAAC,SAAS;AAC5B,SAAK,WAAW,eAAe,KAAK,QAAQ,KAAK;AAAA,EACnD,CAAC;AACH;;;AEhKO,IAAM,yBAAyB;AAI/B,IAAM,wCACX;AAMK,SAAS,qBACd,IACA,UACA,WACqB;AACrB,MAAI,CAAC,gBAAgB,iBAAiB,IAAI,GAAG,SAAS;AAAA,IACpD,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,OAAO,IAAI,SAAS,CAAC;AAAA,EACnC,CAAC;AAED,KAAG,SAAS;AAAA,IACV,QAAQ;AAAA,IACR,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,cAAc;AAAA,EAC5B,CAAC;AAED,SAAO;AACT;AAKO,SAAS,mBACd,IACA,UACA,QACA,WACA,QACqB;AACrB,MAAI,YACF,WAAW,OACP,GAAG,KAAK,QAAQ,aAAa,IAC7B,GAAG,KAAK,EAAE,MAAM,KAAK,GAAG,aAAa;AAE3C,MAAI,CAAC,OAAO,IAAI,GAAG,SAAS;AAAA,IAC1B,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,OAAO,IAAI,MAAM,GAAG,OAAO,IAAI,SAAS,GAAG,SAAS;AAAA,EAClE,CAAC;AAED,SAAO;AACT;AAMO,SAAS,eACd,IACA,UACA,QACA,SACM;AACN,KAAG,SAAS;AAAA,IACV,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,OAAO,IAAI,MAAM,GAAG,OAAO;AAAA,EACzC,CAAC;AACH;AAKO,SAAS,yBACd,IACA,UACA,UACA,YACA,QACA,WACM;AACN,KAAG,SAAS;AAAA,IACV,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,UAAU,UAAU,UAAU;AAAA,IAC9C,WAAW,CAAC,OAAO,IAAI,MAAM,GAAG,SAAS;AAAA,EAC3C,CAAC;AACH;AAOO,SAAS,mBACd,IACA,UACA,OACA,UACA,iBACA;AACA,QAAM,YAAY,OAAO,IAAI,QAAQ;AAErC,QAAM,CAAC,MAAM,IAAI,GAAG,SAAS;AAAA,IAC3B,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,WAAW,OAAO,IAAI,KAAK,CAAC;AAAA,EAC1C,CAAC;AAGD,QAAM,UAAU,GAAG,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;AAG9C,KAAG,SAAS;AAAA,IACV,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,WAAW,iBAAiB,OAAO;AAAA,EACjD,CAAC;AACH;;;AC/GO,IAAM,eAAe;AAGrB,IAAM,aAAa,GAAG;AAGtB,IAAM,kBAAkB,GAAG;AAK3B,SAAS,YACd,IAC4C;AAC5C,MAAI,CAAC,OAAO,aAAa,IAAI,GAAG,SAAS;AAAA,IACvC,QAAQ,GAAG;AAAA,EACb,CAAC;AAED,SAAO,CAAC,OAAO,aAAa;AAC9B;AAMO,SAAS,oBAAoB,IAA2C;AAC7E,MAAI,CAAC,OAAO,aAAa,IAAI,GAAG,SAAS;AAAA,IACvC,QAAQ,GAAG;AAAA,EACb,CAAC;AAED,KAAG,SAAS;AAAA,IACV,QAAQ;AAAA,IACR,eAAe,CAAC,UAAU;AAAA,IAC1B,WAAW,CAAC,KAAK;AAAA,EACnB,CAAC;AAED,SAAO;AACT;AAMO,SAAS,MACd,IACA,UACA,OACA,UACA,MACM;AACN,KAAG,SAAS;AAAA,IACV,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,OAAO,IAAI,KAAK,GAAG,OAAO,IAAI,QAAQ,GAAG,OAAO,IAAI,IAAI,CAAC;AAAA,EACvE,CAAC;AACH;AAUO,SAAS,KACd,IACA,UACA,OACA,UACA,QACA,MACM;AACN,KAAG,SAAS;AAAA,IACV,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW;AAAA,MACT,OAAO,IAAI,KAAK;AAAA,MAChB,OAAO,IAAI,QAAQ;AAAA,MACnB,OAAO,IAAI,MAAM;AAAA,MACjB,OAAO,IAAI,IAAI;AAAA,IACjB;AAAA,EACF,CAAC;AACH;AAMO,SAAS,KACd,IACA,UACA,OACA,UACA,QACqB;AACrB,MAAI,CAAC,IAAI,IAAI,GAAG,SAAS;AAAA,IACvB,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW;AAAA,MACT,OAAO,IAAI,KAAK;AAAA,MAChB,OAAO,IAAI,QAAQ;AAAA,MACnB,GAAG,KAAK,QAAQ,SAAS;AAAA,IAC3B;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAMO,SAAS,KACd,IACA,UACA,OACA,UACA,QACA,OACM;AACN,KAAG,SAAS;AAAA,IACV,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW;AAAA,MACT,OAAO,IAAI,KAAK;AAAA,MAChB,OAAO,IAAI,QAAQ;AAAA,MACnB,GAAG,KAAK,QAAQ,SAAS;AAAA,MACzB,GAAG,KAAK,OAAO,KAAK;AAAA,IACtB;AAAA,EACF,CAAC;AACH;AAMO,SAAS,OACd,IACA,UACA,OACA,UACA,QACM;AACN,KAAG,SAAS;AAAA,IACV,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW;AAAA,MACT,OAAO,IAAI,KAAK;AAAA,MAChB,OAAO,IAAI,QAAQ;AAAA,MACnB,GAAG,KAAK,QAAQ,SAAS;AAAA,IAC3B;AAAA,EACF,CAAC;AACH;AAMO,SAAS,aACd,IACA,UACA,OACA,UACA,MACA,OACM;AACN,KAAG,SAAS;AAAA,IACV,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW;AAAA,MACT,OAAO,IAAI,KAAK;AAAA,MAChB,OAAO,IAAI,QAAQ;AAAA,MACnB,OAAO,IAAI,IAAI;AAAA,MACf,GAAG,KAAK,OAAO,KAAK;AAAA,IACtB;AAAA,EACF,CAAC;AACH;AAMO,SAAS,SACd,IACA,UACA,OACA,QACA,SAC4C;AAC5C,MAAI,CAAC,MAAM,eAAe,IAAI,GAAG,SAAS;AAAA,IACxC,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW;AAAA,MACT,OAAO,IAAI,KAAK;AAAA,MAChB,GAAG,KAAK,QAAQ,SAAS;AAAA,MACzB,OAAO,IAAI,OAAO;AAAA,IACpB;AAAA,EACF,CAAC;AAED,SAAO,CAAC,MAAM,eAAe;AAC/B;AAMO,SAAS,kBACd,IACA,OACA,UACA,QACqB;AACrB,MAAI,YACF,WAAW,OACP,GAAG,KAAK,QAAQ,aAAa,IAC7B,GAAG,KAAK,EAAE,MAAM,KAAK,GAAG,aAAa;AAE3C,MAAI,CAAC,IAAI,IAAI,GAAG,SAAS;AAAA,IACvB,QAAQ,GAAG;AAAA,IACX,WAAW,CAAC,OAAO,IAAI,KAAK,GAAG,OAAO,IAAI,QAAQ,GAAG,SAAS;AAAA,EAChE,CAAC;AAED,SAAO;AACT;AAMO,SAAS,OACd,IACA,UACA,OACA,UACA,QACqB;AACrB,MAAI,CAAC,IAAI,IAAI,GAAG,SAAS;AAAA,IACvB,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW;AAAA,MACT,OAAO,IAAI,KAAK;AAAA,MAChB,OAAO,IAAI,QAAQ;AAAA,MACnB,GAAG,KAAK,QAAQ,SAAS;AAAA,IAC3B;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAMO,SAAS,UACd,IACA,UACA,OACA,UACA,QACqB;AACrB,MAAI,CAAC,IAAI,IAAI,GAAG,SAAS;AAAA,IACvB,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW;AAAA,MACT,OAAO,IAAI,KAAK;AAAA,MAChB,OAAO,IAAI,QAAQ;AAAA,MACnB,GAAG,KAAK,QAAQ,SAAS;AAAA,IAC3B;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAQO,SAAS,YACd,IACA,UACA,OACA,UACA,QAC4C;AAC5C,MAAI,CAAC,MAAM,OAAO,IAAI,GAAG,SAAS;AAAA,IAChC,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW;AAAA,MACT,OAAO,IAAI,KAAK;AAAA,MAChB,OAAO,IAAI,QAAQ;AAAA,MACnB,GAAG,KAAK,QAAQ,SAAS;AAAA,IAC3B;AAAA,EACF,CAAC;AAED,SAAO,CAAC,MAAM,OAAO;AACvB;AAMO,SAAS,YACd,IACA,UACA,OACA,MACA,SACM;AACN,KAAG,SAAS;AAAA,IACV,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,OAAO,IAAI,KAAK,GAAG,MAAM,OAAO;AAAA,EAC9C,CAAC;AACH;AAQO,SAAS,2BACd,IACA,UACA,SACA,SACA,QACA,QAC4B;AAE5B,MAAI,CAAC,WAAW,SAAS,UAAU;AAAW,WAAO;AAGrD,QAAM,OAAO,GAAG,WAAW,GAAG,KAAK,CAAC,GAAG,KAAK,QAAQ,KAAK,CAAC,CAAC;AAG3D,QAAM,CAAC,eAAe,eAAe,IAAI;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAMA,WAAS,QAAQ,OAAO,OAAO;AAC7B,UAAM,kBAAkB,6BAA6B,IAAI;AAEzD,YAAQ,iBAAiB;AAAA,MACvB,KAAK;AACH;AAAA,UACE;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR,OAAO;AAAA,UACP;AAAA,QACF;AACA;AAAA,MACF;AACE;AAAA,IACJ;AAAA,EACF;AAGA,iBAAe,IAAI,UAAU,OAAO,IAAI,eAAe;AAEvD,SAAO;AACT;;;AC3TA,eAAsB,WACpB,UACA,SACA,YACA,SACyB;AACzB,QAAM,EAAE,MAAM,YAAY,YAAY,IAAI,MAAM,SAAS,iBAAiB;AAAA,IACxE,UAAU;AAAA,IACV,GAAG;AAAA,EACL,CAAC;AAED,QAAM,WAA2B,CAAC;AAClC,QAAM,gBAA4B,CAAC;AAGnC,QAAM,YAAY,iBAAiB,MAAM,UAAU,aAAa;AAKhE,QAAM,CAAC,OAAO,cAAc,IAAI,MAAM,QAAQ,IAAI;AAAA,IAChD,QAAQ,kBACJ,eAAe,UAAU,OAAO,IAChC,QAAQ,QAAQ,MAAS;AAAA,IAC7B,QAAQ,oBACJ,SAAS,gBAAgB;AAAA,MACvB,KAAK,UAAU;AAAA,MACf,SAAS;AAAA,QACP,aAAa;AAAA,MACf;AAAA,IACF,CAAC,IACD,QAAQ,QAAQ,CAAC,CAAC;AAAA,EACxB,CAAC;AAED,MAAI,QAAQ;AAAiB,cAAU,QAAQ;AAE/C,0BAAwB,WAAW,UAAU,cAAc;AAE3D,oBAAkB,WAAW,aAAa;AAE1C,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AACF;;;AC/GO,IAAM,gCAAgC;AAW7C,eAAsB,oBACpB,UACA,MAC2B;AAE3B,QAAM,EAAE,KAAK,IAAI,MAAM,SAAS,YAAY;AAAA,IAC1C,OAAO;AAAA,MACL,eAAe,GAAG,iCAAiC;AAAA,IACrD;AAAA,EACF,CAAC;AAED,QAAM,SAAS,KAAK,IAAI,CAAC,UAAU,MAAM,UAA4B;AACrE,QAAM,WAAW,MAAM,SAAS,gBAAgB;AAAA,IAC9C,KAAK,OAAO,IAAI,CAAC,WAAW,OAAO,EAAE;AAAA,IACrC,SAAS,EAAE,SAAS,MAAM,WAAW,KAAK;AAAA,EAC5C,CAAC;AAED,SAAO,SACJ,OAAO,CAAC,WAAW,CAAC,CAAC,UAAU,UAAU,MAAM,EAC/C,IAAI,CAAC,EAAE,MAAM,OAAO,MAAM;AAGzB,QAAI,CAAC,UAAU,CAAC,OAAO,OAAO,EAAE,cAAc,OAAO,MAAM;AACzD,YAAM,IAAI;AAAA,QACR,mBAAmB,QAAQ;AAAA,MAC7B;AAAA,IACF;AAEA,QAAI,SAAS,eAAI;AAAA,MACf;AAAA,MACA,OAAO,IAAI;AAAA,MACX;AAAA,IACF;AAEA,WAAO;AAAA,MACL,IAAI,QAAQ;AAAA,MACZ,MAAM,wCAAwC;AAAA,MAC9C,OAAO,QAAQ;AAAA,MACf,OAAO,OAAO;AAAA,MACd,SAAS,OAAO;AAAA,IAClB;AAAA,EACF,CAAC;AACL;","names":["import_sui"]}
package/dist/index.mjs CHANGED
@@ -1,3 +1,8 @@
1
+ // src/utils.ts
2
+ import {
3
+ getObjectFields
4
+ } from "@mysten/sui.js";
5
+
1
6
  // src/bcs.ts
2
7
  import { bcs } from "@mysten/sui.js";
3
8
  bcs.registerStructType("0x2::kiosk::Kiosk", {
@@ -48,7 +53,7 @@ async function getKioskObject(provider, id) {
48
53
  }
49
54
  return bcs.de("0x2::kiosk::Kiosk", queryRes.data.bcs.bcsBytes, "base64");
50
55
  }
51
- function extractKioskData(data) {
56
+ function extractKioskData(data, listings, lockedItemIds) {
52
57
  return data.reduce(
53
58
  (acc, val) => {
54
59
  const type = getTypeWithoutPackageAddress(val.name.type);
@@ -56,33 +61,61 @@ function extractKioskData(data) {
56
61
  case "kiosk::Item":
57
62
  acc.itemIds.push(val.objectId);
58
63
  acc.items.push({
59
- itemId: val.objectId,
60
- itemType: val.objectType
64
+ objectId: val.objectId,
65
+ type: val.objectType,
66
+ isLocked: false
61
67
  });
62
68
  break;
63
69
  case "kiosk::Listing":
64
70
  acc.listingIds.push(val.objectId);
65
- acc.listings.push({
66
- itemId: val.name.value.id,
71
+ listings.push({
72
+ objectId: val.name.value.id,
67
73
  listingId: val.objectId,
68
74
  isExclusive: val.name.value.is_exclusive
69
75
  });
70
76
  break;
77
+ case "kiosk::Lock":
78
+ lockedItemIds?.push(val.name.value.id);
79
+ break;
71
80
  }
72
81
  return acc;
73
82
  },
74
- { listings: [], items: [], itemIds: [], listingIds: [] }
83
+ { items: [], itemIds: [], listingIds: [], extensions: [] }
75
84
  );
76
85
  }
77
- function getObjects(provider, ids, options) {
78
- if (ids.length === 0) {
79
- return Promise.resolve([]);
80
- }
81
- return provider.multiGetObjects({ ids, options });
82
- }
83
86
  var getTypeWithoutPackageAddress = (type) => {
84
87
  return type.split("::").slice(-2).join("::");
85
88
  };
89
+ var attachListingsAndPrices = (kioskData, listings, listingObjects) => {
90
+ const itemListings = listings.reduce(
91
+ (acc, item, idx) => {
92
+ acc[item.objectId] = { ...item };
93
+ if (listingObjects.length === 0)
94
+ return acc;
95
+ const data = getObjectFields(listingObjects[idx]);
96
+ if (!data)
97
+ return acc;
98
+ acc[item.objectId].price = data.value;
99
+ return acc;
100
+ },
101
+ {}
102
+ );
103
+ kioskData.items.map((item) => {
104
+ item.listing = itemListings[item.objectId] || void 0;
105
+ });
106
+ };
107
+ var attachLockedItems = (kioskData, lockedItemIds) => {
108
+ const lockedStatuses = lockedItemIds.reduce(
109
+ (acc, item) => {
110
+ acc[item] = true;
111
+ return acc;
112
+ },
113
+ {}
114
+ );
115
+ kioskData.items.map((item) => {
116
+ item.isLocked = lockedStatuses[item.objectId] || false;
117
+ });
118
+ };
86
119
 
87
120
  // src/tx/transfer-policy.ts
88
121
  var TRANSFER_POLICY_MODULE = "0x2::transfer_policy";
@@ -320,38 +353,27 @@ function purchaseAndResolvePolicies(tx, itemType, listing, kioskId, itemId, poli
320
353
  }
321
354
 
322
355
  // src/query/kiosk.ts
323
- import {
324
- getObjectFields
325
- } from "@mysten/sui.js";
326
- async function fetchKiosk(provider, kioskId, pagination, {
327
- includeKioskFields = false,
328
- includeItems = false,
329
- withListingPrices = false,
330
- itemOptions = { showDisplay: true, showType: true }
331
- }) {
356
+ async function fetchKiosk(provider, kioskId, pagination, options) {
332
357
  const { data, nextCursor, hasNextPage } = await provider.getDynamicFields({
333
358
  parentId: kioskId,
334
359
  ...pagination
335
360
  });
336
- const kioskData = extractKioskData(data);
337
- const [kiosk, itemObjects, listingObjects] = await Promise.all([
338
- includeKioskFields ? getKioskObject(provider, kioskId) : Promise.resolve(void 0),
339
- includeItems ? getObjects(provider, kioskData.itemIds, itemOptions) : Promise.resolve([]),
340
- withListingPrices ? getObjects(provider, kioskData.listingIds, {
341
- showBcs: true,
342
- showContent: true
361
+ const listings = [];
362
+ const lockedItemIds = [];
363
+ const kioskData = extractKioskData(data, listings, lockedItemIds);
364
+ const [kiosk, listingObjects] = await Promise.all([
365
+ options.withKioskFields ? getKioskObject(provider, kioskId) : Promise.resolve(void 0),
366
+ options.withListingPrices ? provider.multiGetObjects({
367
+ ids: kioskData.listingIds,
368
+ options: {
369
+ showContent: true
370
+ }
343
371
  }) : Promise.resolve([])
344
372
  ]);
345
- if (includeKioskFields)
373
+ if (options.withKioskFields)
346
374
  kioskData.kiosk = kiosk;
347
- if (includeItems)
348
- kioskData.items = itemObjects;
349
- if (withListingPrices)
350
- kioskData.listings.map((l, i) => {
351
- const fields = getObjectFields(listingObjects[i]);
352
- l.price = fields?.value;
353
- return l;
354
- });
375
+ attachListingsAndPrices(kioskData, listings, listingObjects);
376
+ attachLockedItems(kioskData, lockedItemIds);
355
377
  return {
356
378
  data: kioskData,
357
379
  nextCursor,
@@ -399,6 +421,8 @@ export {
399
421
  TRANSFER_POLICY_CREATED_EVENT,
400
422
  TRANSFER_POLICY_MODULE,
401
423
  TRANSFER_POLICY_RULES_PACKAGE_ADDRESS,
424
+ attachListingsAndPrices,
425
+ attachLockedItems,
402
426
  bcs,
403
427
  borrow,
404
428
  borrowMut,
@@ -411,7 +435,6 @@ export {
411
435
  extractKioskData,
412
436
  fetchKiosk,
413
437
  getKioskObject,
414
- getObjects,
415
438
  getTypeWithoutPackageAddress,
416
439
  list,
417
440
  lock,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bcs.ts","../src/utils.ts","../src/tx/transfer-policy.ts","../src/tx/kiosk.ts","../src/query/kiosk.ts","../src/query/transfer-policy.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { ObjectOwner, bcs } from '@mysten/sui.js';\n\n/**\n * The Kiosk object fields (for BCS queries).\n */\nexport type Kiosk = {\n id: string;\n profits: string;\n owner: string;\n itemCount: number;\n allowExtensions: boolean;\n};\n\n// Register the `Kiosk` struct for faster queries.\nbcs.registerStructType('0x2::kiosk::Kiosk', {\n id: 'address',\n profits: 'u64',\n owner: 'address',\n itemCount: 'u32',\n allowExtensions: 'bool',\n});\n\n/**\n * PurchaseCap object fields (for BCS queries).\n */\nexport type PurchaseCap = {\n id: string;\n kioskId: string;\n itemId: string;\n minPrice: string;\n};\n\n// Register the `PurchaseCap` for faster queries.\nbcs.registerStructType('0x2::kiosk::PurchaseCap', {\n id: 'address',\n kioskId: 'address',\n itemId: 'address',\n minPrice: 'u64',\n});\n\n/** Event emitted when a TransferPolicy is created. */\nexport type TransferPolicyCreated = {\n id: string;\n};\n\n// Register the `TransferPolicyCreated` event data.\nbcs.registerStructType('0x2::transfer_policy::TransferPolicyCreated', {\n id: 'address',\n});\n\n/** The `TransferPolicy` object */\nexport type TransferPolicy = {\n id: string;\n type: string;\n balance: string;\n rules: string[];\n owner: ObjectOwner;\n};\n\nbcs.registerStructType('0x2::transfer_policy::TransferPolicy', {\n id: 'address',\n balance: 'u64',\n rules: ['vector', 'string'],\n});\n\nexport { bcs };\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n JsonRpcProvider,\n SharedObjectRef,\n SuiObjectDataOptions,\n SuiObjectRef,\n TransactionArgument,\n TransactionBlock,\n} from '@mysten/sui.js';\nimport { KioskData } from './query/kiosk';\nimport { DynamicFieldInfo } from '@mysten/sui.js/dist/types/dynamic_fields';\nimport { bcs, Kiosk } from './bcs';\n\n/**\n * A valid argument for any of the Kiosk functions.\n */\nexport type ObjectArgument =\n | string\n | TransactionArgument\n | SharedObjectRef\n | SuiObjectRef;\n\n/**\n * Convert any valid input into a TransactionArgument.\n *\n * @param tx The transaction to use for creating the argument.\n * @param arg The argument to convert.\n * @returns The converted TransactionArgument.\n */\nexport function objArg(\n tx: TransactionBlock,\n arg: string | SharedObjectRef | SuiObjectRef | TransactionArgument,\n): TransactionArgument {\n if (typeof arg === 'string') {\n return tx.object(arg);\n }\n\n if ('digest' in arg && 'version' in arg && 'objectId' in arg) {\n return tx.objectRef(arg);\n }\n\n if ('objectId' in arg && 'initialSharedVersion' in arg && 'mutable' in arg) {\n return tx.sharedObjectRef(arg);\n }\n\n if ('kind' in arg) {\n return arg;\n }\n\n throw new Error('Invalid argument type');\n}\n\nexport async function getKioskObject(\n provider: JsonRpcProvider,\n id: string,\n): Promise<Kiosk> {\n const queryRes = await provider.getObject({ id, options: { showBcs: true } });\n\n if (!queryRes || queryRes.error || !queryRes.data) {\n throw new Error(`Kiosk ${id} not found; ${queryRes.error}`);\n }\n\n if (!queryRes.data.bcs || !('bcsBytes' in queryRes.data.bcs)) {\n throw new Error(`Invalid kiosk query: ${id}, expected object, got package`);\n }\n\n return bcs.de('0x2::kiosk::Kiosk', queryRes.data.bcs!.bcsBytes, 'base64');\n}\n\n// helper to extract kiosk data from dynamic fields.\nexport function extractKioskData(data: DynamicFieldInfo[]): KioskData {\n return data.reduce<KioskData>(\n (acc: KioskData, val: DynamicFieldInfo) => {\n const type = getTypeWithoutPackageAddress(val.name.type);\n\n switch (type) {\n case 'kiosk::Item':\n acc.itemIds.push(val.objectId);\n acc.items.push({\n itemId: val.objectId,\n itemType: val.objectType,\n });\n break;\n case 'kiosk::Listing':\n acc.listingIds.push(val.objectId);\n acc.listings.push({\n itemId: val.name.value.id,\n listingId: val.objectId,\n isExclusive: val.name.value.is_exclusive,\n });\n break;\n }\n return acc;\n },\n { listings: [], items: [], itemIds: [], listingIds: [] },\n );\n}\n\n// simple multiGetObjects wrapper to simplify cases on functions.\nexport function getObjects(\n provider: JsonRpcProvider,\n ids: string[],\n options: SuiObjectDataOptions,\n) {\n if (ids.length === 0) {\n return Promise.resolve([]);\n }\n\n return provider.multiGetObjects({ ids, options });\n}\n\n// e.g. 0x2::kiosk::Item -> kiosk::Item\nexport const getTypeWithoutPackageAddress = (type: string) => {\n return type.split('::').slice(-2).join('::');\n};\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { TransactionArgument, TransactionBlock } from '@mysten/sui.js';\nimport { ObjectArgument, objArg } from '../utils';\n\n/** The Transfer Policy module. */\nexport const TRANSFER_POLICY_MODULE = '0x2::transfer_policy';\n\n/** The Transer Policy Rules package address */\n// TODO: Figure out how we serve this for both testnet & mainnet (different package)\nexport const TRANSFER_POLICY_RULES_PACKAGE_ADDRESS =\n 'bd8fc1947cf119350184107a3087e2dc27efefa0dd82e25a1f699069fe81a585';\n\n/**\n * Call the `transfer_policy::new` function to create a new transfer policy.\n * Returns `transferPolicyCap`\n */\nexport function createTransferPolicy(\n tx: TransactionBlock,\n itemType: string,\n publisher: ObjectArgument,\n): TransactionArgument {\n let [transferPolicy, transferPolicyCap] = tx.moveCall({\n target: `${TRANSFER_POLICY_MODULE}::new`,\n typeArguments: [itemType],\n arguments: [objArg(tx, publisher)],\n });\n\n tx.moveCall({\n target: `0x2::transfer::public_share_object`,\n typeArguments: [itemType],\n arguments: [transferPolicy],\n });\n\n return transferPolicyCap;\n}\n\n/**\n * Call the `transfer_policy::withdraw` function to withdraw profits from a transfer policy.\n */\nexport function withdrawFromPolicy(\n tx: TransactionBlock,\n itemType: string,\n policy: ObjectArgument,\n policyCap: ObjectArgument,\n amount: string | bigint | null,\n): TransactionArgument {\n let amountArg =\n amount !== null\n ? tx.pure(amount, 'Option<u64>')\n : tx.pure({ None: true }, 'Option<u64>');\n\n let [profits] = tx.moveCall({\n target: `${TRANSFER_POLICY_MODULE}::withdraw`,\n typeArguments: [itemType],\n arguments: [objArg(tx, policy), objArg(tx, policyCap), amountArg],\n });\n\n return profits;\n}\n\n/**\n * Call the `transfer_policy::confirm_request` function to unblock the\n * transaction.\n */\nexport function confirmRequest(\n tx: TransactionBlock,\n itemType: string,\n policy: ObjectArgument,\n request: TransactionArgument,\n): void {\n tx.moveCall({\n target: `${TRANSFER_POLICY_MODULE}::confirm_request`,\n typeArguments: [itemType],\n arguments: [objArg(tx, policy), request],\n });\n}\n\n/**\n * Calls the `transfer_policy::remove_rule` function to remove a Rule from the transfer policy's ruleset.\n */\nexport function removeTransferPolicyRule(\n tx: TransactionBlock,\n itemType: string,\n ruleType: string,\n configType: string,\n policy: ObjectArgument,\n policyCap: TransactionArgument,\n): void {\n tx.moveCall({\n target: `${TRANSFER_POLICY_MODULE}::remove_rule`,\n typeArguments: [itemType, ruleType, configType],\n arguments: [objArg(tx, policy), policyCap],\n });\n}\n\n/**\n * Calculates the amount to be paid for the royalty rule to be resolved,\n * splits the coin to pass the exact amount,\n * then calls the `royalty_rule::pay` function to resolve the royalty rule.\n */\nexport function resolveRoyaltyRule(\n tx: TransactionBlock,\n itemType: string,\n price: string,\n policyId: string,\n transferRequest: TransactionArgument,\n) {\n const policyObj = objArg(tx, policyId);\n // calculates the amount\n const [amount] = tx.moveCall({\n target: `${TRANSFER_POLICY_RULES_PACKAGE_ADDRESS}::royalty_rule::fee_amount`,\n typeArguments: [itemType],\n arguments: [policyObj, objArg(tx, price)],\n });\n\n // splits the coin.\n const feeCoin = tx.splitCoins(tx.gas, [amount]);\n\n // pays the policy\n tx.moveCall({\n target: `${TRANSFER_POLICY_RULES_PACKAGE_ADDRESS}::royalty_rule::pay`,\n typeArguments: [itemType],\n arguments: [policyObj, transferRequest, feeCoin],\n });\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n SuiAddress,\n TransactionArgument,\n TransactionBlock,\n} from '@mysten/sui.js';\n\nimport { ObjectArgument, getTypeWithoutPackageAddress, objArg } from '../utils';\nimport { KioskListing } from '../query/kiosk';\nimport { TransferPolicy } from '../bcs';\nimport { confirmRequest, resolveRoyaltyRule } from './transfer-policy';\n\n/** The Kiosk module. */\nexport const KIOSK_MODULE = '0x2::kiosk';\n\n/** The Kiosk type. */\nexport const KIOSK_TYPE = `${KIOSK_MODULE}::Kiosk`;\n\n/** The Kiosk Owner Cap Type */\nexport const KIOSK_OWNER_CAP = `${KIOSK_MODULE}::KioskOwnerCap`;\n\n/**\n * Create a new shared Kiosk and returns the [kiosk, kioskOwnerCap] tuple.\n */\nexport function createKiosk(\n tx: TransactionBlock,\n): [TransactionArgument, TransactionArgument] {\n let [kiosk, kioskOwnerCap] = tx.moveCall({\n target: `${KIOSK_MODULE}::new`,\n });\n\n return [kiosk, kioskOwnerCap];\n}\n\n/**\n * Calls the `kiosk::new()` function and shares the kiosk.\n * Returns the `kioskOwnerCap` object.\n */\nexport function createKioskAndShare(tx: TransactionBlock): TransactionArgument {\n let [kiosk, kioskOwnerCap] = tx.moveCall({\n target: `${KIOSK_MODULE}::new`,\n });\n\n tx.moveCall({\n target: `0x2::transfer::public_share_object`,\n typeArguments: [KIOSK_TYPE],\n arguments: [kiosk],\n });\n\n return kioskOwnerCap;\n}\n\n/**\n * Call the `kiosk::place<T>(Kiosk, KioskOwnerCap, Item)` function.\n * Place an item to the Kiosk.\n */\nexport function place(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n item: ObjectArgument,\n): void {\n tx.moveCall({\n target: `${KIOSK_MODULE}::place`,\n typeArguments: [itemType],\n arguments: [objArg(tx, kiosk), objArg(tx, kioskCap), objArg(tx, item)],\n });\n}\n\n/**\n * Call the `kiosk::lock<T>(Kiosk, KioskOwnerCap, TransferPolicy, Item)`\n * function. Lock an item in the Kiosk.\n *\n * Unlike `place` this function requires a `TransferPolicy` to exist\n * and be passed in. This is done to make sure the item does not get\n * locked without an option to take it out.\n */\nexport function lock(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n policy: ObjectArgument,\n item: ObjectArgument,\n): void {\n tx.moveCall({\n target: `${KIOSK_MODULE}::lock`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n objArg(tx, policy),\n objArg(tx, item),\n ],\n });\n}\n\n/**\n * Call the `kiosk::take<T>(Kiosk, KioskOwnerCap, ID)` function.\n * Take an item from the Kiosk.\n */\nexport function take(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n itemId: SuiAddress,\n): TransactionArgument {\n let [item] = tx.moveCall({\n target: `${KIOSK_MODULE}::take`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n tx.pure(itemId, 'address'),\n ],\n });\n\n return item;\n}\n\n/**\n * Call the `kiosk::list<T>(Kiosk, KioskOwnerCap, ID, u64)` function.\n * List an item for sale.\n */\nexport function list(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n itemId: SuiAddress,\n price: string | bigint,\n): void {\n tx.moveCall({\n target: `${KIOSK_MODULE}::list`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n tx.pure(itemId, 'address'),\n tx.pure(price, 'u64'),\n ],\n });\n}\n\n/**\n * Call the `kiosk::list<T>(Kiosk, KioskOwnerCap, ID, u64)` function.\n * List an item for sale.\n */\nexport function delist(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n itemId: SuiAddress,\n): void {\n tx.moveCall({\n target: `${KIOSK_MODULE}::delist`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n tx.pure(itemId, 'address'),\n ],\n });\n}\n\n/**\n * Call the `kiosk::place_and_list<T>(Kiosk, KioskOwnerCap, Item, u64)` function.\n * Place an item to the Kiosk and list it for sale.\n */\nexport function placeAndList(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n item: ObjectArgument,\n price: string | bigint,\n): void {\n tx.moveCall({\n target: `${KIOSK_MODULE}::place_and_list`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n objArg(tx, item),\n tx.pure(price, 'u64'),\n ],\n });\n}\n\n/**\n * Call the `kiosk::purchase<T>(Kiosk, ID, Coin<SUI>)` function and receive an Item and\n * a TransferRequest which needs to be dealt with (via a matching TransferPolicy).\n */\nexport function purchase(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n itemId: SuiAddress,\n payment: ObjectArgument,\n): [TransactionArgument, TransactionArgument] {\n let [item, transferRequest] = tx.moveCall({\n target: `${KIOSK_MODULE}::purchase`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n tx.pure(itemId, 'address'),\n objArg(tx, payment),\n ],\n });\n\n return [item, transferRequest];\n}\n\n/**\n * Call the `kiosk::withdraw(Kiosk, KioskOwnerCap, Option<u64>)` function and receive a Coin<SUI>.\n * If the amount is null, then the entire balance will be withdrawn.\n */\nexport function withdrawFromKiosk(\n tx: TransactionBlock,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n amount: string | bigint | null,\n): TransactionArgument {\n let amountArg =\n amount !== null\n ? tx.pure(amount, 'Option<u64>')\n : tx.pure({ None: true }, 'Option<u64>');\n\n let [coin] = tx.moveCall({\n target: `${KIOSK_MODULE}::withdraw`,\n arguments: [objArg(tx, kiosk), objArg(tx, kioskCap), amountArg],\n });\n\n return coin;\n}\n\n/**\n * Call the `kiosk::borrow<T>(Kiosk, KioskOwnerCap, ID): &T` function.\n * Immutably borrow an item from the Kiosk.\n */\nexport function borrow(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n itemId: SuiAddress,\n): TransactionArgument {\n let [item] = tx.moveCall({\n target: `${KIOSK_MODULE}::borrow`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n tx.pure(itemId, 'address'),\n ],\n });\n\n return item;\n}\n\n/**\n * Call the `kiosk::borrow_mut<T>(Kiosk, KioskOwnerCap, ID): &mut T` function.\n * Mutably borrow an item from the Kiosk.\n */\nexport function borrowMut(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n itemId: SuiAddress,\n): TransactionArgument {\n let [item] = tx.moveCall({\n target: `${KIOSK_MODULE}::borrow_mut`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n tx.pure(itemId, 'address'),\n ],\n });\n\n return item;\n}\n\n/**\n * Call the `kiosk::borrow_value<T>(Kiosk, KioskOwnerCap, ID): T` function.\n * Immutably borrow an item from the Kiosk and return it in the end.\n *\n * Requires calling `returnValue` to return the item.\n */\nexport function borrowValue(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n itemId: SuiAddress,\n): [TransactionArgument, TransactionArgument] {\n let [item, promise] = tx.moveCall({\n target: `${KIOSK_MODULE}::borrow_val`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n tx.pure(itemId, 'address'),\n ],\n });\n\n return [item, promise];\n}\n\n/**\n * Call the `kiosk::return_value<T>(Kiosk, Item, Borrow)` function.\n * Return an item to the Kiosk after it was `borrowValue`-d.\n */\nexport function returnValue(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n item: TransactionArgument,\n promise: TransactionArgument,\n): void {\n tx.moveCall({\n target: `${KIOSK_MODULE}::return_val`,\n typeArguments: [itemType],\n arguments: [objArg(tx, kiosk), item, promise],\n });\n}\n\n/**\n * Completes the full purchase flow that includes:\n * 1. Purchasing the item.\n * 2. Resolving all the transfer policies (if any).\n * 3. Returns the PurchasedItem OR places the item in the user's kiosk (if there's a kiosk lock policy).\n */\nexport function purchaseAndResolvePolicies(\n tx: TransactionBlock,\n itemType: string,\n listing: KioskListing,\n kioskId: string,\n itemId: string,\n policy: TransferPolicy,\n): TransactionArgument | null {\n // if we don't pass the listing or the listing doens't have a price, return.\n if (!listing || listing?.price === undefined) return null;\n\n // Split the coin for the amount of the listing.\n const coin = tx.splitCoins(tx.gas, [tx.pure(listing.price)]);\n\n // initialize the purchase `kiosk::purchase`\n const [purchasedItem, transferRequest] = purchase(\n tx,\n itemType,\n kioskId,\n itemId,\n coin,\n );\n\n // Start resolving rules.\n // For now, we only support royalty rule.\n // Will need some tweaking to make it function properly with the other\n // ruleset.\n for (let rule of policy.rules) {\n const ruleWithoutAddr = getTypeWithoutPackageAddress(rule);\n\n switch (ruleWithoutAddr) {\n case 'royalty_rule::Rule':\n resolveRoyaltyRule(\n tx,\n itemType,\n listing.price,\n policy.id,\n transferRequest,\n );\n break;\n default:\n break;\n }\n }\n\n // confirm the Transfer Policy request.\n confirmRequest(tx, itemType, policy.id, transferRequest);\n\n return purchasedItem;\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n JsonRpcProvider,\n PaginationArguments,\n SuiAddress,\n SuiObjectDataOptions,\n SuiObjectResponse,\n getObjectFields,\n} from '@mysten/sui.js';\nimport { extractKioskData, getKioskObject, getObjects } from '../utils';\nimport { Kiosk } from '../bcs';\n\n/**\n * A dynamic field `Listing { ID, isExclusive }` attached to the Kiosk.\n * Holds a `u64` value - the price of the item.\n */\nexport type KioskListing = {\n /** The ID of the Item */\n itemId: string;\n /**\n * Whether or not there's a `PurchaseCap` issued. `true` means that\n * the listing is controlled by some logic and can't be purchased directly.\n *\n * TODO: consider renaming the field for better indication.\n */\n isExclusive: boolean;\n /** The ID of the listing */\n listingId: string;\n price?: string;\n};\n\n/**\n * A dynamic field `Item { ID }` attached to the Kiosk.\n * Holds an Item `T`. The type of the item is known upfront.\n */\nexport type KioskItem = {\n /** The ID of the Item */\n itemId: string;\n /** The type of the Item */\n itemType: string;\n};\n\n/**\n * Aggregated data from the Kiosk.\n */\nexport type KioskData = {\n items: KioskItem[] | SuiObjectResponse[];\n listings: KioskListing[];\n itemIds: string[];\n listingIds: string[];\n kiosk?: Kiosk;\n};\n\nexport type PagedKioskData = {\n data: KioskData;\n nextCursor: string | null;\n hasNextPage: boolean;\n};\n\nexport type FetchKioskOptions = {\n includeKioskFields?: boolean;\n includeItems?: boolean;\n itemOptions?: SuiObjectDataOptions;\n withListingPrices?: boolean;\n listingOptions?: SuiObjectDataOptions;\n};\n\n/**\n *\n */\nexport async function fetchKiosk(\n provider: JsonRpcProvider,\n kioskId: SuiAddress,\n pagination: PaginationArguments<string>,\n {\n includeKioskFields = false,\n includeItems = false,\n withListingPrices = false,\n itemOptions = { showDisplay: true, showType: true },\n }: FetchKioskOptions,\n): Promise<PagedKioskData> {\n const { data, nextCursor, hasNextPage } = await provider.getDynamicFields({\n parentId: kioskId,\n ...pagination,\n });\n\n // extracted kiosk data.\n const kioskData = extractKioskData(data);\n\n // split the fetching in two queries as we are most likely passing different options for each kind.\n // For items, we usually seek the Display.\n // For listings we usually seek the DF value (price) / exclusivity.\n const [kiosk, itemObjects, listingObjects] = await Promise.all([\n includeKioskFields\n ? getKioskObject(provider, kioskId)\n : Promise.resolve(undefined),\n includeItems\n ? getObjects(provider, kioskData.itemIds, itemOptions)\n : Promise.resolve([]),\n withListingPrices\n ? getObjects(provider, kioskData.listingIds, {\n showBcs: true,\n showContent: true,\n })\n : Promise.resolve([]),\n ]);\n\n if (includeKioskFields) kioskData.kiosk = kiosk;\n if (includeItems) kioskData.items = itemObjects;\n if (withListingPrices)\n kioskData.listings.map((l, i) => {\n const fields = getObjectFields(listingObjects[i]);\n // l.price = bcs.de('u64', listingObjects[i].data?.bcs.bcsBytes, 'base64');\n // TODO: Figure out a way to do this with BCS to avoid querying content.\n l.price = fields?.value;\n return l;\n });\n\n return {\n data: kioskData,\n nextCursor,\n hasNextPage,\n };\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { JsonRpcProvider } from '@mysten/sui.js';\nimport { TransferPolicy, bcs } from '../bcs';\n\n/** Name of the event emitted when a TransferPolicy for T is created. */\nexport const TRANSFER_POLICY_CREATED_EVENT = `0x2::transfer_policy::TransferPolicyCreated`;\n\n/**\n * Searches the `TransferPolicy`-s for the given type. The seach is performed via\n * the `TransferPolicyCreated` event. The policy can either be owned or shared,\n * and the caller needs to filter the results accordingly (ie single owner can not\n * be accessed by anyone but the owner).\n *\n * @param provider\n * @param type\n */\nexport async function queryTransferPolicy(\n provider: JsonRpcProvider,\n type: string,\n): Promise<TransferPolicy[]> {\n // console.log('event type: %s', `${TRANSFER_POLICY_CREATED_EVENT}<${type}>`);\n const { data } = await provider.queryEvents({\n query: {\n MoveEventType: `${TRANSFER_POLICY_CREATED_EVENT}<${type}>`,\n },\n });\n\n const search = data.map((event) => event.parsedJson as { id: string });\n const policies = await provider.multiGetObjects({\n ids: search.map((policy) => policy.id),\n options: { showBcs: true, showOwner: true },\n });\n\n return policies\n .filter((policy) => !!policy && 'data' in policy)\n .map(({ data: policy }) => {\n // should never happen; policies are objects and fetched via an event.\n // policies are filtered for null and undefined above.\n if (!policy || !policy.bcs || !('bcsBytes' in policy.bcs)) {\n throw new Error(\n `Invalid policy: ${policy?.objectId}, expected object, got package`,\n );\n }\n\n let parsed = bcs.de(\n '0x2::transfer_policy::TransferPolicy',\n policy.bcs.bcsBytes,\n 'base64',\n );\n\n return {\n id: policy?.objectId,\n type: `0x2::transfer_policy::TransferPolicy<${type}>`,\n owner: policy?.owner!,\n rules: parsed.rules,\n balance: parsed.balance,\n } as TransferPolicy;\n });\n}\n"],"mappings":";AAGA,SAAsB,WAAW;AAcjC,IAAI,mBAAmB,qBAAqB;AAAA,EAC1C,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,OAAO;AAAA,EACP,WAAW;AAAA,EACX,iBAAiB;AACnB,CAAC;AAaD,IAAI,mBAAmB,2BAA2B;AAAA,EAChD,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AACZ,CAAC;AAQD,IAAI,mBAAmB,+CAA+C;AAAA,EACpE,IAAI;AACN,CAAC;AAWD,IAAI,mBAAmB,wCAAwC;AAAA,EAC7D,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,OAAO,CAAC,UAAU,QAAQ;AAC5B,CAAC;;;ACnCM,SAAS,OACd,IACA,KACqB;AACrB,MAAI,OAAO,QAAQ,UAAU;AAC3B,WAAO,GAAG,OAAO,GAAG;AAAA,EACtB;AAEA,MAAI,YAAY,OAAO,aAAa,OAAO,cAAc,KAAK;AAC5D,WAAO,GAAG,UAAU,GAAG;AAAA,EACzB;AAEA,MAAI,cAAc,OAAO,0BAA0B,OAAO,aAAa,KAAK;AAC1E,WAAO,GAAG,gBAAgB,GAAG;AAAA,EAC/B;AAEA,MAAI,UAAU,KAAK;AACjB,WAAO;AAAA,EACT;AAEA,QAAM,IAAI,MAAM,uBAAuB;AACzC;AAEA,eAAsB,eACpB,UACA,IACgB;AAChB,QAAM,WAAW,MAAM,SAAS,UAAU,EAAE,IAAI,SAAS,EAAE,SAAS,KAAK,EAAE,CAAC;AAE5E,MAAI,CAAC,YAAY,SAAS,SAAS,CAAC,SAAS,MAAM;AACjD,UAAM,IAAI,MAAM,SAAS,iBAAiB,SAAS,OAAO;AAAA,EAC5D;AAEA,MAAI,CAAC,SAAS,KAAK,OAAO,EAAE,cAAc,SAAS,KAAK,MAAM;AAC5D,UAAM,IAAI,MAAM,wBAAwB,kCAAkC;AAAA,EAC5E;AAEA,SAAO,IAAI,GAAG,qBAAqB,SAAS,KAAK,IAAK,UAAU,QAAQ;AAC1E;AAGO,SAAS,iBAAiB,MAAqC;AACpE,SAAO,KAAK;AAAA,IACV,CAAC,KAAgB,QAA0B;AACzC,YAAM,OAAO,6BAA6B,IAAI,KAAK,IAAI;AAEvD,cAAQ,MAAM;AAAA,QACZ,KAAK;AACH,cAAI,QAAQ,KAAK,IAAI,QAAQ;AAC7B,cAAI,MAAM,KAAK;AAAA,YACb,QAAQ,IAAI;AAAA,YACZ,UAAU,IAAI;AAAA,UAChB,CAAC;AACD;AAAA,QACF,KAAK;AACH,cAAI,WAAW,KAAK,IAAI,QAAQ;AAChC,cAAI,SAAS,KAAK;AAAA,YAChB,QAAQ,IAAI,KAAK,MAAM;AAAA,YACvB,WAAW,IAAI;AAAA,YACf,aAAa,IAAI,KAAK,MAAM;AAAA,UAC9B,CAAC;AACD;AAAA,MACJ;AACA,aAAO;AAAA,IACT;AAAA,IACA,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC,GAAG,SAAS,CAAC,GAAG,YAAY,CAAC,EAAE;AAAA,EACzD;AACF;AAGO,SAAS,WACd,UACA,KACA,SACA;AACA,MAAI,IAAI,WAAW,GAAG;AACpB,WAAO,QAAQ,QAAQ,CAAC,CAAC;AAAA,EAC3B;AAEA,SAAO,SAAS,gBAAgB,EAAE,KAAK,QAAQ,CAAC;AAClD;AAGO,IAAM,+BAA+B,CAAC,SAAiB;AAC5D,SAAO,KAAK,MAAM,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,IAAI;AAC7C;;;AC7GO,IAAM,yBAAyB;AAI/B,IAAM,wCACX;AAMK,SAAS,qBACd,IACA,UACA,WACqB;AACrB,MAAI,CAAC,gBAAgB,iBAAiB,IAAI,GAAG,SAAS;AAAA,IACpD,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,OAAO,IAAI,SAAS,CAAC;AAAA,EACnC,CAAC;AAED,KAAG,SAAS;AAAA,IACV,QAAQ;AAAA,IACR,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,cAAc;AAAA,EAC5B,CAAC;AAED,SAAO;AACT;AAKO,SAAS,mBACd,IACA,UACA,QACA,WACA,QACqB;AACrB,MAAI,YACF,WAAW,OACP,GAAG,KAAK,QAAQ,aAAa,IAC7B,GAAG,KAAK,EAAE,MAAM,KAAK,GAAG,aAAa;AAE3C,MAAI,CAAC,OAAO,IAAI,GAAG,SAAS;AAAA,IAC1B,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,OAAO,IAAI,MAAM,GAAG,OAAO,IAAI,SAAS,GAAG,SAAS;AAAA,EAClE,CAAC;AAED,SAAO;AACT;AAMO,SAAS,eACd,IACA,UACA,QACA,SACM;AACN,KAAG,SAAS;AAAA,IACV,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,OAAO,IAAI,MAAM,GAAG,OAAO;AAAA,EACzC,CAAC;AACH;AAKO,SAAS,yBACd,IACA,UACA,UACA,YACA,QACA,WACM;AACN,KAAG,SAAS;AAAA,IACV,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,UAAU,UAAU,UAAU;AAAA,IAC9C,WAAW,CAAC,OAAO,IAAI,MAAM,GAAG,SAAS;AAAA,EAC3C,CAAC;AACH;AAOO,SAAS,mBACd,IACA,UACA,OACA,UACA,iBACA;AACA,QAAM,YAAY,OAAO,IAAI,QAAQ;AAErC,QAAM,CAAC,MAAM,IAAI,GAAG,SAAS;AAAA,IAC3B,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,WAAW,OAAO,IAAI,KAAK,CAAC;AAAA,EAC1C,CAAC;AAGD,QAAM,UAAU,GAAG,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;AAG9C,KAAG,SAAS;AAAA,IACV,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,WAAW,iBAAiB,OAAO;AAAA,EACjD,CAAC;AACH;;;AC/GO,IAAM,eAAe;AAGrB,IAAM,aAAa,GAAG;AAGtB,IAAM,kBAAkB,GAAG;AAK3B,SAAS,YACd,IAC4C;AAC5C,MAAI,CAAC,OAAO,aAAa,IAAI,GAAG,SAAS;AAAA,IACvC,QAAQ,GAAG;AAAA,EACb,CAAC;AAED,SAAO,CAAC,OAAO,aAAa;AAC9B;AAMO,SAAS,oBAAoB,IAA2C;AAC7E,MAAI,CAAC,OAAO,aAAa,IAAI,GAAG,SAAS;AAAA,IACvC,QAAQ,GAAG;AAAA,EACb,CAAC;AAED,KAAG,SAAS;AAAA,IACV,QAAQ;AAAA,IACR,eAAe,CAAC,UAAU;AAAA,IAC1B,WAAW,CAAC,KAAK;AAAA,EACnB,CAAC;AAED,SAAO;AACT;AAMO,SAAS,MACd,IACA,UACA,OACA,UACA,MACM;AACN,KAAG,SAAS;AAAA,IACV,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,OAAO,IAAI,KAAK,GAAG,OAAO,IAAI,QAAQ,GAAG,OAAO,IAAI,IAAI,CAAC;AAAA,EACvE,CAAC;AACH;AAUO,SAAS,KACd,IACA,UACA,OACA,UACA,QACA,MACM;AACN,KAAG,SAAS;AAAA,IACV,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW;AAAA,MACT,OAAO,IAAI,KAAK;AAAA,MAChB,OAAO,IAAI,QAAQ;AAAA,MACnB,OAAO,IAAI,MAAM;AAAA,MACjB,OAAO,IAAI,IAAI;AAAA,IACjB;AAAA,EACF,CAAC;AACH;AAMO,SAAS,KACd,IACA,UACA,OACA,UACA,QACqB;AACrB,MAAI,CAAC,IAAI,IAAI,GAAG,SAAS;AAAA,IACvB,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW;AAAA,MACT,OAAO,IAAI,KAAK;AAAA,MAChB,OAAO,IAAI,QAAQ;AAAA,MACnB,GAAG,KAAK,QAAQ,SAAS;AAAA,IAC3B;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAMO,SAAS,KACd,IACA,UACA,OACA,UACA,QACA,OACM;AACN,KAAG,SAAS;AAAA,IACV,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW;AAAA,MACT,OAAO,IAAI,KAAK;AAAA,MAChB,OAAO,IAAI,QAAQ;AAAA,MACnB,GAAG,KAAK,QAAQ,SAAS;AAAA,MACzB,GAAG,KAAK,OAAO,KAAK;AAAA,IACtB;AAAA,EACF,CAAC;AACH;AAMO,SAAS,OACd,IACA,UACA,OACA,UACA,QACM;AACN,KAAG,SAAS;AAAA,IACV,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW;AAAA,MACT,OAAO,IAAI,KAAK;AAAA,MAChB,OAAO,IAAI,QAAQ;AAAA,MACnB,GAAG,KAAK,QAAQ,SAAS;AAAA,IAC3B;AAAA,EACF,CAAC;AACH;AAMO,SAAS,aACd,IACA,UACA,OACA,UACA,MACA,OACM;AACN,KAAG,SAAS;AAAA,IACV,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW;AAAA,MACT,OAAO,IAAI,KAAK;AAAA,MAChB,OAAO,IAAI,QAAQ;AAAA,MACnB,OAAO,IAAI,IAAI;AAAA,MACf,GAAG,KAAK,OAAO,KAAK;AAAA,IACtB;AAAA,EACF,CAAC;AACH;AAMO,SAAS,SACd,IACA,UACA,OACA,QACA,SAC4C;AAC5C,MAAI,CAAC,MAAM,eAAe,IAAI,GAAG,SAAS;AAAA,IACxC,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW;AAAA,MACT,OAAO,IAAI,KAAK;AAAA,MAChB,GAAG,KAAK,QAAQ,SAAS;AAAA,MACzB,OAAO,IAAI,OAAO;AAAA,IACpB;AAAA,EACF,CAAC;AAED,SAAO,CAAC,MAAM,eAAe;AAC/B;AAMO,SAAS,kBACd,IACA,OACA,UACA,QACqB;AACrB,MAAI,YACF,WAAW,OACP,GAAG,KAAK,QAAQ,aAAa,IAC7B,GAAG,KAAK,EAAE,MAAM,KAAK,GAAG,aAAa;AAE3C,MAAI,CAAC,IAAI,IAAI,GAAG,SAAS;AAAA,IACvB,QAAQ,GAAG;AAAA,IACX,WAAW,CAAC,OAAO,IAAI,KAAK,GAAG,OAAO,IAAI,QAAQ,GAAG,SAAS;AAAA,EAChE,CAAC;AAED,SAAO;AACT;AAMO,SAAS,OACd,IACA,UACA,OACA,UACA,QACqB;AACrB,MAAI,CAAC,IAAI,IAAI,GAAG,SAAS;AAAA,IACvB,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW;AAAA,MACT,OAAO,IAAI,KAAK;AAAA,MAChB,OAAO,IAAI,QAAQ;AAAA,MACnB,GAAG,KAAK,QAAQ,SAAS;AAAA,IAC3B;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAMO,SAAS,UACd,IACA,UACA,OACA,UACA,QACqB;AACrB,MAAI,CAAC,IAAI,IAAI,GAAG,SAAS;AAAA,IACvB,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW;AAAA,MACT,OAAO,IAAI,KAAK;AAAA,MAChB,OAAO,IAAI,QAAQ;AAAA,MACnB,GAAG,KAAK,QAAQ,SAAS;AAAA,IAC3B;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAQO,SAAS,YACd,IACA,UACA,OACA,UACA,QAC4C;AAC5C,MAAI,CAAC,MAAM,OAAO,IAAI,GAAG,SAAS;AAAA,IAChC,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW;AAAA,MACT,OAAO,IAAI,KAAK;AAAA,MAChB,OAAO,IAAI,QAAQ;AAAA,MACnB,GAAG,KAAK,QAAQ,SAAS;AAAA,IAC3B;AAAA,EACF,CAAC;AAED,SAAO,CAAC,MAAM,OAAO;AACvB;AAMO,SAAS,YACd,IACA,UACA,OACA,MACA,SACM;AACN,KAAG,SAAS;AAAA,IACV,QAAQ,GAAG;AAAA,IACX,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,OAAO,IAAI,KAAK,GAAG,MAAM,OAAO;AAAA,EAC9C,CAAC;AACH;AAQO,SAAS,2BACd,IACA,UACA,SACA,SACA,QACA,QAC4B;AAE5B,MAAI,CAAC,WAAW,SAAS,UAAU;AAAW,WAAO;AAGrD,QAAM,OAAO,GAAG,WAAW,GAAG,KAAK,CAAC,GAAG,KAAK,QAAQ,KAAK,CAAC,CAAC;AAG3D,QAAM,CAAC,eAAe,eAAe,IAAI;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAMA,WAAS,QAAQ,OAAO,OAAO;AAC7B,UAAM,kBAAkB,6BAA6B,IAAI;AAEzD,YAAQ,iBAAiB;AAAA,MACvB,KAAK;AACH;AAAA,UACE;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR,OAAO;AAAA,UACP;AAAA,QACF;AACA;AAAA,MACF;AACE;AAAA,IACJ;AAAA,EACF;AAGA,iBAAe,IAAI,UAAU,OAAO,IAAI,eAAe;AAEvD,SAAO;AACT;;;ACjYA;AAAA,EAME;AAAA,OACK;AA8DP,eAAsB,WACpB,UACA,SACA,YACA;AAAA,EACE,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,cAAc,EAAE,aAAa,MAAM,UAAU,KAAK;AACpD,GACyB;AACzB,QAAM,EAAE,MAAM,YAAY,YAAY,IAAI,MAAM,SAAS,iBAAiB;AAAA,IACxE,UAAU;AAAA,IACV,GAAG;AAAA,EACL,CAAC;AAGD,QAAM,YAAY,iBAAiB,IAAI;AAKvC,QAAM,CAAC,OAAO,aAAa,cAAc,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC7D,qBACI,eAAe,UAAU,OAAO,IAChC,QAAQ,QAAQ,MAAS;AAAA,IAC7B,eACI,WAAW,UAAU,UAAU,SAAS,WAAW,IACnD,QAAQ,QAAQ,CAAC,CAAC;AAAA,IACtB,oBACI,WAAW,UAAU,UAAU,YAAY;AAAA,MACzC,SAAS;AAAA,MACT,aAAa;AAAA,IACf,CAAC,IACD,QAAQ,QAAQ,CAAC,CAAC;AAAA,EACxB,CAAC;AAED,MAAI;AAAoB,cAAU,QAAQ;AAC1C,MAAI;AAAc,cAAU,QAAQ;AACpC,MAAI;AACF,cAAU,SAAS,IAAI,CAAC,GAAG,MAAM;AAC/B,YAAM,SAAS,gBAAgB,eAAe,CAAC,CAAC;AAGhD,QAAE,QAAQ,QAAQ;AAClB,aAAO;AAAA,IACT,CAAC;AAEH,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AACF;;;ACtHO,IAAM,gCAAgC;AAW7C,eAAsB,oBACpB,UACA,MAC2B;AAE3B,QAAM,EAAE,KAAK,IAAI,MAAM,SAAS,YAAY;AAAA,IAC1C,OAAO;AAAA,MACL,eAAe,GAAG,iCAAiC;AAAA,IACrD;AAAA,EACF,CAAC;AAED,QAAM,SAAS,KAAK,IAAI,CAAC,UAAU,MAAM,UAA4B;AACrE,QAAM,WAAW,MAAM,SAAS,gBAAgB;AAAA,IAC9C,KAAK,OAAO,IAAI,CAAC,WAAW,OAAO,EAAE;AAAA,IACrC,SAAS,EAAE,SAAS,MAAM,WAAW,KAAK;AAAA,EAC5C,CAAC;AAED,SAAO,SACJ,OAAO,CAAC,WAAW,CAAC,CAAC,UAAU,UAAU,MAAM,EAC/C,IAAI,CAAC,EAAE,MAAM,OAAO,MAAM;AAGzB,QAAI,CAAC,UAAU,CAAC,OAAO,OAAO,EAAE,cAAc,OAAO,MAAM;AACzD,YAAM,IAAI;AAAA,QACR,mBAAmB,QAAQ;AAAA,MAC7B;AAAA,IACF;AAEA,QAAI,SAAS,IAAI;AAAA,MACf;AAAA,MACA,OAAO,IAAI;AAAA,MACX;AAAA,IACF;AAEA,WAAO;AAAA,MACL,IAAI,QAAQ;AAAA,MACZ,MAAM,wCAAwC;AAAA,MAC9C,OAAO,QAAQ;AAAA,MACf,OAAO,OAAO;AAAA,MACd,SAAS,OAAO;AAAA,IAClB;AAAA,EACF,CAAC;AACL;","names":[]}
1
+ {"version":3,"sources":["../src/utils.ts","../src/bcs.ts","../src/tx/transfer-policy.ts","../src/tx/kiosk.ts","../src/query/kiosk.ts","../src/query/transfer-policy.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n JsonRpcProvider,\n ObjectId,\n SharedObjectRef,\n SuiObjectRef,\n SuiObjectResponse,\n TransactionArgument,\n TransactionBlock,\n getObjectFields,\n} from '@mysten/sui.js';\nimport { KioskData, KioskListing } from './query/kiosk';\nimport { DynamicFieldInfo } from '@mysten/sui.js/dist/types/dynamic_fields';\nimport { bcs, Kiosk } from './bcs';\n\n/**\n * A valid argument for any of the Kiosk functions.\n */\nexport type ObjectArgument =\n | string\n | TransactionArgument\n | SharedObjectRef\n | SuiObjectRef;\n\n/**\n * Convert any valid input into a TransactionArgument.\n *\n * @param tx The transaction to use for creating the argument.\n * @param arg The argument to convert.\n * @returns The converted TransactionArgument.\n */\nexport function objArg(\n tx: TransactionBlock,\n arg: string | SharedObjectRef | SuiObjectRef | TransactionArgument,\n): TransactionArgument {\n if (typeof arg === 'string') {\n return tx.object(arg);\n }\n\n if ('digest' in arg && 'version' in arg && 'objectId' in arg) {\n return tx.objectRef(arg);\n }\n\n if ('objectId' in arg && 'initialSharedVersion' in arg && 'mutable' in arg) {\n return tx.sharedObjectRef(arg);\n }\n\n if ('kind' in arg) {\n return arg;\n }\n\n throw new Error('Invalid argument type');\n}\n\nexport async function getKioskObject(\n provider: JsonRpcProvider,\n id: string,\n): Promise<Kiosk> {\n const queryRes = await provider.getObject({ id, options: { showBcs: true } });\n\n if (!queryRes || queryRes.error || !queryRes.data) {\n throw new Error(`Kiosk ${id} not found; ${queryRes.error}`);\n }\n\n if (!queryRes.data.bcs || !('bcsBytes' in queryRes.data.bcs)) {\n throw new Error(`Invalid kiosk query: ${id}, expected object, got package`);\n }\n\n return bcs.de('0x2::kiosk::Kiosk', queryRes.data.bcs!.bcsBytes, 'base64');\n}\n\n// helper to extract kiosk data from dynamic fields.\nexport function extractKioskData(\n data: DynamicFieldInfo[],\n listings: KioskListing[],\n lockedItemIds: string[],\n): KioskData {\n return data.reduce<KioskData>(\n (acc: KioskData, val: DynamicFieldInfo) => {\n const type = getTypeWithoutPackageAddress(val.name.type);\n\n switch (type) {\n case 'kiosk::Item':\n acc.itemIds.push(val.objectId);\n acc.items.push({\n objectId: val.objectId,\n type: val.objectType,\n isLocked: false,\n });\n break;\n case 'kiosk::Listing':\n acc.listingIds.push(val.objectId);\n listings.push({\n objectId: val.name.value.id,\n listingId: val.objectId,\n isExclusive: val.name.value.is_exclusive,\n });\n break;\n case 'kiosk::Lock':\n lockedItemIds?.push(val.name.value.id);\n break;\n }\n return acc;\n },\n { items: [], itemIds: [], listingIds: [], extensions: [] },\n );\n}\n\n// e.g. 0x2::kiosk::Item -> kiosk::Item\nexport const getTypeWithoutPackageAddress = (type: string) => {\n return type.split('::').slice(-2).join('::');\n};\n\n/**\n * A helper that attaches the listing prices to kiosk listings.\n */\nexport const attachListingsAndPrices = (\n kioskData: KioskData,\n listings: KioskListing[],\n listingObjects: SuiObjectResponse[],\n) => {\n // map item listings as {item_id: KioskListing}\n // for easier mapping on the nex\n const itemListings = listings.reduce<Record<ObjectId, KioskListing>>(\n (acc: Record<ObjectId, KioskListing>, item, idx) => {\n acc[item.objectId] = { ...item };\n\n // return in case we don't have any listing objects.\n // that's the case when we don't have the `listingPrices` included.\n if (listingObjects.length === 0) return acc;\n\n const data = getObjectFields(listingObjects[idx]);\n if (!data) return acc;\n\n acc[item.objectId].price = data.value;\n return acc;\n },\n {},\n );\n\n kioskData.items.map((item) => {\n item.listing = itemListings[item.objectId] || undefined;\n });\n};\n\n/**\n * A Helper to attach locked state to items in Kiosk Data.\n */\nexport const attachLockedItems = (\n kioskData: KioskData,\n lockedItemIds: ObjectId[],\n) => {\n // map lock status in an array of type { item_id: true }\n const lockedStatuses = lockedItemIds.reduce<Record<ObjectId, boolean>>(\n (acc: Record<ObjectId, boolean>, item: string) => {\n acc[item] = true;\n return acc;\n },\n {},\n );\n\n // parse lockedItemIds and attach their locked status.\n kioskData.items.map((item) => {\n item.isLocked = lockedStatuses[item.objectId] || false;\n });\n};\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { ObjectOwner, bcs } from '@mysten/sui.js';\n\n/**\n * The Kiosk object fields (for BCS queries).\n */\nexport type Kiosk = {\n id: string;\n profits: string;\n owner: string;\n itemCount: number;\n allowExtensions: boolean;\n};\n\n// Register the `Kiosk` struct for faster queries.\nbcs.registerStructType('0x2::kiosk::Kiosk', {\n id: 'address',\n profits: 'u64',\n owner: 'address',\n itemCount: 'u32',\n allowExtensions: 'bool',\n});\n\n/**\n * PurchaseCap object fields (for BCS queries).\n */\nexport type PurchaseCap = {\n id: string;\n kioskId: string;\n itemId: string;\n minPrice: string;\n};\n\n// Register the `PurchaseCap` for faster queries.\nbcs.registerStructType('0x2::kiosk::PurchaseCap', {\n id: 'address',\n kioskId: 'address',\n itemId: 'address',\n minPrice: 'u64',\n});\n\n/** Event emitted when a TransferPolicy is created. */\nexport type TransferPolicyCreated = {\n id: string;\n};\n\n// Register the `TransferPolicyCreated` event data.\nbcs.registerStructType('0x2::transfer_policy::TransferPolicyCreated', {\n id: 'address',\n});\n\n/** The `TransferPolicy` object */\nexport type TransferPolicy = {\n id: string;\n type: string;\n balance: string;\n rules: string[];\n owner: ObjectOwner;\n};\n\nbcs.registerStructType('0x2::transfer_policy::TransferPolicy', {\n id: 'address',\n balance: 'u64',\n rules: ['vector', 'string'],\n});\n\nexport { bcs };\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { TransactionArgument, TransactionBlock } from '@mysten/sui.js';\nimport { ObjectArgument, objArg } from '../utils';\n\n/** The Transfer Policy module. */\nexport const TRANSFER_POLICY_MODULE = '0x2::transfer_policy';\n\n/** The Transer Policy Rules package address */\n// TODO: Figure out how we serve this for both testnet & mainnet (different package)\nexport const TRANSFER_POLICY_RULES_PACKAGE_ADDRESS =\n 'bd8fc1947cf119350184107a3087e2dc27efefa0dd82e25a1f699069fe81a585';\n\n/**\n * Call the `transfer_policy::new` function to create a new transfer policy.\n * Returns `transferPolicyCap`\n */\nexport function createTransferPolicy(\n tx: TransactionBlock,\n itemType: string,\n publisher: ObjectArgument,\n): TransactionArgument {\n let [transferPolicy, transferPolicyCap] = tx.moveCall({\n target: `${TRANSFER_POLICY_MODULE}::new`,\n typeArguments: [itemType],\n arguments: [objArg(tx, publisher)],\n });\n\n tx.moveCall({\n target: `0x2::transfer::public_share_object`,\n typeArguments: [itemType],\n arguments: [transferPolicy],\n });\n\n return transferPolicyCap;\n}\n\n/**\n * Call the `transfer_policy::withdraw` function to withdraw profits from a transfer policy.\n */\nexport function withdrawFromPolicy(\n tx: TransactionBlock,\n itemType: string,\n policy: ObjectArgument,\n policyCap: ObjectArgument,\n amount: string | bigint | null,\n): TransactionArgument {\n let amountArg =\n amount !== null\n ? tx.pure(amount, 'Option<u64>')\n : tx.pure({ None: true }, 'Option<u64>');\n\n let [profits] = tx.moveCall({\n target: `${TRANSFER_POLICY_MODULE}::withdraw`,\n typeArguments: [itemType],\n arguments: [objArg(tx, policy), objArg(tx, policyCap), amountArg],\n });\n\n return profits;\n}\n\n/**\n * Call the `transfer_policy::confirm_request` function to unblock the\n * transaction.\n */\nexport function confirmRequest(\n tx: TransactionBlock,\n itemType: string,\n policy: ObjectArgument,\n request: TransactionArgument,\n): void {\n tx.moveCall({\n target: `${TRANSFER_POLICY_MODULE}::confirm_request`,\n typeArguments: [itemType],\n arguments: [objArg(tx, policy), request],\n });\n}\n\n/**\n * Calls the `transfer_policy::remove_rule` function to remove a Rule from the transfer policy's ruleset.\n */\nexport function removeTransferPolicyRule(\n tx: TransactionBlock,\n itemType: string,\n ruleType: string,\n configType: string,\n policy: ObjectArgument,\n policyCap: TransactionArgument,\n): void {\n tx.moveCall({\n target: `${TRANSFER_POLICY_MODULE}::remove_rule`,\n typeArguments: [itemType, ruleType, configType],\n arguments: [objArg(tx, policy), policyCap],\n });\n}\n\n/**\n * Calculates the amount to be paid for the royalty rule to be resolved,\n * splits the coin to pass the exact amount,\n * then calls the `royalty_rule::pay` function to resolve the royalty rule.\n */\nexport function resolveRoyaltyRule(\n tx: TransactionBlock,\n itemType: string,\n price: string,\n policyId: string,\n transferRequest: TransactionArgument,\n) {\n const policyObj = objArg(tx, policyId);\n // calculates the amount\n const [amount] = tx.moveCall({\n target: `${TRANSFER_POLICY_RULES_PACKAGE_ADDRESS}::royalty_rule::fee_amount`,\n typeArguments: [itemType],\n arguments: [policyObj, objArg(tx, price)],\n });\n\n // splits the coin.\n const feeCoin = tx.splitCoins(tx.gas, [amount]);\n\n // pays the policy\n tx.moveCall({\n target: `${TRANSFER_POLICY_RULES_PACKAGE_ADDRESS}::royalty_rule::pay`,\n typeArguments: [itemType],\n arguments: [policyObj, transferRequest, feeCoin],\n });\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n SuiAddress,\n TransactionArgument,\n TransactionBlock,\n} from '@mysten/sui.js';\n\nimport { ObjectArgument, getTypeWithoutPackageAddress, objArg } from '../utils';\nimport { KioskListing } from '../query/kiosk';\nimport { TransferPolicy } from '../bcs';\nimport { confirmRequest, resolveRoyaltyRule } from './transfer-policy';\n\n/** The Kiosk module. */\nexport const KIOSK_MODULE = '0x2::kiosk';\n\n/** The Kiosk type. */\nexport const KIOSK_TYPE = `${KIOSK_MODULE}::Kiosk`;\n\n/** The Kiosk Owner Cap Type */\nexport const KIOSK_OWNER_CAP = `${KIOSK_MODULE}::KioskOwnerCap`;\n\n/**\n * Create a new shared Kiosk and returns the [kiosk, kioskOwnerCap] tuple.\n */\nexport function createKiosk(\n tx: TransactionBlock,\n): [TransactionArgument, TransactionArgument] {\n let [kiosk, kioskOwnerCap] = tx.moveCall({\n target: `${KIOSK_MODULE}::new`,\n });\n\n return [kiosk, kioskOwnerCap];\n}\n\n/**\n * Calls the `kiosk::new()` function and shares the kiosk.\n * Returns the `kioskOwnerCap` object.\n */\nexport function createKioskAndShare(tx: TransactionBlock): TransactionArgument {\n let [kiosk, kioskOwnerCap] = tx.moveCall({\n target: `${KIOSK_MODULE}::new`,\n });\n\n tx.moveCall({\n target: `0x2::transfer::public_share_object`,\n typeArguments: [KIOSK_TYPE],\n arguments: [kiosk],\n });\n\n return kioskOwnerCap;\n}\n\n/**\n * Call the `kiosk::place<T>(Kiosk, KioskOwnerCap, Item)` function.\n * Place an item to the Kiosk.\n */\nexport function place(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n item: ObjectArgument,\n): void {\n tx.moveCall({\n target: `${KIOSK_MODULE}::place`,\n typeArguments: [itemType],\n arguments: [objArg(tx, kiosk), objArg(tx, kioskCap), objArg(tx, item)],\n });\n}\n\n/**\n * Call the `kiosk::lock<T>(Kiosk, KioskOwnerCap, TransferPolicy, Item)`\n * function. Lock an item in the Kiosk.\n *\n * Unlike `place` this function requires a `TransferPolicy` to exist\n * and be passed in. This is done to make sure the item does not get\n * locked without an option to take it out.\n */\nexport function lock(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n policy: ObjectArgument,\n item: ObjectArgument,\n): void {\n tx.moveCall({\n target: `${KIOSK_MODULE}::lock`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n objArg(tx, policy),\n objArg(tx, item),\n ],\n });\n}\n\n/**\n * Call the `kiosk::take<T>(Kiosk, KioskOwnerCap, ID)` function.\n * Take an item from the Kiosk.\n */\nexport function take(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n itemId: SuiAddress,\n): TransactionArgument {\n let [item] = tx.moveCall({\n target: `${KIOSK_MODULE}::take`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n tx.pure(itemId, 'address'),\n ],\n });\n\n return item;\n}\n\n/**\n * Call the `kiosk::list<T>(Kiosk, KioskOwnerCap, ID, u64)` function.\n * List an item for sale.\n */\nexport function list(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n itemId: SuiAddress,\n price: string | bigint,\n): void {\n tx.moveCall({\n target: `${KIOSK_MODULE}::list`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n tx.pure(itemId, 'address'),\n tx.pure(price, 'u64'),\n ],\n });\n}\n\n/**\n * Call the `kiosk::list<T>(Kiosk, KioskOwnerCap, ID, u64)` function.\n * List an item for sale.\n */\nexport function delist(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n itemId: SuiAddress,\n): void {\n tx.moveCall({\n target: `${KIOSK_MODULE}::delist`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n tx.pure(itemId, 'address'),\n ],\n });\n}\n\n/**\n * Call the `kiosk::place_and_list<T>(Kiosk, KioskOwnerCap, Item, u64)` function.\n * Place an item to the Kiosk and list it for sale.\n */\nexport function placeAndList(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n item: ObjectArgument,\n price: string | bigint,\n): void {\n tx.moveCall({\n target: `${KIOSK_MODULE}::place_and_list`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n objArg(tx, item),\n tx.pure(price, 'u64'),\n ],\n });\n}\n\n/**\n * Call the `kiosk::purchase<T>(Kiosk, ID, Coin<SUI>)` function and receive an Item and\n * a TransferRequest which needs to be dealt with (via a matching TransferPolicy).\n */\nexport function purchase(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n itemId: SuiAddress,\n payment: ObjectArgument,\n): [TransactionArgument, TransactionArgument] {\n let [item, transferRequest] = tx.moveCall({\n target: `${KIOSK_MODULE}::purchase`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n tx.pure(itemId, 'address'),\n objArg(tx, payment),\n ],\n });\n\n return [item, transferRequest];\n}\n\n/**\n * Call the `kiosk::withdraw(Kiosk, KioskOwnerCap, Option<u64>)` function and receive a Coin<SUI>.\n * If the amount is null, then the entire balance will be withdrawn.\n */\nexport function withdrawFromKiosk(\n tx: TransactionBlock,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n amount: string | bigint | null,\n): TransactionArgument {\n let amountArg =\n amount !== null\n ? tx.pure(amount, 'Option<u64>')\n : tx.pure({ None: true }, 'Option<u64>');\n\n let [coin] = tx.moveCall({\n target: `${KIOSK_MODULE}::withdraw`,\n arguments: [objArg(tx, kiosk), objArg(tx, kioskCap), amountArg],\n });\n\n return coin;\n}\n\n/**\n * Call the `kiosk::borrow<T>(Kiosk, KioskOwnerCap, ID): &T` function.\n * Immutably borrow an item from the Kiosk.\n */\nexport function borrow(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n itemId: SuiAddress,\n): TransactionArgument {\n let [item] = tx.moveCall({\n target: `${KIOSK_MODULE}::borrow`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n tx.pure(itemId, 'address'),\n ],\n });\n\n return item;\n}\n\n/**\n * Call the `kiosk::borrow_mut<T>(Kiosk, KioskOwnerCap, ID): &mut T` function.\n * Mutably borrow an item from the Kiosk.\n */\nexport function borrowMut(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n itemId: SuiAddress,\n): TransactionArgument {\n let [item] = tx.moveCall({\n target: `${KIOSK_MODULE}::borrow_mut`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n tx.pure(itemId, 'address'),\n ],\n });\n\n return item;\n}\n\n/**\n * Call the `kiosk::borrow_value<T>(Kiosk, KioskOwnerCap, ID): T` function.\n * Immutably borrow an item from the Kiosk and return it in the end.\n *\n * Requires calling `returnValue` to return the item.\n */\nexport function borrowValue(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n kioskCap: ObjectArgument,\n itemId: SuiAddress,\n): [TransactionArgument, TransactionArgument] {\n let [item, promise] = tx.moveCall({\n target: `${KIOSK_MODULE}::borrow_val`,\n typeArguments: [itemType],\n arguments: [\n objArg(tx, kiosk),\n objArg(tx, kioskCap),\n tx.pure(itemId, 'address'),\n ],\n });\n\n return [item, promise];\n}\n\n/**\n * Call the `kiosk::return_value<T>(Kiosk, Item, Borrow)` function.\n * Return an item to the Kiosk after it was `borrowValue`-d.\n */\nexport function returnValue(\n tx: TransactionBlock,\n itemType: string,\n kiosk: ObjectArgument,\n item: TransactionArgument,\n promise: TransactionArgument,\n): void {\n tx.moveCall({\n target: `${KIOSK_MODULE}::return_val`,\n typeArguments: [itemType],\n arguments: [objArg(tx, kiosk), item, promise],\n });\n}\n\n/**\n * Completes the full purchase flow that includes:\n * 1. Purchasing the item.\n * 2. Resolving all the transfer policies (if any).\n * 3. Returns the PurchasedItem OR places the item in the user's kiosk (if there's a kiosk lock policy).\n */\nexport function purchaseAndResolvePolicies(\n tx: TransactionBlock,\n itemType: string,\n listing: KioskListing,\n kioskId: string,\n itemId: string,\n policy: TransferPolicy,\n): TransactionArgument | null {\n // if we don't pass the listing or the listing doens't have a price, return.\n if (!listing || listing?.price === undefined) return null;\n\n // Split the coin for the amount of the listing.\n const coin = tx.splitCoins(tx.gas, [tx.pure(listing.price)]);\n\n // initialize the purchase `kiosk::purchase`\n const [purchasedItem, transferRequest] = purchase(\n tx,\n itemType,\n kioskId,\n itemId,\n coin,\n );\n\n // Start resolving rules.\n // For now, we only support royalty rule.\n // Will need some tweaking to make it function properly with the other\n // ruleset.\n for (let rule of policy.rules) {\n const ruleWithoutAddr = getTypeWithoutPackageAddress(rule);\n\n switch (ruleWithoutAddr) {\n case 'royalty_rule::Rule':\n resolveRoyaltyRule(\n tx,\n itemType,\n listing.price,\n policy.id,\n transferRequest,\n );\n break;\n default:\n break;\n }\n }\n\n // confirm the Transfer Policy request.\n confirmRequest(tx, itemType, policy.id, transferRequest);\n\n return purchasedItem;\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n JsonRpcProvider,\n ObjectId,\n ObjectType,\n PaginationArguments,\n SuiAddress,\n} from '@mysten/sui.js';\nimport {\n attachListingsAndPrices,\n attachLockedItems,\n extractKioskData,\n getKioskObject,\n} from '../utils';\nimport { Kiosk } from '../bcs';\n\n/**\n * A dynamic field `Listing { ID, isExclusive }` attached to the Kiosk.\n * Holds a `u64` value - the price of the item.\n */\nexport type KioskListing = {\n /** The ID of the Item */\n objectId: ObjectId;\n /**\n * Whether or not there's a `PurchaseCap` issued. `true` means that\n * the listing is controlled by some logic and can't be purchased directly.\n *\n * TODO: consider renaming the field for better indication.\n */\n isExclusive: boolean;\n /** The ID of the listing */\n listingId: ObjectId;\n price?: string;\n};\n\n/**\n * A dynamic field `Item { ID }` attached to the Kiosk.\n * Holds an Item `T`. The type of the item is known upfront.\n */\nexport type KioskItem = {\n /** The ID of the Item */\n objectId: ObjectId;\n /** The type of the Item */\n type: ObjectType;\n /** Whether the item is Locked (there must be a `Lock` Dynamic Field) */\n isLocked: boolean;\n /** Optional listing */\n listing?: KioskListing;\n};\n/**\n * Aggregated data from the Kiosk.\n */\nexport type KioskData = {\n items: KioskItem[];\n itemIds: ObjectId[];\n listingIds: ObjectId[];\n kiosk?: Kiosk;\n extensions: any[]; // type will be defined on later versions of the SDK.\n};\n\nexport type PagedKioskData = {\n data: KioskData;\n nextCursor: string | null;\n hasNextPage: boolean;\n};\n\nexport type FetchKioskOptions = {\n withKioskFields?: boolean;\n withListingPrices?: boolean;\n};\n\nexport async function fetchKiosk(\n provider: JsonRpcProvider,\n kioskId: SuiAddress,\n pagination: PaginationArguments<string>,\n options: FetchKioskOptions,\n): Promise<PagedKioskData> {\n const { data, nextCursor, hasNextPage } = await provider.getDynamicFields({\n parentId: kioskId,\n ...pagination,\n });\n\n const listings: KioskListing[] = [];\n const lockedItemIds: ObjectId[] = [];\n\n // extracted kiosk data.\n const kioskData = extractKioskData(data, listings, lockedItemIds);\n\n // split the fetching in two queries as we are most likely passing different options for each kind.\n // For items, we usually seek the Display.\n // For listings we usually seek the DF value (price) / exclusivity.\n const [kiosk, listingObjects] = await Promise.all([\n options.withKioskFields\n ? getKioskObject(provider, kioskId)\n : Promise.resolve(undefined),\n options.withListingPrices\n ? provider.multiGetObjects({\n ids: kioskData.listingIds,\n options: {\n showContent: true,\n },\n })\n : Promise.resolve([]),\n ]);\n\n if (options.withKioskFields) kioskData.kiosk = kiosk;\n // attach items listings. IF we have `options.withListingPrices === true`, it will also attach the prices.\n attachListingsAndPrices(kioskData, listings, listingObjects);\n // add `locked` status to items that are locked.\n attachLockedItems(kioskData, lockedItemIds);\n\n return {\n data: kioskData,\n nextCursor,\n hasNextPage,\n };\n}\n","// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { JsonRpcProvider } from '@mysten/sui.js';\nimport { TransferPolicy, bcs } from '../bcs';\n\n/** Name of the event emitted when a TransferPolicy for T is created. */\nexport const TRANSFER_POLICY_CREATED_EVENT = `0x2::transfer_policy::TransferPolicyCreated`;\n\n/**\n * Searches the `TransferPolicy`-s for the given type. The seach is performed via\n * the `TransferPolicyCreated` event. The policy can either be owned or shared,\n * and the caller needs to filter the results accordingly (ie single owner can not\n * be accessed by anyone but the owner).\n *\n * @param provider\n * @param type\n */\nexport async function queryTransferPolicy(\n provider: JsonRpcProvider,\n type: string,\n): Promise<TransferPolicy[]> {\n // console.log('event type: %s', `${TRANSFER_POLICY_CREATED_EVENT}<${type}>`);\n const { data } = await provider.queryEvents({\n query: {\n MoveEventType: `${TRANSFER_POLICY_CREATED_EVENT}<${type}>`,\n },\n });\n\n const search = data.map((event) => event.parsedJson as { id: string });\n const policies = await provider.multiGetObjects({\n ids: search.map((policy) => policy.id),\n options: { showBcs: true, showOwner: true },\n });\n\n return policies\n .filter((policy) => !!policy && 'data' in policy)\n .map(({ data: policy }) => {\n // should never happen; policies are objects and fetched via an event.\n // policies are filtered for null and undefined above.\n if (!policy || !policy.bcs || !('bcsBytes' in policy.bcs)) {\n throw new Error(\n `Invalid policy: ${policy?.objectId}, expected object, got package`,\n );\n }\n\n let parsed = bcs.de(\n '0x2::transfer_policy::TransferPolicy',\n policy.bcs.bcsBytes,\n 'base64',\n );\n\n return {\n id: policy?.objectId,\n type: `0x2::transfer_policy::TransferPolicy<${type}>`,\n owner: policy?.owner!,\n rules: parsed.rules,\n balance: parsed.balance,\n } as TransferPolicy;\n });\n}\n"],"mappings":"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","names":[]}
@@ -1,4 +1,4 @@
1
- import { JsonRpcProvider, PaginationArguments, SuiAddress, SuiObjectDataOptions, SuiObjectResponse } from '@mysten/sui.js';
1
+ import { JsonRpcProvider, ObjectId, ObjectType, PaginationArguments, SuiAddress } from '@mysten/sui.js';
2
2
  import { Kiosk } from '../bcs';
3
3
  /**
4
4
  * A dynamic field `Listing { ID, isExclusive }` attached to the Kiosk.
@@ -6,7 +6,7 @@ import { Kiosk } from '../bcs';
6
6
  */
7
7
  export type KioskListing = {
8
8
  /** The ID of the Item */
9
- itemId: string;
9
+ objectId: ObjectId;
10
10
  /**
11
11
  * Whether or not there's a `PurchaseCap` issued. `true` means that
12
12
  * the listing is controlled by some logic and can't be purchased directly.
@@ -15,7 +15,7 @@ export type KioskListing = {
15
15
  */
16
16
  isExclusive: boolean;
17
17
  /** The ID of the listing */
18
- listingId: string;
18
+ listingId: ObjectId;
19
19
  price?: string;
20
20
  };
21
21
  /**
@@ -24,19 +24,23 @@ export type KioskListing = {
24
24
  */
25
25
  export type KioskItem = {
26
26
  /** The ID of the Item */
27
- itemId: string;
27
+ objectId: ObjectId;
28
28
  /** The type of the Item */
29
- itemType: string;
29
+ type: ObjectType;
30
+ /** Whether the item is Locked (there must be a `Lock` Dynamic Field) */
31
+ isLocked: boolean;
32
+ /** Optional listing */
33
+ listing?: KioskListing;
30
34
  };
31
35
  /**
32
36
  * Aggregated data from the Kiosk.
33
37
  */
34
38
  export type KioskData = {
35
- items: KioskItem[] | SuiObjectResponse[];
36
- listings: KioskListing[];
37
- itemIds: string[];
38
- listingIds: string[];
39
+ items: KioskItem[];
40
+ itemIds: ObjectId[];
41
+ listingIds: ObjectId[];
39
42
  kiosk?: Kiosk;
43
+ extensions: any[];
40
44
  };
41
45
  export type PagedKioskData = {
42
46
  data: KioskData;
@@ -44,13 +48,7 @@ export type PagedKioskData = {
44
48
  hasNextPage: boolean;
45
49
  };
46
50
  export type FetchKioskOptions = {
47
- includeKioskFields?: boolean;
48
- includeItems?: boolean;
49
- itemOptions?: SuiObjectDataOptions;
51
+ withKioskFields?: boolean;
50
52
  withListingPrices?: boolean;
51
- listingOptions?: SuiObjectDataOptions;
52
53
  };
53
- /**
54
- *
55
- */
56
- export declare function fetchKiosk(provider: JsonRpcProvider, kioskId: SuiAddress, pagination: PaginationArguments<string>, { includeKioskFields, includeItems, withListingPrices, itemOptions, }: FetchKioskOptions): Promise<PagedKioskData>;
54
+ export declare function fetchKiosk(provider: JsonRpcProvider, kioskId: SuiAddress, pagination: PaginationArguments<string>, options: FetchKioskOptions): Promise<PagedKioskData>;
package/dist/utils.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { JsonRpcProvider, SharedObjectRef, SuiObjectDataOptions, SuiObjectRef, TransactionArgument, TransactionBlock } from '@mysten/sui.js';
2
- import { KioskData } from './query/kiosk';
1
+ import { JsonRpcProvider, ObjectId, SharedObjectRef, SuiObjectRef, SuiObjectResponse, TransactionArgument, TransactionBlock } from '@mysten/sui.js';
2
+ import { KioskData, KioskListing } from './query/kiosk';
3
3
  import { DynamicFieldInfo } from '@mysten/sui.js/dist/types/dynamic_fields';
4
4
  import { Kiosk } from './bcs';
5
5
  /**
@@ -15,61 +15,13 @@ export type ObjectArgument = string | TransactionArgument | SharedObjectRef | Su
15
15
  */
16
16
  export declare function objArg(tx: TransactionBlock, arg: string | SharedObjectRef | SuiObjectRef | TransactionArgument): TransactionArgument;
17
17
  export declare function getKioskObject(provider: JsonRpcProvider, id: string): Promise<Kiosk>;
18
- export declare function extractKioskData(data: DynamicFieldInfo[]): KioskData;
19
- export declare function getObjects(provider: JsonRpcProvider, ids: string[], options: SuiObjectDataOptions): Promise<{
20
- data?: {
21
- objectId: string;
22
- version: string;
23
- digest: string;
24
- type?: string | undefined;
25
- bcs?: {
26
- type: string;
27
- version: string;
28
- hasPublicTransfer: boolean;
29
- dataType: "moveObject";
30
- bcsBytes: string;
31
- } | {
32
- id: string;
33
- dataType: "package";
34
- moduleMap: Record<string, string>;
35
- } | undefined;
36
- owner?: "Immutable" | {
37
- AddressOwner: string;
38
- } | {
39
- ObjectOwner: string;
40
- } | {
41
- Shared: {
42
- initial_shared_version: number;
43
- };
44
- } | undefined;
45
- storageRebate?: string | undefined;
46
- previousTransaction?: string | undefined;
47
- content?: {
48
- type: string;
49
- fields: Record<string, any>;
50
- hasPublicTransfer: boolean;
51
- dataType: "moveObject";
52
- } | {
53
- disassembled: Record<string, string>;
54
- dataType: "package";
55
- } | undefined;
56
- display?: Record<string, string> | {
57
- data: Record<string, string> | null;
58
- error: {
59
- code: string;
60
- version?: number | undefined;
61
- digest?: string | undefined;
62
- error?: string | undefined;
63
- object_id?: string | undefined;
64
- } | null;
65
- } | undefined;
66
- } | undefined;
67
- error?: {
68
- code: string;
69
- version?: number | undefined;
70
- digest?: string | undefined;
71
- error?: string | undefined;
72
- object_id?: string | undefined;
73
- } | undefined;
74
- }[]>;
18
+ export declare function extractKioskData(data: DynamicFieldInfo[], listings: KioskListing[], lockedItemIds: string[]): KioskData;
75
19
  export declare const getTypeWithoutPackageAddress: (type: string) => string;
20
+ /**
21
+ * A helper that attaches the listing prices to kiosk listings.
22
+ */
23
+ export declare const attachListingsAndPrices: (kioskData: KioskData, listings: KioskListing[], listingObjects: SuiObjectResponse[]) => void;
24
+ /**
25
+ * A Helper to attach locked state to items in Kiosk Data.
26
+ */
27
+ export declare const attachLockedItems: (kioskData: KioskData, lockedItemIds: ObjectId[]) => void;
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@mysten/kiosk",
3
3
  "author": "Mysten Labs <build@mystenlabs.com>",
4
4
  "description": "Sui Kiosk library",
5
- "version": "0.0.0-experimental-20230529214729",
5
+ "version": "0.0.0-experimental-20230530145812",
6
6
  "license": "Apache-2.0",
7
7
  "main": "./dist/index.js",
8
8
  "module": "./dist/index.mjs",
@@ -24,7 +24,7 @@
24
24
  }
25
25
  },
26
26
  "dependencies": {
27
- "@mysten/sui.js": "0.0.0-experimental-20230529214729"
27
+ "@mysten/sui.js": "0.35.0"
28
28
  },
29
29
  "devDependencies": {
30
30
  "eslint": "^8.38.0",
@@ -3,13 +3,17 @@
3
3
 
4
4
  import {
5
5
  JsonRpcProvider,
6
+ ObjectId,
7
+ ObjectType,
6
8
  PaginationArguments,
7
9
  SuiAddress,
8
- SuiObjectDataOptions,
9
- SuiObjectResponse,
10
- getObjectFields,
11
10
  } from '@mysten/sui.js';
12
- import { extractKioskData, getKioskObject, getObjects } from '../utils';
11
+ import {
12
+ attachListingsAndPrices,
13
+ attachLockedItems,
14
+ extractKioskData,
15
+ getKioskObject,
16
+ } from '../utils';
13
17
  import { Kiosk } from '../bcs';
14
18
 
15
19
  /**
@@ -18,7 +22,7 @@ import { Kiosk } from '../bcs';
18
22
  */
19
23
  export type KioskListing = {
20
24
  /** The ID of the Item */
21
- itemId: string;
25
+ objectId: ObjectId;
22
26
  /**
23
27
  * Whether or not there's a `PurchaseCap` issued. `true` means that
24
28
  * the listing is controlled by some logic and can't be purchased directly.
@@ -27,7 +31,7 @@ export type KioskListing = {
27
31
  */
28
32
  isExclusive: boolean;
29
33
  /** The ID of the listing */
30
- listingId: string;
34
+ listingId: ObjectId;
31
35
  price?: string;
32
36
  };
33
37
 
@@ -37,20 +41,23 @@ export type KioskListing = {
37
41
  */
38
42
  export type KioskItem = {
39
43
  /** The ID of the Item */
40
- itemId: string;
44
+ objectId: ObjectId;
41
45
  /** The type of the Item */
42
- itemType: string;
46
+ type: ObjectType;
47
+ /** Whether the item is Locked (there must be a `Lock` Dynamic Field) */
48
+ isLocked: boolean;
49
+ /** Optional listing */
50
+ listing?: KioskListing;
43
51
  };
44
-
45
52
  /**
46
53
  * Aggregated data from the Kiosk.
47
54
  */
48
55
  export type KioskData = {
49
- items: KioskItem[] | SuiObjectResponse[];
50
- listings: KioskListing[];
51
- itemIds: string[];
52
- listingIds: string[];
56
+ items: KioskItem[];
57
+ itemIds: ObjectId[];
58
+ listingIds: ObjectId[];
53
59
  kiosk?: Kiosk;
60
+ extensions: any[]; // type will be defined on later versions of the SDK.
54
61
  };
55
62
 
56
63
  export type PagedKioskData = {
@@ -60,63 +67,49 @@ export type PagedKioskData = {
60
67
  };
61
68
 
62
69
  export type FetchKioskOptions = {
63
- includeKioskFields?: boolean;
64
- includeItems?: boolean;
65
- itemOptions?: SuiObjectDataOptions;
70
+ withKioskFields?: boolean;
66
71
  withListingPrices?: boolean;
67
- listingOptions?: SuiObjectDataOptions;
68
72
  };
69
73
 
70
- /**
71
- *
72
- */
73
74
  export async function fetchKiosk(
74
75
  provider: JsonRpcProvider,
75
76
  kioskId: SuiAddress,
76
77
  pagination: PaginationArguments<string>,
77
- {
78
- includeKioskFields = false,
79
- includeItems = false,
80
- withListingPrices = false,
81
- itemOptions = { showDisplay: true, showType: true },
82
- }: FetchKioskOptions,
78
+ options: FetchKioskOptions,
83
79
  ): Promise<PagedKioskData> {
84
80
  const { data, nextCursor, hasNextPage } = await provider.getDynamicFields({
85
81
  parentId: kioskId,
86
82
  ...pagination,
87
83
  });
88
84
 
85
+ const listings: KioskListing[] = [];
86
+ const lockedItemIds: ObjectId[] = [];
87
+
89
88
  // extracted kiosk data.
90
- const kioskData = extractKioskData(data);
89
+ const kioskData = extractKioskData(data, listings, lockedItemIds);
91
90
 
92
91
  // split the fetching in two queries as we are most likely passing different options for each kind.
93
92
  // For items, we usually seek the Display.
94
93
  // For listings we usually seek the DF value (price) / exclusivity.
95
- const [kiosk, itemObjects, listingObjects] = await Promise.all([
96
- includeKioskFields
94
+ const [kiosk, listingObjects] = await Promise.all([
95
+ options.withKioskFields
97
96
  ? getKioskObject(provider, kioskId)
98
97
  : Promise.resolve(undefined),
99
- includeItems
100
- ? getObjects(provider, kioskData.itemIds, itemOptions)
101
- : Promise.resolve([]),
102
- withListingPrices
103
- ? getObjects(provider, kioskData.listingIds, {
104
- showBcs: true,
105
- showContent: true,
98
+ options.withListingPrices
99
+ ? provider.multiGetObjects({
100
+ ids: kioskData.listingIds,
101
+ options: {
102
+ showContent: true,
103
+ },
106
104
  })
107
105
  : Promise.resolve([]),
108
106
  ]);
109
107
 
110
- if (includeKioskFields) kioskData.kiosk = kiosk;
111
- if (includeItems) kioskData.items = itemObjects;
112
- if (withListingPrices)
113
- kioskData.listings.map((l, i) => {
114
- const fields = getObjectFields(listingObjects[i]);
115
- // l.price = bcs.de('u64', listingObjects[i].data?.bcs.bcsBytes, 'base64');
116
- // TODO: Figure out a way to do this with BCS to avoid querying content.
117
- l.price = fields?.value;
118
- return l;
119
- });
108
+ if (options.withKioskFields) kioskData.kiosk = kiosk;
109
+ // attach items listings. IF we have `options.withListingPrices === true`, it will also attach the prices.
110
+ attachListingsAndPrices(kioskData, listings, listingObjects);
111
+ // add `locked` status to items that are locked.
112
+ attachLockedItems(kioskData, lockedItemIds);
120
113
 
121
114
  return {
122
115
  data: kioskData,
package/src/utils.ts CHANGED
@@ -3,13 +3,15 @@
3
3
 
4
4
  import {
5
5
  JsonRpcProvider,
6
+ ObjectId,
6
7
  SharedObjectRef,
7
- SuiObjectDataOptions,
8
8
  SuiObjectRef,
9
+ SuiObjectResponse,
9
10
  TransactionArgument,
10
11
  TransactionBlock,
12
+ getObjectFields,
11
13
  } from '@mysten/sui.js';
12
- import { KioskData } from './query/kiosk';
14
+ import { KioskData, KioskListing } from './query/kiosk';
13
15
  import { DynamicFieldInfo } from '@mysten/sui.js/dist/types/dynamic_fields';
14
16
  import { bcs, Kiosk } from './bcs';
15
17
 
@@ -70,7 +72,11 @@ export async function getKioskObject(
70
72
  }
71
73
 
72
74
  // helper to extract kiosk data from dynamic fields.
73
- export function extractKioskData(data: DynamicFieldInfo[]): KioskData {
75
+ export function extractKioskData(
76
+ data: DynamicFieldInfo[],
77
+ listings: KioskListing[],
78
+ lockedItemIds: string[],
79
+ ): KioskData {
74
80
  return data.reduce<KioskData>(
75
81
  (acc: KioskData, val: DynamicFieldInfo) => {
76
82
  const type = getTypeWithoutPackageAddress(val.name.type);
@@ -79,39 +85,84 @@ export function extractKioskData(data: DynamicFieldInfo[]): KioskData {
79
85
  case 'kiosk::Item':
80
86
  acc.itemIds.push(val.objectId);
81
87
  acc.items.push({
82
- itemId: val.objectId,
83
- itemType: val.objectType,
88
+ objectId: val.objectId,
89
+ type: val.objectType,
90
+ isLocked: false,
84
91
  });
85
92
  break;
86
93
  case 'kiosk::Listing':
87
94
  acc.listingIds.push(val.objectId);
88
- acc.listings.push({
89
- itemId: val.name.value.id,
95
+ listings.push({
96
+ objectId: val.name.value.id,
90
97
  listingId: val.objectId,
91
98
  isExclusive: val.name.value.is_exclusive,
92
99
  });
93
100
  break;
101
+ case 'kiosk::Lock':
102
+ lockedItemIds?.push(val.name.value.id);
103
+ break;
94
104
  }
95
105
  return acc;
96
106
  },
97
- { listings: [], items: [], itemIds: [], listingIds: [] },
107
+ { items: [], itemIds: [], listingIds: [], extensions: [] },
98
108
  );
99
109
  }
100
110
 
101
- // simple multiGetObjects wrapper to simplify cases on functions.
102
- export function getObjects(
103
- provider: JsonRpcProvider,
104
- ids: string[],
105
- options: SuiObjectDataOptions,
106
- ) {
107
- if (ids.length === 0) {
108
- return Promise.resolve([]);
109
- }
110
-
111
- return provider.multiGetObjects({ ids, options });
112
- }
113
-
114
111
  // e.g. 0x2::kiosk::Item -> kiosk::Item
115
112
  export const getTypeWithoutPackageAddress = (type: string) => {
116
113
  return type.split('::').slice(-2).join('::');
117
114
  };
115
+
116
+ /**
117
+ * A helper that attaches the listing prices to kiosk listings.
118
+ */
119
+ export const attachListingsAndPrices = (
120
+ kioskData: KioskData,
121
+ listings: KioskListing[],
122
+ listingObjects: SuiObjectResponse[],
123
+ ) => {
124
+ // map item listings as {item_id: KioskListing}
125
+ // for easier mapping on the nex
126
+ const itemListings = listings.reduce<Record<ObjectId, KioskListing>>(
127
+ (acc: Record<ObjectId, KioskListing>, item, idx) => {
128
+ acc[item.objectId] = { ...item };
129
+
130
+ // return in case we don't have any listing objects.
131
+ // that's the case when we don't have the `listingPrices` included.
132
+ if (listingObjects.length === 0) return acc;
133
+
134
+ const data = getObjectFields(listingObjects[idx]);
135
+ if (!data) return acc;
136
+
137
+ acc[item.objectId].price = data.value;
138
+ return acc;
139
+ },
140
+ {},
141
+ );
142
+
143
+ kioskData.items.map((item) => {
144
+ item.listing = itemListings[item.objectId] || undefined;
145
+ });
146
+ };
147
+
148
+ /**
149
+ * A Helper to attach locked state to items in Kiosk Data.
150
+ */
151
+ export const attachLockedItems = (
152
+ kioskData: KioskData,
153
+ lockedItemIds: ObjectId[],
154
+ ) => {
155
+ // map lock status in an array of type { item_id: true }
156
+ const lockedStatuses = lockedItemIds.reduce<Record<ObjectId, boolean>>(
157
+ (acc: Record<ObjectId, boolean>, item: string) => {
158
+ acc[item] = true;
159
+ return acc;
160
+ },
161
+ {},
162
+ );
163
+
164
+ // parse lockedItemIds and attach their locked status.
165
+ kioskData.items.map((item) => {
166
+ item.isLocked = lockedStatuses[item.objectId] || false;
167
+ });
168
+ };