@mysten/kiosk 0.0.0-experimental-20250411175432 → 0.0.0-experimental-20250417202156

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,12 +1,33 @@
1
1
  # @mysten/kiosk
2
2
 
3
- ## 0.0.0-experimental-20250411175432
3
+ ## 0.0.0-experimental-20250417202156
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [2705dc8]
8
+ - @mysten/sui@0.0.0-experimental-20250417202156
9
+
10
+ ## 0.12.0
11
+
12
+ ### Minor Changes
13
+
14
+ - d81b9a7: Use default pagination limit when loading kiosks
15
+
16
+ ## 0.11.6
17
+
18
+ ### Patch Changes
19
+
20
+ - 986c4e3: Fix transasction construction for royalty_rule::fee_amount
21
+ - Updated dependencies [5cea435]
22
+ - @mysten/sui@1.27.1
23
+
24
+ ## 0.11.5
4
25
 
5
26
  ### Patch Changes
6
27
 
7
28
  - Updated dependencies [4d13ef8]
8
29
  - Updated dependencies [4d13ef8]
9
- - @mysten/sui@0.0.0-experimental-20250411175432
30
+ - @mysten/sui@1.27.0
10
31
 
11
32
  ## 0.11.4
12
33
 
@@ -57,14 +57,7 @@ class KioskClient {
57
57
  * @returns
58
58
  */
59
59
  async getKiosk({ id, options }) {
60
- return (await (0, import_kiosk.fetchKiosk)(
61
- this.client,
62
- id,
63
- {
64
- limit: 1e3
65
- },
66
- options || {}
67
- )).data;
60
+ return (await (0, import_kiosk.fetchKiosk)(this.client, id, {}, options || {})).data;
68
61
  }
69
62
  /**
70
63
  * Fetch the extension data (if any) for a kiosk, by type
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/client/kiosk-client.ts"],
4
- "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { PaginationArguments, SuiClient } from '@mysten/sui/client';\n\nimport {\n\tFLOOR_PRICE_RULE_ADDRESS,\n\tgetBaseRules,\n\tKIOSK_LOCK_RULE_ADDRESS,\n\tPERSONAL_KIOSK_RULE_ADDRESS,\n\tROYALTY_RULE_ADDRESS,\n\trules,\n} from '../constants.js';\nimport type { BaseRulePackageIds, TransferPolicyRule } from '../constants.js';\nimport { fetchKiosk, fetchKioskExtension, getOwnedKiosks } from '../query/kiosk.js';\nimport {\n\tqueryOwnedTransferPolicies,\n\tqueryTransferPolicy,\n\tqueryTransferPolicyCapsByType,\n} from '../query/transfer-policy.js';\nimport { Network } from '../types/index.js';\nimport type {\n\tFetchKioskOptions,\n\tKioskClientOptions,\n\tKioskData,\n\tOwnedKiosks,\n} from '../types/index.js';\n\n/**\n * A Client that allows you to interact with kiosk.\n * Offers utilities to query kiosk, craft transactions to edit your own kiosk,\n * purchase, manage transfer policies, create new kiosks etc.\n * If you pass packageIds, all functionality will be managed using these packages.\n */\nexport class KioskClient {\n\tclient: SuiClient;\n\tnetwork: Network;\n\trules: TransferPolicyRule[];\n\tpackageIds?: BaseRulePackageIds;\n\n\tconstructor(options: KioskClientOptions) {\n\t\tthis.client = options.client;\n\t\tthis.network = options.network;\n\t\tthis.rules = rules; // add all the default rules.\n\t\tthis.packageIds = options.packageIds;\n\n\t\t// Add the custom Package Ids too on the rule list.\n\t\t// Only adds the rules that are passed in the packageId object.\n\t\tif (options.packageIds) this.rules.push(...getBaseRules(options.packageIds));\n\t}\n\n\t/// Querying\n\n\t/**\n\t * Get an addresses's owned kiosks.\n\t * @param address The address for which we want to retrieve the kiosks.\n\t * @param pagination Optional pagination arguments.\n\t * @returns An Object containing all the `kioskOwnerCap` objects as well as the kioskIds.\n\t */\n\tasync getOwnedKiosks({\n\t\taddress,\n\t\tpagination,\n\t}: {\n\t\taddress: string;\n\t\tpagination?: PaginationArguments<string>;\n\t}): Promise<OwnedKiosks> {\n\t\tconst personalPackageId =\n\t\t\tthis.packageIds?.personalKioskRulePackageId || PERSONAL_KIOSK_RULE_ADDRESS[this.network];\n\n\t\treturn getOwnedKiosks(this.client, address, {\n\t\t\tpagination,\n\t\t\tpersonalKioskType: personalPackageId\n\t\t\t\t? `${personalPackageId}::personal_kiosk::PersonalKioskCap`\n\t\t\t\t: '',\n\t\t});\n\t}\n\n\t/**\n\t * Fetches the kiosk contents.\n\t * @param id The ID of the kiosk to fetch.\n\t * @param options Optional to control the fetch behavior.\n\t * @returns\n\t */\n\tasync getKiosk({ id, options }: { id: string; options?: FetchKioskOptions }): Promise<KioskData> {\n\t\treturn (\n\t\t\tawait fetchKiosk(\n\t\t\t\tthis.client,\n\t\t\t\tid,\n\t\t\t\t{\n\t\t\t\t\tlimit: 1000,\n\t\t\t\t},\n\t\t\t\toptions || {},\n\t\t\t)\n\t\t).data;\n\t}\n\n\t/**\n\t * Fetch the extension data (if any) for a kiosk, by type\n\t * @param kioskId The ID of the kiosk to lookup\n\t * @param extensionType The Type of the extension (can be used from by using the type returned by `getKiosk()`)\n\t */\n\tasync getKioskExtension({ kioskId, type }: { kioskId: string; type: string }) {\n\t\treturn fetchKioskExtension(this.client, kioskId, type);\n\t}\n\n\t/**\n\t * Query the Transfer Policy(ies) for type `T`.\n\t * @param type The Type we're querying for (E.g `0xMyAddress::hero::Hero`)\n\t */\n\tasync getTransferPolicies({ type }: { type: string }) {\n\t\treturn queryTransferPolicy(this.client, type);\n\t}\n\n\t/**\n\t * Query all the owned transfer policies for an address.\n\t * Returns `TransferPolicyCap` which uncludes `policyId, policyCapId, type`.\n\t * @param address The address we're searching the owned transfer policies for.\n\t */\n\tasync getOwnedTransferPolicies({ address }: { address: string }) {\n\t\treturn queryOwnedTransferPolicies(this.client, address);\n\t}\n\n\t/**\n\t * Query the Transfer Policy Cap for type `T`, owned by `address`\n\t * @param type The Type `T` for the object\n\t * @param address The address that owns the cap.\n\t */\n\tasync getOwnedTransferPoliciesByType({ type, address }: { type: string; address: string }) {\n\t\treturn queryTransferPolicyCapsByType(this.client, address, type);\n\t}\n\n\t// Someone would just have to create a `kiosk-client.ts` file in their project, initialize a KioskClient\n\t// and call the `addRuleResolver` function. Each rule has a `resolve` function.\n\t// The resolve function is automatically called on `purchaseAndResolve` function call.\n\taddRuleResolver(rule: TransferPolicyRule) {\n\t\tif (this.rules.find((x) => x.rule === rule.rule))\n\t\t\tthrow new Error(`Rule ${rule.rule} resolver already exists.`);\n\t\tthis.rules.push(rule);\n\t}\n\n\t/**\n\t * A convenient helper to get the packageIds for our supported ruleset,\n\t * based on `kioskClient` configuration.\n\t */\n\tgetRulePackageId(\n\t\trule:\n\t\t\t| 'kioskLockRulePackageId'\n\t\t\t| 'royaltyRulePackageId'\n\t\t\t| 'personalKioskRulePackageId'\n\t\t\t| 'floorPriceRulePackageId',\n\t) {\n\t\tconst rules = this.packageIds || {};\n\t\tconst network = this.network;\n\n\t\t/// Check existence of rule based on network and throw an error if it's not found.\n\t\t/// We always have a fallback for testnet or mainnet.\n\t\tif (!rules[rule] && network !== Network.MAINNET && network !== Network.TESTNET) {\n\t\t\tthrow new Error(`Missing packageId for rule ${rule}`);\n\t\t}\n\n\t\tswitch (rule) {\n\t\t\tcase 'kioskLockRulePackageId':\n\t\t\t\treturn rules[rule] || KIOSK_LOCK_RULE_ADDRESS[network];\n\t\t\tcase 'royaltyRulePackageId':\n\t\t\t\treturn rules[rule] || ROYALTY_RULE_ADDRESS[network];\n\t\t\tcase 'personalKioskRulePackageId':\n\t\t\t\treturn rules[rule] || PERSONAL_KIOSK_RULE_ADDRESS[network];\n\t\t\tcase 'floorPriceRulePackageId':\n\t\t\t\treturn rules[rule] || FLOOR_PRICE_RULE_ADDRESS[network];\n\t\t}\n\t}\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,uBAOO;AAEP,mBAAgE;AAChE,6BAIO;AACP,mBAAwB;AAcjB,MAAM,YAAY;AAAA,EAMxB,YAAY,SAA6B;AACxC,SAAK,SAAS,QAAQ;AACtB,SAAK,UAAU,QAAQ;AACvB,SAAK,QAAQ;AACb,SAAK,aAAa,QAAQ;AAI1B,QAAI,QAAQ,WAAY,MAAK,MAAM,KAAK,OAAG,+BAAa,QAAQ,UAAU,CAAC;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,eAAe;AAAA,IACpB;AAAA,IACA;AAAA,EACD,GAGyB;AACxB,UAAM,oBACL,KAAK,YAAY,8BAA8B,6CAA4B,KAAK,OAAO;AAExF,eAAO,6BAAe,KAAK,QAAQ,SAAS;AAAA,MAC3C;AAAA,MACA,mBAAmB,oBAChB,GAAG,iBAAiB,uCACpB;AAAA,IACJ,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,SAAS,EAAE,IAAI,QAAQ,GAAoE;AAChG,YACC,UAAM;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA;AAAA,QACC,OAAO;AAAA,MACR;AAAA,MACA,WAAW,CAAC;AAAA,IACb,GACC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,kBAAkB,EAAE,SAAS,KAAK,GAAsC;AAC7E,eAAO,kCAAoB,KAAK,QAAQ,SAAS,IAAI;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,oBAAoB,EAAE,KAAK,GAAqB;AACrD,eAAO,4CAAoB,KAAK,QAAQ,IAAI;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,yBAAyB,EAAE,QAAQ,GAAwB;AAChE,eAAO,mDAA2B,KAAK,QAAQ,OAAO;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,+BAA+B,EAAE,MAAM,QAAQ,GAAsC;AAC1F,eAAO,sDAA8B,KAAK,QAAQ,SAAS,IAAI;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,MAA0B;AACzC,QAAI,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI;AAC9C,YAAM,IAAI,MAAM,QAAQ,KAAK,IAAI,2BAA2B;AAC7D,SAAK,MAAM,KAAK,IAAI;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBACC,MAKC;AACD,UAAMA,SAAQ,KAAK,cAAc,CAAC;AAClC,UAAM,UAAU,KAAK;AAIrB,QAAI,CAACA,OAAM,IAAI,KAAK,YAAY,qBAAQ,WAAW,YAAY,qBAAQ,SAAS;AAC/E,YAAM,IAAI,MAAM,8BAA8B,IAAI,EAAE;AAAA,IACrD;AAEA,YAAQ,MAAM;AAAA,MACb,KAAK;AACJ,eAAOA,OAAM,IAAI,KAAK,yCAAwB,OAAO;AAAA,MACtD,KAAK;AACJ,eAAOA,OAAM,IAAI,KAAK,sCAAqB,OAAO;AAAA,MACnD,KAAK;AACJ,eAAOA,OAAM,IAAI,KAAK,6CAA4B,OAAO;AAAA,MAC1D,KAAK;AACJ,eAAOA,OAAM,IAAI,KAAK,0CAAyB,OAAO;AAAA,IACxD;AAAA,EACD;AACD;",
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { PaginationArguments, SuiClient } from '@mysten/sui/client';\n\nimport {\n\tFLOOR_PRICE_RULE_ADDRESS,\n\tgetBaseRules,\n\tKIOSK_LOCK_RULE_ADDRESS,\n\tPERSONAL_KIOSK_RULE_ADDRESS,\n\tROYALTY_RULE_ADDRESS,\n\trules,\n} from '../constants.js';\nimport type { BaseRulePackageIds, TransferPolicyRule } from '../constants.js';\nimport { fetchKiosk, fetchKioskExtension, getOwnedKiosks } from '../query/kiosk.js';\nimport {\n\tqueryOwnedTransferPolicies,\n\tqueryTransferPolicy,\n\tqueryTransferPolicyCapsByType,\n} from '../query/transfer-policy.js';\nimport { Network } from '../types/index.js';\nimport type {\n\tFetchKioskOptions,\n\tKioskClientOptions,\n\tKioskData,\n\tOwnedKiosks,\n} from '../types/index.js';\n\n/**\n * A Client that allows you to interact with kiosk.\n * Offers utilities to query kiosk, craft transactions to edit your own kiosk,\n * purchase, manage transfer policies, create new kiosks etc.\n * If you pass packageIds, all functionality will be managed using these packages.\n */\nexport class KioskClient {\n\tclient: SuiClient;\n\tnetwork: Network;\n\trules: TransferPolicyRule[];\n\tpackageIds?: BaseRulePackageIds;\n\n\tconstructor(options: KioskClientOptions) {\n\t\tthis.client = options.client;\n\t\tthis.network = options.network;\n\t\tthis.rules = rules; // add all the default rules.\n\t\tthis.packageIds = options.packageIds;\n\n\t\t// Add the custom Package Ids too on the rule list.\n\t\t// Only adds the rules that are passed in the packageId object.\n\t\tif (options.packageIds) this.rules.push(...getBaseRules(options.packageIds));\n\t}\n\n\t/// Querying\n\n\t/**\n\t * Get an addresses's owned kiosks.\n\t * @param address The address for which we want to retrieve the kiosks.\n\t * @param pagination Optional pagination arguments.\n\t * @returns An Object containing all the `kioskOwnerCap` objects as well as the kioskIds.\n\t */\n\tasync getOwnedKiosks({\n\t\taddress,\n\t\tpagination,\n\t}: {\n\t\taddress: string;\n\t\tpagination?: PaginationArguments<string>;\n\t}): Promise<OwnedKiosks> {\n\t\tconst personalPackageId =\n\t\t\tthis.packageIds?.personalKioskRulePackageId || PERSONAL_KIOSK_RULE_ADDRESS[this.network];\n\n\t\treturn getOwnedKiosks(this.client, address, {\n\t\t\tpagination,\n\t\t\tpersonalKioskType: personalPackageId\n\t\t\t\t? `${personalPackageId}::personal_kiosk::PersonalKioskCap`\n\t\t\t\t: '',\n\t\t});\n\t}\n\n\t/**\n\t * Fetches the kiosk contents.\n\t * @param id The ID of the kiosk to fetch.\n\t * @param options Optional to control the fetch behavior.\n\t * @returns\n\t */\n\tasync getKiosk({ id, options }: { id: string; options?: FetchKioskOptions }): Promise<KioskData> {\n\t\treturn (await fetchKiosk(this.client, id, {}, options || {})).data;\n\t}\n\n\t/**\n\t * Fetch the extension data (if any) for a kiosk, by type\n\t * @param kioskId The ID of the kiosk to lookup\n\t * @param extensionType The Type of the extension (can be used from by using the type returned by `getKiosk()`)\n\t */\n\tasync getKioskExtension({ kioskId, type }: { kioskId: string; type: string }) {\n\t\treturn fetchKioskExtension(this.client, kioskId, type);\n\t}\n\n\t/**\n\t * Query the Transfer Policy(ies) for type `T`.\n\t * @param type The Type we're querying for (E.g `0xMyAddress::hero::Hero`)\n\t */\n\tasync getTransferPolicies({ type }: { type: string }) {\n\t\treturn queryTransferPolicy(this.client, type);\n\t}\n\n\t/**\n\t * Query all the owned transfer policies for an address.\n\t * Returns `TransferPolicyCap` which uncludes `policyId, policyCapId, type`.\n\t * @param address The address we're searching the owned transfer policies for.\n\t */\n\tasync getOwnedTransferPolicies({ address }: { address: string }) {\n\t\treturn queryOwnedTransferPolicies(this.client, address);\n\t}\n\n\t/**\n\t * Query the Transfer Policy Cap for type `T`, owned by `address`\n\t * @param type The Type `T` for the object\n\t * @param address The address that owns the cap.\n\t */\n\tasync getOwnedTransferPoliciesByType({ type, address }: { type: string; address: string }) {\n\t\treturn queryTransferPolicyCapsByType(this.client, address, type);\n\t}\n\n\t// Someone would just have to create a `kiosk-client.ts` file in their project, initialize a KioskClient\n\t// and call the `addRuleResolver` function. Each rule has a `resolve` function.\n\t// The resolve function is automatically called on `purchaseAndResolve` function call.\n\taddRuleResolver(rule: TransferPolicyRule) {\n\t\tif (this.rules.find((x) => x.rule === rule.rule))\n\t\t\tthrow new Error(`Rule ${rule.rule} resolver already exists.`);\n\t\tthis.rules.push(rule);\n\t}\n\n\t/**\n\t * A convenient helper to get the packageIds for our supported ruleset,\n\t * based on `kioskClient` configuration.\n\t */\n\tgetRulePackageId(\n\t\trule:\n\t\t\t| 'kioskLockRulePackageId'\n\t\t\t| 'royaltyRulePackageId'\n\t\t\t| 'personalKioskRulePackageId'\n\t\t\t| 'floorPriceRulePackageId',\n\t) {\n\t\tconst rules = this.packageIds || {};\n\t\tconst network = this.network;\n\n\t\t/// Check existence of rule based on network and throw an error if it's not found.\n\t\t/// We always have a fallback for testnet or mainnet.\n\t\tif (!rules[rule] && network !== Network.MAINNET && network !== Network.TESTNET) {\n\t\t\tthrow new Error(`Missing packageId for rule ${rule}`);\n\t\t}\n\n\t\tswitch (rule) {\n\t\t\tcase 'kioskLockRulePackageId':\n\t\t\t\treturn rules[rule] || KIOSK_LOCK_RULE_ADDRESS[network];\n\t\t\tcase 'royaltyRulePackageId':\n\t\t\t\treturn rules[rule] || ROYALTY_RULE_ADDRESS[network];\n\t\t\tcase 'personalKioskRulePackageId':\n\t\t\t\treturn rules[rule] || PERSONAL_KIOSK_RULE_ADDRESS[network];\n\t\t\tcase 'floorPriceRulePackageId':\n\t\t\t\treturn rules[rule] || FLOOR_PRICE_RULE_ADDRESS[network];\n\t\t}\n\t}\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,uBAOO;AAEP,mBAAgE;AAChE,6BAIO;AACP,mBAAwB;AAcjB,MAAM,YAAY;AAAA,EAMxB,YAAY,SAA6B;AACxC,SAAK,SAAS,QAAQ;AACtB,SAAK,UAAU,QAAQ;AACvB,SAAK,QAAQ;AACb,SAAK,aAAa,QAAQ;AAI1B,QAAI,QAAQ,WAAY,MAAK,MAAM,KAAK,OAAG,+BAAa,QAAQ,UAAU,CAAC;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,eAAe;AAAA,IACpB;AAAA,IACA;AAAA,EACD,GAGyB;AACxB,UAAM,oBACL,KAAK,YAAY,8BAA8B,6CAA4B,KAAK,OAAO;AAExF,eAAO,6BAAe,KAAK,QAAQ,SAAS;AAAA,MAC3C;AAAA,MACA,mBAAmB,oBAChB,GAAG,iBAAiB,uCACpB;AAAA,IACJ,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,SAAS,EAAE,IAAI,QAAQ,GAAoE;AAChG,YAAQ,UAAM,yBAAW,KAAK,QAAQ,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,GAAG;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,kBAAkB,EAAE,SAAS,KAAK,GAAsC;AAC7E,eAAO,kCAAoB,KAAK,QAAQ,SAAS,IAAI;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,oBAAoB,EAAE,KAAK,GAAqB;AACrD,eAAO,4CAAoB,KAAK,QAAQ,IAAI;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,yBAAyB,EAAE,QAAQ,GAAwB;AAChE,eAAO,mDAA2B,KAAK,QAAQ,OAAO;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,+BAA+B,EAAE,MAAM,QAAQ,GAAsC;AAC1F,eAAO,sDAA8B,KAAK,QAAQ,SAAS,IAAI;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,MAA0B;AACzC,QAAI,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI;AAC9C,YAAM,IAAI,MAAM,QAAQ,KAAK,IAAI,2BAA2B;AAC7D,SAAK,MAAM,KAAK,IAAI;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBACC,MAKC;AACD,UAAMA,SAAQ,KAAK,cAAc,CAAC;AAClC,UAAM,UAAU,KAAK;AAIrB,QAAI,CAACA,OAAM,IAAI,KAAK,YAAY,qBAAQ,WAAW,YAAY,qBAAQ,SAAS;AAC/E,YAAM,IAAI,MAAM,8BAA8B,IAAI,EAAE;AAAA,IACrD;AAEA,YAAQ,MAAM;AAAA,MACb,KAAK;AACJ,eAAOA,OAAM,IAAI,KAAK,yCAAwB,OAAO;AAAA,MACtD,KAAK;AACJ,eAAOA,OAAM,IAAI,KAAK,sCAAqB,OAAO;AAAA,MACnD,KAAK;AACJ,eAAOA,OAAM,IAAI,KAAK,6CAA4B,OAAO;AAAA,MAC1D,KAAK;AACJ,eAAOA,OAAM,IAAI,KAAK,0CAAyB,OAAO;AAAA,IACxD;AAAA,EACD;AACD;",
6
6
  "names": ["rules"]
7
7
  }
@@ -38,13 +38,13 @@ async function resolveRoyaltyRule(params) {
38
38
  transferRequest,
39
39
  policyId
40
40
  } = params;
41
- const policyObj = tx.object(policyId);
42
41
  const feeTx = new import_transactions.Transaction();
43
42
  feeTx.moveCall({
44
43
  target: `${packageId}::royalty_rule::fee_amount`,
45
44
  typeArguments: [itemType],
46
- arguments: [policyObj, tx.pure.u64(price || "0")]
45
+ arguments: [feeTx.object(policyId), feeTx.pure.u64(price || "0")]
47
46
  });
47
+ const policyObj = tx.object(policyId);
48
48
  const { results } = await kioskClient.client.devInspectTransactionBlock({
49
49
  sender: tx.getData().sender || (0, import_utils.normalizeSuiAddress)("0x0"),
50
50
  transactionBlock: feeTx
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/tx/rules/resolve.ts"],
4
- "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { bcs } from '@mysten/sui/bcs';\nimport type { TransactionArgument } from '@mysten/sui/transactions';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { normalizeSuiAddress } from '@mysten/sui/utils';\n\nimport type { RuleResolvingParams } from '../../types/index.js';\nimport { lock } from '../kiosk.js';\n\n/**\n * A helper to resolve the royalty rule.\n */\nexport async function resolveRoyaltyRule(params: RuleResolvingParams) {\n\tconst {\n\t\tkioskClient,\n\t\ttransaction: tx,\n\t\titemType,\n\t\tprice,\n\t\tpackageId,\n\t\ttransferRequest,\n\t\tpolicyId,\n\t} = params;\n\n\tconst policyObj = tx.object(policyId);\n\n\t// We attempt to resolve the fee amount outside of the PTB so that the split amount is known before the transaction is sent.\n\t// This improves the display of the transaction within the wallet.\n\n\tconst feeTx = new Transaction();\n\n\t// calculates the amount\n\tfeeTx.moveCall({\n\t\ttarget: `${packageId}::royalty_rule::fee_amount`,\n\t\ttypeArguments: [itemType],\n\t\targuments: [policyObj, tx.pure.u64(price || '0')],\n\t});\n\n\tconst { results } = await kioskClient.client.devInspectTransactionBlock({\n\t\tsender: tx.getData().sender || normalizeSuiAddress('0x0'),\n\t\ttransactionBlock: feeTx,\n\t});\n\n\tlet amount: TransactionArgument | bigint | null = null;\n\tif (results) {\n\t\tconst returnedAmount = results?.[0].returnValues?.[0]?.[0];\n\t\tif (returnedAmount) {\n\t\t\tamount = BigInt(bcs.U64.parse(new Uint8Array(returnedAmount as number[])));\n\t\t}\n\t}\n\n\t// We were not able to calculate the amount outside of the transaction, so fall back to resolving it within the PTB\n\tif (!amount) {\n\t\t[amount] = tx.moveCall({\n\t\t\ttarget: `${packageId}::royalty_rule::fee_amount`,\n\t\t\ttypeArguments: [itemType],\n\t\t\targuments: [policyObj, tx.pure.u64(price || '0')],\n\t\t});\n\t}\n\n\t// splits the coin.\n\tconst feeCoin = tx.splitCoins(tx.gas, [amount]);\n\n\t// pays the policy\n\ttx.moveCall({\n\t\ttarget: `${packageId}::royalty_rule::pay`,\n\t\ttypeArguments: [itemType],\n\t\targuments: [policyObj, transferRequest, feeCoin],\n\t});\n}\n\nexport function resolveKioskLockRule(params: RuleResolvingParams) {\n\tconst {\n\t\ttransaction: tx,\n\t\tpackageId,\n\t\titemType,\n\t\tkiosk,\n\t\tkioskCap,\n\t\tpolicyId,\n\t\tpurchasedItem,\n\t\ttransferRequest,\n\t} = params;\n\n\tif (!kiosk || !kioskCap) throw new Error('Missing Owned Kiosk or Owned Kiosk Cap');\n\n\tlock(tx, itemType, kiosk, kioskCap, policyId, purchasedItem);\n\n\t// proves that the item is locked in the kiosk to the TP.\n\ttx.moveCall({\n\t\ttarget: `${packageId}::kiosk_lock_rule::prove`,\n\t\ttypeArguments: [itemType],\n\t\targuments: [transferRequest, tx.object(kiosk)],\n\t});\n}\n\n/**\n * A helper to resolve the personalKioskRule.\n * @param params\n */\nexport function resolvePersonalKioskRule(params: RuleResolvingParams) {\n\tconst { transaction: tx, packageId, itemType, kiosk, transferRequest } = params;\n\n\tif (!kiosk) throw new Error('Missing owned Kiosk.');\n\n\t// proves that the destination kiosk is personal.\n\ttx.moveCall({\n\t\ttarget: `${packageId}::personal_kiosk_rule::prove`,\n\t\ttypeArguments: [itemType],\n\t\targuments: [tx.object(kiosk), transferRequest],\n\t});\n}\n\n/**\n * Resolves the floor price rule.\n */\nexport function resolveFloorPriceRule(params: RuleResolvingParams) {\n\tconst { transaction: tx, packageId, itemType, policyId, transferRequest } = params;\n\n\t// proves that the destination kiosk is personal\n\ttx.moveCall({\n\t\ttarget: `${packageId}::floor_price_rule::prove`,\n\t\ttypeArguments: [itemType],\n\t\targuments: [tx.object(policyId), transferRequest],\n\t});\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,iBAAoB;AAEpB,0BAA4B;AAC5B,mBAAoC;AAGpC,mBAAqB;AAKrB,eAAsB,mBAAmB,QAA6B;AACrE,QAAM;AAAA,IACL;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,IAAI;AAEJ,QAAM,YAAY,GAAG,OAAO,QAAQ;AAKpC,QAAM,QAAQ,IAAI,gCAAY;AAG9B,QAAM,SAAS;AAAA,IACd,QAAQ,GAAG,SAAS;AAAA,IACpB,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG,CAAC;AAAA,EACjD,CAAC;AAED,QAAM,EAAE,QAAQ,IAAI,MAAM,YAAY,OAAO,2BAA2B;AAAA,IACvE,QAAQ,GAAG,QAAQ,EAAE,cAAU,kCAAoB,KAAK;AAAA,IACxD,kBAAkB;AAAA,EACnB,CAAC;AAED,MAAI,SAA8C;AAClD,MAAI,SAAS;AACZ,UAAM,iBAAiB,UAAU,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC;AACzD,QAAI,gBAAgB;AACnB,eAAS,OAAO,eAAI,IAAI,MAAM,IAAI,WAAW,cAA0B,CAAC,CAAC;AAAA,IAC1E;AAAA,EACD;AAGA,MAAI,CAAC,QAAQ;AACZ,KAAC,MAAM,IAAI,GAAG,SAAS;AAAA,MACtB,QAAQ,GAAG,SAAS;AAAA,MACpB,eAAe,CAAC,QAAQ;AAAA,MACxB,WAAW,CAAC,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG,CAAC;AAAA,IACjD,CAAC;AAAA,EACF;AAGA,QAAM,UAAU,GAAG,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;AAG9C,KAAG,SAAS;AAAA,IACX,QAAQ,GAAG,SAAS;AAAA,IACpB,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,WAAW,iBAAiB,OAAO;AAAA,EAChD,CAAC;AACF;AAEO,SAAS,qBAAqB,QAA6B;AACjE,QAAM;AAAA,IACL,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,IAAI;AAEJ,MAAI,CAAC,SAAS,CAAC,SAAU,OAAM,IAAI,MAAM,wCAAwC;AAEjF,yBAAK,IAAI,UAAU,OAAO,UAAU,UAAU,aAAa;AAG3D,KAAG,SAAS;AAAA,IACX,QAAQ,GAAG,SAAS;AAAA,IACpB,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,iBAAiB,GAAG,OAAO,KAAK,CAAC;AAAA,EAC9C,CAAC;AACF;AAMO,SAAS,yBAAyB,QAA6B;AACrE,QAAM,EAAE,aAAa,IAAI,WAAW,UAAU,OAAO,gBAAgB,IAAI;AAEzE,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,sBAAsB;AAGlD,KAAG,SAAS;AAAA,IACX,QAAQ,GAAG,SAAS;AAAA,IACpB,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,GAAG,OAAO,KAAK,GAAG,eAAe;AAAA,EAC9C,CAAC;AACF;AAKO,SAAS,sBAAsB,QAA6B;AAClE,QAAM,EAAE,aAAa,IAAI,WAAW,UAAU,UAAU,gBAAgB,IAAI;AAG5E,KAAG,SAAS;AAAA,IACX,QAAQ,GAAG,SAAS;AAAA,IACpB,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,GAAG,OAAO,QAAQ,GAAG,eAAe;AAAA,EACjD,CAAC;AACF;",
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { bcs } from '@mysten/sui/bcs';\nimport type { TransactionArgument } from '@mysten/sui/transactions';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { normalizeSuiAddress } from '@mysten/sui/utils';\n\nimport type { RuleResolvingParams } from '../../types/index.js';\nimport { lock } from '../kiosk.js';\n\n/**\n * A helper to resolve the royalty rule.\n */\nexport async function resolveRoyaltyRule(params: RuleResolvingParams) {\n\tconst {\n\t\tkioskClient,\n\t\ttransaction: tx,\n\t\titemType,\n\t\tprice,\n\t\tpackageId,\n\t\ttransferRequest,\n\t\tpolicyId,\n\t} = params;\n\n\t// We attempt to resolve the fee amount outside of the PTB so that the split amount is known before the transaction is sent.\n\t// This improves the display of the transaction within the wallet.\n\n\tconst feeTx = new Transaction();\n\n\t// calculates the amount\n\tfeeTx.moveCall({\n\t\ttarget: `${packageId}::royalty_rule::fee_amount`,\n\t\ttypeArguments: [itemType],\n\t\targuments: [feeTx.object(policyId), feeTx.pure.u64(price || '0')],\n\t});\n\n\tconst policyObj = tx.object(policyId);\n\n\tconst { results } = await kioskClient.client.devInspectTransactionBlock({\n\t\tsender: tx.getData().sender || normalizeSuiAddress('0x0'),\n\t\ttransactionBlock: feeTx,\n\t});\n\n\tlet amount: TransactionArgument | bigint | null = null;\n\tif (results) {\n\t\tconst returnedAmount = results?.[0].returnValues?.[0]?.[0];\n\t\tif (returnedAmount) {\n\t\t\tamount = BigInt(bcs.U64.parse(new Uint8Array(returnedAmount as number[])));\n\t\t}\n\t}\n\n\t// We were not able to calculate the amount outside of the transaction, so fall back to resolving it within the PTB\n\tif (!amount) {\n\t\t[amount] = tx.moveCall({\n\t\t\ttarget: `${packageId}::royalty_rule::fee_amount`,\n\t\t\ttypeArguments: [itemType],\n\t\t\targuments: [policyObj, tx.pure.u64(price || '0')],\n\t\t});\n\t}\n\n\t// splits the coin.\n\tconst feeCoin = tx.splitCoins(tx.gas, [amount]);\n\n\t// pays the policy\n\ttx.moveCall({\n\t\ttarget: `${packageId}::royalty_rule::pay`,\n\t\ttypeArguments: [itemType],\n\t\targuments: [policyObj, transferRequest, feeCoin],\n\t});\n}\n\nexport function resolveKioskLockRule(params: RuleResolvingParams) {\n\tconst {\n\t\ttransaction: tx,\n\t\tpackageId,\n\t\titemType,\n\t\tkiosk,\n\t\tkioskCap,\n\t\tpolicyId,\n\t\tpurchasedItem,\n\t\ttransferRequest,\n\t} = params;\n\n\tif (!kiosk || !kioskCap) throw new Error('Missing Owned Kiosk or Owned Kiosk Cap');\n\n\tlock(tx, itemType, kiosk, kioskCap, policyId, purchasedItem);\n\n\t// proves that the item is locked in the kiosk to the TP.\n\ttx.moveCall({\n\t\ttarget: `${packageId}::kiosk_lock_rule::prove`,\n\t\ttypeArguments: [itemType],\n\t\targuments: [transferRequest, tx.object(kiosk)],\n\t});\n}\n\n/**\n * A helper to resolve the personalKioskRule.\n * @param params\n */\nexport function resolvePersonalKioskRule(params: RuleResolvingParams) {\n\tconst { transaction: tx, packageId, itemType, kiosk, transferRequest } = params;\n\n\tif (!kiosk) throw new Error('Missing owned Kiosk.');\n\n\t// proves that the destination kiosk is personal.\n\ttx.moveCall({\n\t\ttarget: `${packageId}::personal_kiosk_rule::prove`,\n\t\ttypeArguments: [itemType],\n\t\targuments: [tx.object(kiosk), transferRequest],\n\t});\n}\n\n/**\n * Resolves the floor price rule.\n */\nexport function resolveFloorPriceRule(params: RuleResolvingParams) {\n\tconst { transaction: tx, packageId, itemType, policyId, transferRequest } = params;\n\n\t// proves that the destination kiosk is personal\n\ttx.moveCall({\n\t\ttarget: `${packageId}::floor_price_rule::prove`,\n\t\ttypeArguments: [itemType],\n\t\targuments: [tx.object(policyId), transferRequest],\n\t});\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,iBAAoB;AAEpB,0BAA4B;AAC5B,mBAAoC;AAGpC,mBAAqB;AAKrB,eAAsB,mBAAmB,QAA6B;AACrE,QAAM;AAAA,IACL;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,IAAI;AAKJ,QAAM,QAAQ,IAAI,gCAAY;AAG9B,QAAM,SAAS;AAAA,IACd,QAAQ,GAAG,SAAS;AAAA,IACpB,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,MAAM,OAAO,QAAQ,GAAG,MAAM,KAAK,IAAI,SAAS,GAAG,CAAC;AAAA,EACjE,CAAC;AAED,QAAM,YAAY,GAAG,OAAO,QAAQ;AAEpC,QAAM,EAAE,QAAQ,IAAI,MAAM,YAAY,OAAO,2BAA2B;AAAA,IACvE,QAAQ,GAAG,QAAQ,EAAE,cAAU,kCAAoB,KAAK;AAAA,IACxD,kBAAkB;AAAA,EACnB,CAAC;AAED,MAAI,SAA8C;AAClD,MAAI,SAAS;AACZ,UAAM,iBAAiB,UAAU,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC;AACzD,QAAI,gBAAgB;AACnB,eAAS,OAAO,eAAI,IAAI,MAAM,IAAI,WAAW,cAA0B,CAAC,CAAC;AAAA,IAC1E;AAAA,EACD;AAGA,MAAI,CAAC,QAAQ;AACZ,KAAC,MAAM,IAAI,GAAG,SAAS;AAAA,MACtB,QAAQ,GAAG,SAAS;AAAA,MACpB,eAAe,CAAC,QAAQ;AAAA,MACxB,WAAW,CAAC,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG,CAAC;AAAA,IACjD,CAAC;AAAA,EACF;AAGA,QAAM,UAAU,GAAG,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;AAG9C,KAAG,SAAS;AAAA,IACX,QAAQ,GAAG,SAAS;AAAA,IACpB,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,WAAW,iBAAiB,OAAO;AAAA,EAChD,CAAC;AACF;AAEO,SAAS,qBAAqB,QAA6B;AACjE,QAAM;AAAA,IACL,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,IAAI;AAEJ,MAAI,CAAC,SAAS,CAAC,SAAU,OAAM,IAAI,MAAM,wCAAwC;AAEjF,yBAAK,IAAI,UAAU,OAAO,UAAU,UAAU,aAAa;AAG3D,KAAG,SAAS;AAAA,IACX,QAAQ,GAAG,SAAS;AAAA,IACpB,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,iBAAiB,GAAG,OAAO,KAAK,CAAC;AAAA,EAC9C,CAAC;AACF;AAMO,SAAS,yBAAyB,QAA6B;AACrE,QAAM,EAAE,aAAa,IAAI,WAAW,UAAU,OAAO,gBAAgB,IAAI;AAEzE,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,sBAAsB;AAGlD,KAAG,SAAS;AAAA,IACX,QAAQ,GAAG,SAAS;AAAA,IACpB,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,GAAG,OAAO,KAAK,GAAG,eAAe;AAAA,EAC9C,CAAC;AACF;AAKO,SAAS,sBAAsB,QAA6B;AAClE,QAAM,EAAE,aAAa,IAAI,WAAW,UAAU,UAAU,gBAAgB,IAAI;AAG5E,KAAG,SAAS;AAAA,IACX,QAAQ,GAAG,SAAS;AAAA,IACpB,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,GAAG,OAAO,QAAQ,GAAG,eAAe;AAAA,EACjD,CAAC;AACF;",
6
6
  "names": []
7
7
  }
package/dist/cjs/utils.js CHANGED
@@ -34,6 +34,7 @@ module.exports = __toCommonJS(utils_exports);
34
34
  var import_utils = require("@mysten/sui/utils");
35
35
  var import_bcs = require("./bcs.js");
36
36
  var import_types = require("./types/index.js");
37
+ var import_utils2 = require("@mysten/utils");
37
38
  const DEFAULT_QUERY_LIMIT = 50;
38
39
  async function getKioskObject(client, id) {
39
40
  const queryRes = await client.getObject({ id, options: { showBcs: true } });
@@ -138,14 +139,11 @@ async function getAllDynamicFields(client, parentId, pagination) {
138
139
  return data;
139
140
  }
140
141
  async function getAllObjects(client, ids, options, limit = DEFAULT_QUERY_LIMIT) {
141
- const chunks = Array.from(
142
- { length: Math.ceil(ids.length / limit) },
143
- (_, index) => ids.slice(index * limit, index * limit + limit)
144
- );
142
+ const chunks = (0, import_utils2.chunk)(ids, limit);
145
143
  const results = await Promise.all(
146
- chunks.map((chunk) => {
144
+ chunks.map((chunk2) => {
147
145
  return client.multiGetObjects({
148
- ids: chunk,
146
+ ids: chunk2,
149
147
  options
150
148
  });
151
149
  })
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils.ts"],
4
- "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type {\n\tDynamicFieldInfo,\n\tPaginationArguments,\n\tSuiClient,\n\tSuiObjectData,\n\tSuiObjectDataFilter,\n\tSuiObjectDataOptions,\n\tSuiObjectResponse,\n} from '@mysten/sui/client';\nimport {\n\tfromBase64,\n\tnormalizeStructTag,\n\tnormalizeSuiAddress,\n\tparseStructTag,\n} from '@mysten/sui/utils';\n\nimport { KioskType } from './bcs.js';\nimport type { Kiosk, KioskData, KioskListing, TransferPolicyCap } from './types/index.js';\nimport { TRANSFER_POLICY_CAP_TYPE } from './types/index.js';\n\nconst DEFAULT_QUERY_LIMIT = 50;\n\nexport async function getKioskObject(client: SuiClient, id: string): Promise<Kiosk> {\n\tconst queryRes = await client.getObject({ id, options: { showBcs: true } });\n\n\tif (!queryRes || queryRes.error || !queryRes.data) {\n\t\tthrow new Error(`Kiosk ${id} not found; ${queryRes.error}`);\n\t}\n\n\tif (!queryRes.data.bcs || !('bcsBytes' in queryRes.data.bcs)) {\n\t\tthrow new Error(`Invalid kiosk query: ${id}, expected object, got package`);\n\t}\n\n\treturn KioskType.parse(fromBase64(queryRes.data.bcs!.bcsBytes));\n}\n\n// helper to extract kiosk data from dynamic fields.\nexport function extractKioskData(\n\tdata: DynamicFieldInfo[],\n\tlistings: KioskListing[],\n\tlockedItemIds: string[],\n\tkioskId: string,\n): KioskData {\n\treturn data.reduce<KioskData>(\n\t\t(acc: KioskData, val: DynamicFieldInfo) => {\n\t\t\tconst type = val.name.type;\n\n\t\t\tif (type.startsWith('0x2::kiosk::Item')) {\n\t\t\t\tacc.itemIds.push(val.objectId);\n\t\t\t\tacc.items.push({\n\t\t\t\t\tobjectId: val.objectId,\n\t\t\t\t\ttype: val.objectType,\n\t\t\t\t\tisLocked: false,\n\t\t\t\t\tkioskId,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (type.startsWith('0x2::kiosk::Listing')) {\n\t\t\t\tacc.listingIds.push(val.objectId);\n\t\t\t\tlistings.push({\n\t\t\t\t\tobjectId: (val.name.value as { id: string }).id,\n\t\t\t\t\tlistingId: val.objectId,\n\t\t\t\t\tisExclusive: (val.name.value as { is_exclusive: boolean }).is_exclusive,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (type.startsWith('0x2::kiosk::Lock')) {\n\t\t\t\tlockedItemIds?.push((val.name.value as { id: string }).id);\n\t\t\t}\n\n\t\t\tif (type.startsWith('0x2::kiosk_extension::ExtensionKey')) {\n\t\t\t\tacc.extensions.push({\n\t\t\t\t\tobjectId: val.objectId,\n\t\t\t\t\ttype: normalizeStructTag(parseStructTag(val.name.type).typeParams[0]),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn acc;\n\t\t},\n\t\t{ items: [], itemIds: [], listingIds: [], extensions: [] },\n\t);\n}\n\n/**\n * A helper that attaches the listing prices to kiosk listings.\n */\nexport function attachListingsAndPrices(\n\tkioskData: KioskData,\n\tlistings: KioskListing[],\n\tlistingObjects: SuiObjectResponse[],\n) {\n\t// map item listings as {item_id: KioskListing}\n\t// for easier mapping on the nex\n\tconst itemListings = listings.reduce<Record<string, KioskListing>>(\n\t\t(acc: Record<string, KioskListing>, item, idx) => {\n\t\t\tacc[item.objectId] = { ...item };\n\n\t\t\t// return in case we don't have any listing objects.\n\t\t\t// that's the case when we don't have the `listingPrices` included.\n\t\t\tif (listingObjects.length === 0) return acc;\n\n\t\t\tconst content = listingObjects[idx].data?.content;\n\t\t\tconst data = content?.dataType === 'moveObject' ? content?.fields : null;\n\n\t\t\tif (!data) return acc;\n\n\t\t\tacc[item.objectId].price = (data as { value: string }).value;\n\t\t\treturn acc;\n\t\t},\n\t\t{},\n\t);\n\n\tkioskData.items.forEach((item) => {\n\t\titem.listing = itemListings[item.objectId] || undefined;\n\t});\n}\n\n/**\n * A helper that attaches the listing prices to kiosk listings.\n */\nexport function attachObjects(kioskData: KioskData, objects: SuiObjectData[]) {\n\tconst mapping = objects.reduce<Record<string, SuiObjectData>>(\n\t\t(acc: Record<string, SuiObjectData>, obj) => {\n\t\t\tacc[obj.objectId] = obj;\n\t\t\treturn acc;\n\t\t},\n\t\t{},\n\t);\n\n\tkioskData.items.forEach((item) => {\n\t\titem.data = mapping[item.objectId] || undefined;\n\t});\n}\n\n/**\n * A Helper to attach locked state to items in Kiosk Data.\n */\nexport function attachLockedItems(kioskData: KioskData, lockedItemIds: string[]) {\n\t// map lock status in an array of type { item_id: true }\n\tconst lockedStatuses = lockedItemIds.reduce<Record<string, boolean>>(\n\t\t(acc: Record<string, boolean>, item: string) => {\n\t\t\tacc[item] = true;\n\t\t\treturn acc;\n\t\t},\n\t\t{},\n\t);\n\n\t// parse lockedItemIds and attach their locked status.\n\tkioskData.items.forEach((item) => {\n\t\titem.isLocked = lockedStatuses[item.objectId] || false;\n\t});\n}\n\n/**\n * A helper to fetch all DF pages.\n * We need that to fetch the kiosk DFs consistently, until we have\n * RPC calls that allow filtering of Type / batch fetching of spec\n */\nexport async function getAllDynamicFields(\n\tclient: SuiClient,\n\tparentId: string,\n\tpagination: PaginationArguments<string>,\n) {\n\tlet hasNextPage = true;\n\tlet cursor = undefined;\n\tconst data: DynamicFieldInfo[] = [];\n\n\twhile (hasNextPage) {\n\t\tconst result = await client.getDynamicFields({\n\t\t\tparentId,\n\t\t\tlimit: pagination.limit || undefined,\n\t\t\tcursor,\n\t\t});\n\t\tdata.push(...result.data);\n\t\thasNextPage = result.hasNextPage;\n\t\tcursor = result.nextCursor;\n\t}\n\n\treturn data;\n}\n\n/**\n * A helper to fetch all objects that works with pagination.\n * It will fetch all objects in the array, and limit it to 50/request.\n * Requests are sent using `Promise.all`.\n */\nexport async function getAllObjects(\n\tclient: SuiClient,\n\tids: string[],\n\toptions: SuiObjectDataOptions,\n\tlimit: number = DEFAULT_QUERY_LIMIT,\n) {\n\tconst chunks = Array.from({ length: Math.ceil(ids.length / limit) }, (_, index) =>\n\t\tids.slice(index * limit, index * limit + limit),\n\t);\n\n\tconst results = await Promise.all(\n\t\tchunks.map((chunk) => {\n\t\t\treturn client.multiGetObjects({\n\t\t\t\tids: chunk,\n\t\t\t\toptions,\n\t\t\t});\n\t\t}),\n\t);\n\n\treturn results.flat();\n}\n\n/**\n * A helper to return all owned objects, with an optional filter.\n * It parses all the pages and returns the data.\n */\nexport async function getAllOwnedObjects({\n\tclient,\n\towner,\n\tfilter,\n\tlimit = DEFAULT_QUERY_LIMIT,\n\toptions = { showType: true, showContent: true },\n}: {\n\tclient: SuiClient;\n\towner: string;\n\tfilter?: SuiObjectDataFilter;\n\toptions?: SuiObjectDataOptions;\n\tlimit?: number;\n}) {\n\tlet hasNextPage = true;\n\tlet cursor = undefined;\n\tconst data: SuiObjectResponse[] = [];\n\n\twhile (hasNextPage) {\n\t\tconst result = await client.getOwnedObjects({\n\t\t\towner,\n\t\t\tfilter,\n\t\t\tlimit,\n\t\t\tcursor,\n\t\t\toptions,\n\t\t});\n\t\tdata.push(...result.data);\n\t\thasNextPage = result.hasNextPage;\n\t\tcursor = result.nextCursor;\n\t}\n\n\treturn data;\n}\n\n/**\n * Converts a number to basis points.\n * Supports up to 2 decimal points.\n * E.g 9.95 -> 995\n * @param percentage A percentage amount in the range [0, 100] including decimals.\n */\nexport function percentageToBasisPoints(percentage: number) {\n\tif (percentage < 0 || percentage > 100)\n\t\tthrow new Error('Percentage needs to be in the [0,100] range.');\n\treturn Math.ceil(percentage * 100);\n}\n\n/**\n * A helper to parse a transfer policy Cap into a usable object.\n */\nexport function parseTransferPolicyCapObject(\n\titem: SuiObjectResponse,\n): TransferPolicyCap | undefined {\n\tconst type = (item?.data?.content as { type: string })?.type;\n\n\t//@ts-ignore-next-line\n\tconst policy = item?.data?.content?.fields?.policy_id as string;\n\n\tif (!type.includes(TRANSFER_POLICY_CAP_TYPE)) return undefined;\n\n\t// Transform 0x2::transfer_policy::TransferPolicyCap<itemType> -> itemType\n\tconst objectType = type.replace(TRANSFER_POLICY_CAP_TYPE + '<', '').slice(0, -1);\n\n\treturn {\n\t\tpolicyId: policy,\n\t\tpolicyCapId: item.data?.objectId!,\n\t\ttype: objectType,\n\t};\n}\n\n// Normalizes the packageId part of a rule's type.\nexport function getNormalizedRuleType(rule: string) {\n\tconst normalizedRuleAddress = rule.split('::');\n\tnormalizedRuleAddress[0] = normalizeSuiAddress(normalizedRuleAddress[0]);\n\treturn normalizedRuleAddress.join('::');\n}\n"],
5
- "mappings": "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",
6
- "names": []
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type {\n\tDynamicFieldInfo,\n\tPaginationArguments,\n\tSuiClient,\n\tSuiObjectData,\n\tSuiObjectDataFilter,\n\tSuiObjectDataOptions,\n\tSuiObjectResponse,\n} from '@mysten/sui/client';\nimport {\n\tfromBase64,\n\tnormalizeStructTag,\n\tnormalizeSuiAddress,\n\tparseStructTag,\n} from '@mysten/sui/utils';\n\nimport { KioskType } from './bcs.js';\nimport type { Kiosk, KioskData, KioskListing, TransferPolicyCap } from './types/index.js';\nimport { TRANSFER_POLICY_CAP_TYPE } from './types/index.js';\nimport { chunk } from '@mysten/utils';\n\nconst DEFAULT_QUERY_LIMIT = 50;\n\nexport async function getKioskObject(client: SuiClient, id: string): Promise<Kiosk> {\n\tconst queryRes = await client.getObject({ id, options: { showBcs: true } });\n\n\tif (!queryRes || queryRes.error || !queryRes.data) {\n\t\tthrow new Error(`Kiosk ${id} not found; ${queryRes.error}`);\n\t}\n\n\tif (!queryRes.data.bcs || !('bcsBytes' in queryRes.data.bcs)) {\n\t\tthrow new Error(`Invalid kiosk query: ${id}, expected object, got package`);\n\t}\n\n\treturn KioskType.parse(fromBase64(queryRes.data.bcs!.bcsBytes));\n}\n\n// helper to extract kiosk data from dynamic fields.\nexport function extractKioskData(\n\tdata: DynamicFieldInfo[],\n\tlistings: KioskListing[],\n\tlockedItemIds: string[],\n\tkioskId: string,\n): KioskData {\n\treturn data.reduce<KioskData>(\n\t\t(acc: KioskData, val: DynamicFieldInfo) => {\n\t\t\tconst type = val.name.type;\n\n\t\t\tif (type.startsWith('0x2::kiosk::Item')) {\n\t\t\t\tacc.itemIds.push(val.objectId);\n\t\t\t\tacc.items.push({\n\t\t\t\t\tobjectId: val.objectId,\n\t\t\t\t\ttype: val.objectType,\n\t\t\t\t\tisLocked: false,\n\t\t\t\t\tkioskId,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (type.startsWith('0x2::kiosk::Listing')) {\n\t\t\t\tacc.listingIds.push(val.objectId);\n\t\t\t\tlistings.push({\n\t\t\t\t\tobjectId: (val.name.value as { id: string }).id,\n\t\t\t\t\tlistingId: val.objectId,\n\t\t\t\t\tisExclusive: (val.name.value as { is_exclusive: boolean }).is_exclusive,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (type.startsWith('0x2::kiosk::Lock')) {\n\t\t\t\tlockedItemIds?.push((val.name.value as { id: string }).id);\n\t\t\t}\n\n\t\t\tif (type.startsWith('0x2::kiosk_extension::ExtensionKey')) {\n\t\t\t\tacc.extensions.push({\n\t\t\t\t\tobjectId: val.objectId,\n\t\t\t\t\ttype: normalizeStructTag(parseStructTag(val.name.type).typeParams[0]),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn acc;\n\t\t},\n\t\t{ items: [], itemIds: [], listingIds: [], extensions: [] },\n\t);\n}\n\n/**\n * A helper that attaches the listing prices to kiosk listings.\n */\nexport function attachListingsAndPrices(\n\tkioskData: KioskData,\n\tlistings: KioskListing[],\n\tlistingObjects: SuiObjectResponse[],\n) {\n\t// map item listings as {item_id: KioskListing}\n\t// for easier mapping on the nex\n\tconst itemListings = listings.reduce<Record<string, KioskListing>>(\n\t\t(acc: Record<string, KioskListing>, item, idx) => {\n\t\t\tacc[item.objectId] = { ...item };\n\n\t\t\t// return in case we don't have any listing objects.\n\t\t\t// that's the case when we don't have the `listingPrices` included.\n\t\t\tif (listingObjects.length === 0) return acc;\n\n\t\t\tconst content = listingObjects[idx].data?.content;\n\t\t\tconst data = content?.dataType === 'moveObject' ? content?.fields : null;\n\n\t\t\tif (!data) return acc;\n\n\t\t\tacc[item.objectId].price = (data as { value: string }).value;\n\t\t\treturn acc;\n\t\t},\n\t\t{},\n\t);\n\n\tkioskData.items.forEach((item) => {\n\t\titem.listing = itemListings[item.objectId] || undefined;\n\t});\n}\n\n/**\n * A helper that attaches the listing prices to kiosk listings.\n */\nexport function attachObjects(kioskData: KioskData, objects: SuiObjectData[]) {\n\tconst mapping = objects.reduce<Record<string, SuiObjectData>>(\n\t\t(acc: Record<string, SuiObjectData>, obj) => {\n\t\t\tacc[obj.objectId] = obj;\n\t\t\treturn acc;\n\t\t},\n\t\t{},\n\t);\n\n\tkioskData.items.forEach((item) => {\n\t\titem.data = mapping[item.objectId] || undefined;\n\t});\n}\n\n/**\n * A Helper to attach locked state to items in Kiosk Data.\n */\nexport function attachLockedItems(kioskData: KioskData, lockedItemIds: string[]) {\n\t// map lock status in an array of type { item_id: true }\n\tconst lockedStatuses = lockedItemIds.reduce<Record<string, boolean>>(\n\t\t(acc: Record<string, boolean>, item: string) => {\n\t\t\tacc[item] = true;\n\t\t\treturn acc;\n\t\t},\n\t\t{},\n\t);\n\n\t// parse lockedItemIds and attach their locked status.\n\tkioskData.items.forEach((item) => {\n\t\titem.isLocked = lockedStatuses[item.objectId] || false;\n\t});\n}\n\n/**\n * A helper to fetch all DF pages.\n * We need that to fetch the kiosk DFs consistently, until we have\n * RPC calls that allow filtering of Type / batch fetching of spec\n */\nexport async function getAllDynamicFields(\n\tclient: SuiClient,\n\tparentId: string,\n\tpagination: PaginationArguments<string>,\n) {\n\tlet hasNextPage = true;\n\tlet cursor = undefined;\n\tconst data: DynamicFieldInfo[] = [];\n\n\twhile (hasNextPage) {\n\t\tconst result = await client.getDynamicFields({\n\t\t\tparentId,\n\t\t\tlimit: pagination.limit || undefined,\n\t\t\tcursor,\n\t\t});\n\t\tdata.push(...result.data);\n\t\thasNextPage = result.hasNextPage;\n\t\tcursor = result.nextCursor;\n\t}\n\n\treturn data;\n}\n\n/**\n * A helper to fetch all objects that works with pagination.\n * It will fetch all objects in the array, and limit it to 50/request.\n * Requests are sent using `Promise.all`.\n */\nexport async function getAllObjects(\n\tclient: SuiClient,\n\tids: string[],\n\toptions: SuiObjectDataOptions,\n\tlimit: number = DEFAULT_QUERY_LIMIT,\n) {\n\tconst chunks = chunk(ids, limit);\n\n\tconst results = await Promise.all(\n\t\tchunks.map((chunk) => {\n\t\t\treturn client.multiGetObjects({\n\t\t\t\tids: chunk,\n\t\t\t\toptions,\n\t\t\t});\n\t\t}),\n\t);\n\n\treturn results.flat();\n}\n\n/**\n * A helper to return all owned objects, with an optional filter.\n * It parses all the pages and returns the data.\n */\nexport async function getAllOwnedObjects({\n\tclient,\n\towner,\n\tfilter,\n\tlimit = DEFAULT_QUERY_LIMIT,\n\toptions = { showType: true, showContent: true },\n}: {\n\tclient: SuiClient;\n\towner: string;\n\tfilter?: SuiObjectDataFilter;\n\toptions?: SuiObjectDataOptions;\n\tlimit?: number;\n}) {\n\tlet hasNextPage = true;\n\tlet cursor = undefined;\n\tconst data: SuiObjectResponse[] = [];\n\n\twhile (hasNextPage) {\n\t\tconst result = await client.getOwnedObjects({\n\t\t\towner,\n\t\t\tfilter,\n\t\t\tlimit,\n\t\t\tcursor,\n\t\t\toptions,\n\t\t});\n\t\tdata.push(...result.data);\n\t\thasNextPage = result.hasNextPage;\n\t\tcursor = result.nextCursor;\n\t}\n\n\treturn data;\n}\n\n/**\n * Converts a number to basis points.\n * Supports up to 2 decimal points.\n * E.g 9.95 -> 995\n * @param percentage A percentage amount in the range [0, 100] including decimals.\n */\nexport function percentageToBasisPoints(percentage: number) {\n\tif (percentage < 0 || percentage > 100)\n\t\tthrow new Error('Percentage needs to be in the [0,100] range.');\n\treturn Math.ceil(percentage * 100);\n}\n\n/**\n * A helper to parse a transfer policy Cap into a usable object.\n */\nexport function parseTransferPolicyCapObject(\n\titem: SuiObjectResponse,\n): TransferPolicyCap | undefined {\n\tconst type = (item?.data?.content as { type: string })?.type;\n\n\t//@ts-ignore-next-line\n\tconst policy = item?.data?.content?.fields?.policy_id as string;\n\n\tif (!type.includes(TRANSFER_POLICY_CAP_TYPE)) return undefined;\n\n\t// Transform 0x2::transfer_policy::TransferPolicyCap<itemType> -> itemType\n\tconst objectType = type.replace(TRANSFER_POLICY_CAP_TYPE + '<', '').slice(0, -1);\n\n\treturn {\n\t\tpolicyId: policy,\n\t\tpolicyCapId: item.data?.objectId!,\n\t\ttype: objectType,\n\t};\n}\n\n// Normalizes the packageId part of a rule's type.\nexport function getNormalizedRuleType(rule: string) {\n\tconst normalizedRuleAddress = rule.split('::');\n\tnormalizedRuleAddress[0] = normalizeSuiAddress(normalizedRuleAddress[0]);\n\treturn normalizedRuleAddress.join('::');\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["import_utils", "chunk"]
7
7
  }
@@ -45,14 +45,7 @@ class KioskClient {
45
45
  * @returns
46
46
  */
47
47
  async getKiosk({ id, options }) {
48
- return (await fetchKiosk(
49
- this.client,
50
- id,
51
- {
52
- limit: 1e3
53
- },
54
- options || {}
55
- )).data;
48
+ return (await fetchKiosk(this.client, id, {}, options || {})).data;
56
49
  }
57
50
  /**
58
51
  * Fetch the extension data (if any) for a kiosk, by type
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/client/kiosk-client.ts"],
4
- "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { PaginationArguments, SuiClient } from '@mysten/sui/client';\n\nimport {\n\tFLOOR_PRICE_RULE_ADDRESS,\n\tgetBaseRules,\n\tKIOSK_LOCK_RULE_ADDRESS,\n\tPERSONAL_KIOSK_RULE_ADDRESS,\n\tROYALTY_RULE_ADDRESS,\n\trules,\n} from '../constants.js';\nimport type { BaseRulePackageIds, TransferPolicyRule } from '../constants.js';\nimport { fetchKiosk, fetchKioskExtension, getOwnedKiosks } from '../query/kiosk.js';\nimport {\n\tqueryOwnedTransferPolicies,\n\tqueryTransferPolicy,\n\tqueryTransferPolicyCapsByType,\n} from '../query/transfer-policy.js';\nimport { Network } from '../types/index.js';\nimport type {\n\tFetchKioskOptions,\n\tKioskClientOptions,\n\tKioskData,\n\tOwnedKiosks,\n} from '../types/index.js';\n\n/**\n * A Client that allows you to interact with kiosk.\n * Offers utilities to query kiosk, craft transactions to edit your own kiosk,\n * purchase, manage transfer policies, create new kiosks etc.\n * If you pass packageIds, all functionality will be managed using these packages.\n */\nexport class KioskClient {\n\tclient: SuiClient;\n\tnetwork: Network;\n\trules: TransferPolicyRule[];\n\tpackageIds?: BaseRulePackageIds;\n\n\tconstructor(options: KioskClientOptions) {\n\t\tthis.client = options.client;\n\t\tthis.network = options.network;\n\t\tthis.rules = rules; // add all the default rules.\n\t\tthis.packageIds = options.packageIds;\n\n\t\t// Add the custom Package Ids too on the rule list.\n\t\t// Only adds the rules that are passed in the packageId object.\n\t\tif (options.packageIds) this.rules.push(...getBaseRules(options.packageIds));\n\t}\n\n\t/// Querying\n\n\t/**\n\t * Get an addresses's owned kiosks.\n\t * @param address The address for which we want to retrieve the kiosks.\n\t * @param pagination Optional pagination arguments.\n\t * @returns An Object containing all the `kioskOwnerCap` objects as well as the kioskIds.\n\t */\n\tasync getOwnedKiosks({\n\t\taddress,\n\t\tpagination,\n\t}: {\n\t\taddress: string;\n\t\tpagination?: PaginationArguments<string>;\n\t}): Promise<OwnedKiosks> {\n\t\tconst personalPackageId =\n\t\t\tthis.packageIds?.personalKioskRulePackageId || PERSONAL_KIOSK_RULE_ADDRESS[this.network];\n\n\t\treturn getOwnedKiosks(this.client, address, {\n\t\t\tpagination,\n\t\t\tpersonalKioskType: personalPackageId\n\t\t\t\t? `${personalPackageId}::personal_kiosk::PersonalKioskCap`\n\t\t\t\t: '',\n\t\t});\n\t}\n\n\t/**\n\t * Fetches the kiosk contents.\n\t * @param id The ID of the kiosk to fetch.\n\t * @param options Optional to control the fetch behavior.\n\t * @returns\n\t */\n\tasync getKiosk({ id, options }: { id: string; options?: FetchKioskOptions }): Promise<KioskData> {\n\t\treturn (\n\t\t\tawait fetchKiosk(\n\t\t\t\tthis.client,\n\t\t\t\tid,\n\t\t\t\t{\n\t\t\t\t\tlimit: 1000,\n\t\t\t\t},\n\t\t\t\toptions || {},\n\t\t\t)\n\t\t).data;\n\t}\n\n\t/**\n\t * Fetch the extension data (if any) for a kiosk, by type\n\t * @param kioskId The ID of the kiosk to lookup\n\t * @param extensionType The Type of the extension (can be used from by using the type returned by `getKiosk()`)\n\t */\n\tasync getKioskExtension({ kioskId, type }: { kioskId: string; type: string }) {\n\t\treturn fetchKioskExtension(this.client, kioskId, type);\n\t}\n\n\t/**\n\t * Query the Transfer Policy(ies) for type `T`.\n\t * @param type The Type we're querying for (E.g `0xMyAddress::hero::Hero`)\n\t */\n\tasync getTransferPolicies({ type }: { type: string }) {\n\t\treturn queryTransferPolicy(this.client, type);\n\t}\n\n\t/**\n\t * Query all the owned transfer policies for an address.\n\t * Returns `TransferPolicyCap` which uncludes `policyId, policyCapId, type`.\n\t * @param address The address we're searching the owned transfer policies for.\n\t */\n\tasync getOwnedTransferPolicies({ address }: { address: string }) {\n\t\treturn queryOwnedTransferPolicies(this.client, address);\n\t}\n\n\t/**\n\t * Query the Transfer Policy Cap for type `T`, owned by `address`\n\t * @param type The Type `T` for the object\n\t * @param address The address that owns the cap.\n\t */\n\tasync getOwnedTransferPoliciesByType({ type, address }: { type: string; address: string }) {\n\t\treturn queryTransferPolicyCapsByType(this.client, address, type);\n\t}\n\n\t// Someone would just have to create a `kiosk-client.ts` file in their project, initialize a KioskClient\n\t// and call the `addRuleResolver` function. Each rule has a `resolve` function.\n\t// The resolve function is automatically called on `purchaseAndResolve` function call.\n\taddRuleResolver(rule: TransferPolicyRule) {\n\t\tif (this.rules.find((x) => x.rule === rule.rule))\n\t\t\tthrow new Error(`Rule ${rule.rule} resolver already exists.`);\n\t\tthis.rules.push(rule);\n\t}\n\n\t/**\n\t * A convenient helper to get the packageIds for our supported ruleset,\n\t * based on `kioskClient` configuration.\n\t */\n\tgetRulePackageId(\n\t\trule:\n\t\t\t| 'kioskLockRulePackageId'\n\t\t\t| 'royaltyRulePackageId'\n\t\t\t| 'personalKioskRulePackageId'\n\t\t\t| 'floorPriceRulePackageId',\n\t) {\n\t\tconst rules = this.packageIds || {};\n\t\tconst network = this.network;\n\n\t\t/// Check existence of rule based on network and throw an error if it's not found.\n\t\t/// We always have a fallback for testnet or mainnet.\n\t\tif (!rules[rule] && network !== Network.MAINNET && network !== Network.TESTNET) {\n\t\t\tthrow new Error(`Missing packageId for rule ${rule}`);\n\t\t}\n\n\t\tswitch (rule) {\n\t\t\tcase 'kioskLockRulePackageId':\n\t\t\t\treturn rules[rule] || KIOSK_LOCK_RULE_ADDRESS[network];\n\t\t\tcase 'royaltyRulePackageId':\n\t\t\t\treturn rules[rule] || ROYALTY_RULE_ADDRESS[network];\n\t\t\tcase 'personalKioskRulePackageId':\n\t\t\t\treturn rules[rule] || PERSONAL_KIOSK_RULE_ADDRESS[network];\n\t\t\tcase 'floorPriceRulePackageId':\n\t\t\t\treturn rules[rule] || FLOOR_PRICE_RULE_ADDRESS[network];\n\t\t}\n\t}\n}\n"],
5
- "mappings": "AAKA;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AAEP,SAAS,YAAY,qBAAqB,sBAAsB;AAChE;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,eAAe;AAcjB,MAAM,YAAY;AAAA,EAMxB,YAAY,SAA6B;AACxC,SAAK,SAAS,QAAQ;AACtB,SAAK,UAAU,QAAQ;AACvB,SAAK,QAAQ;AACb,SAAK,aAAa,QAAQ;AAI1B,QAAI,QAAQ,WAAY,MAAK,MAAM,KAAK,GAAG,aAAa,QAAQ,UAAU,CAAC;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,eAAe;AAAA,IACpB;AAAA,IACA;AAAA,EACD,GAGyB;AACxB,UAAM,oBACL,KAAK,YAAY,8BAA8B,4BAA4B,KAAK,OAAO;AAExF,WAAO,eAAe,KAAK,QAAQ,SAAS;AAAA,MAC3C;AAAA,MACA,mBAAmB,oBAChB,GAAG,iBAAiB,uCACpB;AAAA,IACJ,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,SAAS,EAAE,IAAI,QAAQ,GAAoE;AAChG,YACC,MAAM;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA;AAAA,QACC,OAAO;AAAA,MACR;AAAA,MACA,WAAW,CAAC;AAAA,IACb,GACC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,kBAAkB,EAAE,SAAS,KAAK,GAAsC;AAC7E,WAAO,oBAAoB,KAAK,QAAQ,SAAS,IAAI;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,oBAAoB,EAAE,KAAK,GAAqB;AACrD,WAAO,oBAAoB,KAAK,QAAQ,IAAI;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,yBAAyB,EAAE,QAAQ,GAAwB;AAChE,WAAO,2BAA2B,KAAK,QAAQ,OAAO;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,+BAA+B,EAAE,MAAM,QAAQ,GAAsC;AAC1F,WAAO,8BAA8B,KAAK,QAAQ,SAAS,IAAI;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,MAA0B;AACzC,QAAI,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI;AAC9C,YAAM,IAAI,MAAM,QAAQ,KAAK,IAAI,2BAA2B;AAC7D,SAAK,MAAM,KAAK,IAAI;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBACC,MAKC;AACD,UAAMA,SAAQ,KAAK,cAAc,CAAC;AAClC,UAAM,UAAU,KAAK;AAIrB,QAAI,CAACA,OAAM,IAAI,KAAK,YAAY,QAAQ,WAAW,YAAY,QAAQ,SAAS;AAC/E,YAAM,IAAI,MAAM,8BAA8B,IAAI,EAAE;AAAA,IACrD;AAEA,YAAQ,MAAM;AAAA,MACb,KAAK;AACJ,eAAOA,OAAM,IAAI,KAAK,wBAAwB,OAAO;AAAA,MACtD,KAAK;AACJ,eAAOA,OAAM,IAAI,KAAK,qBAAqB,OAAO;AAAA,MACnD,KAAK;AACJ,eAAOA,OAAM,IAAI,KAAK,4BAA4B,OAAO;AAAA,MAC1D,KAAK;AACJ,eAAOA,OAAM,IAAI,KAAK,yBAAyB,OAAO;AAAA,IACxD;AAAA,EACD;AACD;",
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { PaginationArguments, SuiClient } from '@mysten/sui/client';\n\nimport {\n\tFLOOR_PRICE_RULE_ADDRESS,\n\tgetBaseRules,\n\tKIOSK_LOCK_RULE_ADDRESS,\n\tPERSONAL_KIOSK_RULE_ADDRESS,\n\tROYALTY_RULE_ADDRESS,\n\trules,\n} from '../constants.js';\nimport type { BaseRulePackageIds, TransferPolicyRule } from '../constants.js';\nimport { fetchKiosk, fetchKioskExtension, getOwnedKiosks } from '../query/kiosk.js';\nimport {\n\tqueryOwnedTransferPolicies,\n\tqueryTransferPolicy,\n\tqueryTransferPolicyCapsByType,\n} from '../query/transfer-policy.js';\nimport { Network } from '../types/index.js';\nimport type {\n\tFetchKioskOptions,\n\tKioskClientOptions,\n\tKioskData,\n\tOwnedKiosks,\n} from '../types/index.js';\n\n/**\n * A Client that allows you to interact with kiosk.\n * Offers utilities to query kiosk, craft transactions to edit your own kiosk,\n * purchase, manage transfer policies, create new kiosks etc.\n * If you pass packageIds, all functionality will be managed using these packages.\n */\nexport class KioskClient {\n\tclient: SuiClient;\n\tnetwork: Network;\n\trules: TransferPolicyRule[];\n\tpackageIds?: BaseRulePackageIds;\n\n\tconstructor(options: KioskClientOptions) {\n\t\tthis.client = options.client;\n\t\tthis.network = options.network;\n\t\tthis.rules = rules; // add all the default rules.\n\t\tthis.packageIds = options.packageIds;\n\n\t\t// Add the custom Package Ids too on the rule list.\n\t\t// Only adds the rules that are passed in the packageId object.\n\t\tif (options.packageIds) this.rules.push(...getBaseRules(options.packageIds));\n\t}\n\n\t/// Querying\n\n\t/**\n\t * Get an addresses's owned kiosks.\n\t * @param address The address for which we want to retrieve the kiosks.\n\t * @param pagination Optional pagination arguments.\n\t * @returns An Object containing all the `kioskOwnerCap` objects as well as the kioskIds.\n\t */\n\tasync getOwnedKiosks({\n\t\taddress,\n\t\tpagination,\n\t}: {\n\t\taddress: string;\n\t\tpagination?: PaginationArguments<string>;\n\t}): Promise<OwnedKiosks> {\n\t\tconst personalPackageId =\n\t\t\tthis.packageIds?.personalKioskRulePackageId || PERSONAL_KIOSK_RULE_ADDRESS[this.network];\n\n\t\treturn getOwnedKiosks(this.client, address, {\n\t\t\tpagination,\n\t\t\tpersonalKioskType: personalPackageId\n\t\t\t\t? `${personalPackageId}::personal_kiosk::PersonalKioskCap`\n\t\t\t\t: '',\n\t\t});\n\t}\n\n\t/**\n\t * Fetches the kiosk contents.\n\t * @param id The ID of the kiosk to fetch.\n\t * @param options Optional to control the fetch behavior.\n\t * @returns\n\t */\n\tasync getKiosk({ id, options }: { id: string; options?: FetchKioskOptions }): Promise<KioskData> {\n\t\treturn (await fetchKiosk(this.client, id, {}, options || {})).data;\n\t}\n\n\t/**\n\t * Fetch the extension data (if any) for a kiosk, by type\n\t * @param kioskId The ID of the kiosk to lookup\n\t * @param extensionType The Type of the extension (can be used from by using the type returned by `getKiosk()`)\n\t */\n\tasync getKioskExtension({ kioskId, type }: { kioskId: string; type: string }) {\n\t\treturn fetchKioskExtension(this.client, kioskId, type);\n\t}\n\n\t/**\n\t * Query the Transfer Policy(ies) for type `T`.\n\t * @param type The Type we're querying for (E.g `0xMyAddress::hero::Hero`)\n\t */\n\tasync getTransferPolicies({ type }: { type: string }) {\n\t\treturn queryTransferPolicy(this.client, type);\n\t}\n\n\t/**\n\t * Query all the owned transfer policies for an address.\n\t * Returns `TransferPolicyCap` which uncludes `policyId, policyCapId, type`.\n\t * @param address The address we're searching the owned transfer policies for.\n\t */\n\tasync getOwnedTransferPolicies({ address }: { address: string }) {\n\t\treturn queryOwnedTransferPolicies(this.client, address);\n\t}\n\n\t/**\n\t * Query the Transfer Policy Cap for type `T`, owned by `address`\n\t * @param type The Type `T` for the object\n\t * @param address The address that owns the cap.\n\t */\n\tasync getOwnedTransferPoliciesByType({ type, address }: { type: string; address: string }) {\n\t\treturn queryTransferPolicyCapsByType(this.client, address, type);\n\t}\n\n\t// Someone would just have to create a `kiosk-client.ts` file in their project, initialize a KioskClient\n\t// and call the `addRuleResolver` function. Each rule has a `resolve` function.\n\t// The resolve function is automatically called on `purchaseAndResolve` function call.\n\taddRuleResolver(rule: TransferPolicyRule) {\n\t\tif (this.rules.find((x) => x.rule === rule.rule))\n\t\t\tthrow new Error(`Rule ${rule.rule} resolver already exists.`);\n\t\tthis.rules.push(rule);\n\t}\n\n\t/**\n\t * A convenient helper to get the packageIds for our supported ruleset,\n\t * based on `kioskClient` configuration.\n\t */\n\tgetRulePackageId(\n\t\trule:\n\t\t\t| 'kioskLockRulePackageId'\n\t\t\t| 'royaltyRulePackageId'\n\t\t\t| 'personalKioskRulePackageId'\n\t\t\t| 'floorPriceRulePackageId',\n\t) {\n\t\tconst rules = this.packageIds || {};\n\t\tconst network = this.network;\n\n\t\t/// Check existence of rule based on network and throw an error if it's not found.\n\t\t/// We always have a fallback for testnet or mainnet.\n\t\tif (!rules[rule] && network !== Network.MAINNET && network !== Network.TESTNET) {\n\t\t\tthrow new Error(`Missing packageId for rule ${rule}`);\n\t\t}\n\n\t\tswitch (rule) {\n\t\t\tcase 'kioskLockRulePackageId':\n\t\t\t\treturn rules[rule] || KIOSK_LOCK_RULE_ADDRESS[network];\n\t\t\tcase 'royaltyRulePackageId':\n\t\t\t\treturn rules[rule] || ROYALTY_RULE_ADDRESS[network];\n\t\t\tcase 'personalKioskRulePackageId':\n\t\t\t\treturn rules[rule] || PERSONAL_KIOSK_RULE_ADDRESS[network];\n\t\t\tcase 'floorPriceRulePackageId':\n\t\t\t\treturn rules[rule] || FLOOR_PRICE_RULE_ADDRESS[network];\n\t\t}\n\t}\n}\n"],
5
+ "mappings": "AAKA;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AAEP,SAAS,YAAY,qBAAqB,sBAAsB;AAChE;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,eAAe;AAcjB,MAAM,YAAY;AAAA,EAMxB,YAAY,SAA6B;AACxC,SAAK,SAAS,QAAQ;AACtB,SAAK,UAAU,QAAQ;AACvB,SAAK,QAAQ;AACb,SAAK,aAAa,QAAQ;AAI1B,QAAI,QAAQ,WAAY,MAAK,MAAM,KAAK,GAAG,aAAa,QAAQ,UAAU,CAAC;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,eAAe;AAAA,IACpB;AAAA,IACA;AAAA,EACD,GAGyB;AACxB,UAAM,oBACL,KAAK,YAAY,8BAA8B,4BAA4B,KAAK,OAAO;AAExF,WAAO,eAAe,KAAK,QAAQ,SAAS;AAAA,MAC3C;AAAA,MACA,mBAAmB,oBAChB,GAAG,iBAAiB,uCACpB;AAAA,IACJ,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,SAAS,EAAE,IAAI,QAAQ,GAAoE;AAChG,YAAQ,MAAM,WAAW,KAAK,QAAQ,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,GAAG;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,kBAAkB,EAAE,SAAS,KAAK,GAAsC;AAC7E,WAAO,oBAAoB,KAAK,QAAQ,SAAS,IAAI;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,oBAAoB,EAAE,KAAK,GAAqB;AACrD,WAAO,oBAAoB,KAAK,QAAQ,IAAI;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,yBAAyB,EAAE,QAAQ,GAAwB;AAChE,WAAO,2BAA2B,KAAK,QAAQ,OAAO;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,+BAA+B,EAAE,MAAM,QAAQ,GAAsC;AAC1F,WAAO,8BAA8B,KAAK,QAAQ,SAAS,IAAI;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,MAA0B;AACzC,QAAI,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI;AAC9C,YAAM,IAAI,MAAM,QAAQ,KAAK,IAAI,2BAA2B;AAC7D,SAAK,MAAM,KAAK,IAAI;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBACC,MAKC;AACD,UAAMA,SAAQ,KAAK,cAAc,CAAC;AAClC,UAAM,UAAU,KAAK;AAIrB,QAAI,CAACA,OAAM,IAAI,KAAK,YAAY,QAAQ,WAAW,YAAY,QAAQ,SAAS;AAC/E,YAAM,IAAI,MAAM,8BAA8B,IAAI,EAAE;AAAA,IACrD;AAEA,YAAQ,MAAM;AAAA,MACb,KAAK;AACJ,eAAOA,OAAM,IAAI,KAAK,wBAAwB,OAAO;AAAA,MACtD,KAAK;AACJ,eAAOA,OAAM,IAAI,KAAK,qBAAqB,OAAO;AAAA,MACnD,KAAK;AACJ,eAAOA,OAAM,IAAI,KAAK,4BAA4B,OAAO;AAAA,MAC1D,KAAK;AACJ,eAAOA,OAAM,IAAI,KAAK,yBAAyB,OAAO;AAAA,IACxD;AAAA,EACD;AACD;",
6
6
  "names": ["rules"]
7
7
  }
@@ -12,13 +12,13 @@ async function resolveRoyaltyRule(params) {
12
12
  transferRequest,
13
13
  policyId
14
14
  } = params;
15
- const policyObj = tx.object(policyId);
16
15
  const feeTx = new Transaction();
17
16
  feeTx.moveCall({
18
17
  target: `${packageId}::royalty_rule::fee_amount`,
19
18
  typeArguments: [itemType],
20
- arguments: [policyObj, tx.pure.u64(price || "0")]
19
+ arguments: [feeTx.object(policyId), feeTx.pure.u64(price || "0")]
21
20
  });
21
+ const policyObj = tx.object(policyId);
22
22
  const { results } = await kioskClient.client.devInspectTransactionBlock({
23
23
  sender: tx.getData().sender || normalizeSuiAddress("0x0"),
24
24
  transactionBlock: feeTx
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/tx/rules/resolve.ts"],
4
- "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { bcs } from '@mysten/sui/bcs';\nimport type { TransactionArgument } from '@mysten/sui/transactions';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { normalizeSuiAddress } from '@mysten/sui/utils';\n\nimport type { RuleResolvingParams } from '../../types/index.js';\nimport { lock } from '../kiosk.js';\n\n/**\n * A helper to resolve the royalty rule.\n */\nexport async function resolveRoyaltyRule(params: RuleResolvingParams) {\n\tconst {\n\t\tkioskClient,\n\t\ttransaction: tx,\n\t\titemType,\n\t\tprice,\n\t\tpackageId,\n\t\ttransferRequest,\n\t\tpolicyId,\n\t} = params;\n\n\tconst policyObj = tx.object(policyId);\n\n\t// We attempt to resolve the fee amount outside of the PTB so that the split amount is known before the transaction is sent.\n\t// This improves the display of the transaction within the wallet.\n\n\tconst feeTx = new Transaction();\n\n\t// calculates the amount\n\tfeeTx.moveCall({\n\t\ttarget: `${packageId}::royalty_rule::fee_amount`,\n\t\ttypeArguments: [itemType],\n\t\targuments: [policyObj, tx.pure.u64(price || '0')],\n\t});\n\n\tconst { results } = await kioskClient.client.devInspectTransactionBlock({\n\t\tsender: tx.getData().sender || normalizeSuiAddress('0x0'),\n\t\ttransactionBlock: feeTx,\n\t});\n\n\tlet amount: TransactionArgument | bigint | null = null;\n\tif (results) {\n\t\tconst returnedAmount = results?.[0].returnValues?.[0]?.[0];\n\t\tif (returnedAmount) {\n\t\t\tamount = BigInt(bcs.U64.parse(new Uint8Array(returnedAmount as number[])));\n\t\t}\n\t}\n\n\t// We were not able to calculate the amount outside of the transaction, so fall back to resolving it within the PTB\n\tif (!amount) {\n\t\t[amount] = tx.moveCall({\n\t\t\ttarget: `${packageId}::royalty_rule::fee_amount`,\n\t\t\ttypeArguments: [itemType],\n\t\t\targuments: [policyObj, tx.pure.u64(price || '0')],\n\t\t});\n\t}\n\n\t// splits the coin.\n\tconst feeCoin = tx.splitCoins(tx.gas, [amount]);\n\n\t// pays the policy\n\ttx.moveCall({\n\t\ttarget: `${packageId}::royalty_rule::pay`,\n\t\ttypeArguments: [itemType],\n\t\targuments: [policyObj, transferRequest, feeCoin],\n\t});\n}\n\nexport function resolveKioskLockRule(params: RuleResolvingParams) {\n\tconst {\n\t\ttransaction: tx,\n\t\tpackageId,\n\t\titemType,\n\t\tkiosk,\n\t\tkioskCap,\n\t\tpolicyId,\n\t\tpurchasedItem,\n\t\ttransferRequest,\n\t} = params;\n\n\tif (!kiosk || !kioskCap) throw new Error('Missing Owned Kiosk or Owned Kiosk Cap');\n\n\tlock(tx, itemType, kiosk, kioskCap, policyId, purchasedItem);\n\n\t// proves that the item is locked in the kiosk to the TP.\n\ttx.moveCall({\n\t\ttarget: `${packageId}::kiosk_lock_rule::prove`,\n\t\ttypeArguments: [itemType],\n\t\targuments: [transferRequest, tx.object(kiosk)],\n\t});\n}\n\n/**\n * A helper to resolve the personalKioskRule.\n * @param params\n */\nexport function resolvePersonalKioskRule(params: RuleResolvingParams) {\n\tconst { transaction: tx, packageId, itemType, kiosk, transferRequest } = params;\n\n\tif (!kiosk) throw new Error('Missing owned Kiosk.');\n\n\t// proves that the destination kiosk is personal.\n\ttx.moveCall({\n\t\ttarget: `${packageId}::personal_kiosk_rule::prove`,\n\t\ttypeArguments: [itemType],\n\t\targuments: [tx.object(kiosk), transferRequest],\n\t});\n}\n\n/**\n * Resolves the floor price rule.\n */\nexport function resolveFloorPriceRule(params: RuleResolvingParams) {\n\tconst { transaction: tx, packageId, itemType, policyId, transferRequest } = params;\n\n\t// proves that the destination kiosk is personal\n\ttx.moveCall({\n\t\ttarget: `${packageId}::floor_price_rule::prove`,\n\t\ttypeArguments: [itemType],\n\t\targuments: [tx.object(policyId), transferRequest],\n\t});\n}\n"],
5
- "mappings": "AAGA,SAAS,WAAW;AAEpB,SAAS,mBAAmB;AAC5B,SAAS,2BAA2B;AAGpC,SAAS,YAAY;AAKrB,eAAsB,mBAAmB,QAA6B;AACrE,QAAM;AAAA,IACL;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,IAAI;AAEJ,QAAM,YAAY,GAAG,OAAO,QAAQ;AAKpC,QAAM,QAAQ,IAAI,YAAY;AAG9B,QAAM,SAAS;AAAA,IACd,QAAQ,GAAG,SAAS;AAAA,IACpB,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG,CAAC;AAAA,EACjD,CAAC;AAED,QAAM,EAAE,QAAQ,IAAI,MAAM,YAAY,OAAO,2BAA2B;AAAA,IACvE,QAAQ,GAAG,QAAQ,EAAE,UAAU,oBAAoB,KAAK;AAAA,IACxD,kBAAkB;AAAA,EACnB,CAAC;AAED,MAAI,SAA8C;AAClD,MAAI,SAAS;AACZ,UAAM,iBAAiB,UAAU,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC;AACzD,QAAI,gBAAgB;AACnB,eAAS,OAAO,IAAI,IAAI,MAAM,IAAI,WAAW,cAA0B,CAAC,CAAC;AAAA,IAC1E;AAAA,EACD;AAGA,MAAI,CAAC,QAAQ;AACZ,KAAC,MAAM,IAAI,GAAG,SAAS;AAAA,MACtB,QAAQ,GAAG,SAAS;AAAA,MACpB,eAAe,CAAC,QAAQ;AAAA,MACxB,WAAW,CAAC,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG,CAAC;AAAA,IACjD,CAAC;AAAA,EACF;AAGA,QAAM,UAAU,GAAG,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;AAG9C,KAAG,SAAS;AAAA,IACX,QAAQ,GAAG,SAAS;AAAA,IACpB,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,WAAW,iBAAiB,OAAO;AAAA,EAChD,CAAC;AACF;AAEO,SAAS,qBAAqB,QAA6B;AACjE,QAAM;AAAA,IACL,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,IAAI;AAEJ,MAAI,CAAC,SAAS,CAAC,SAAU,OAAM,IAAI,MAAM,wCAAwC;AAEjF,OAAK,IAAI,UAAU,OAAO,UAAU,UAAU,aAAa;AAG3D,KAAG,SAAS;AAAA,IACX,QAAQ,GAAG,SAAS;AAAA,IACpB,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,iBAAiB,GAAG,OAAO,KAAK,CAAC;AAAA,EAC9C,CAAC;AACF;AAMO,SAAS,yBAAyB,QAA6B;AACrE,QAAM,EAAE,aAAa,IAAI,WAAW,UAAU,OAAO,gBAAgB,IAAI;AAEzE,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,sBAAsB;AAGlD,KAAG,SAAS;AAAA,IACX,QAAQ,GAAG,SAAS;AAAA,IACpB,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,GAAG,OAAO,KAAK,GAAG,eAAe;AAAA,EAC9C,CAAC;AACF;AAKO,SAAS,sBAAsB,QAA6B;AAClE,QAAM,EAAE,aAAa,IAAI,WAAW,UAAU,UAAU,gBAAgB,IAAI;AAG5E,KAAG,SAAS;AAAA,IACX,QAAQ,GAAG,SAAS;AAAA,IACpB,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,GAAG,OAAO,QAAQ,GAAG,eAAe;AAAA,EACjD,CAAC;AACF;",
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { bcs } from '@mysten/sui/bcs';\nimport type { TransactionArgument } from '@mysten/sui/transactions';\nimport { Transaction } from '@mysten/sui/transactions';\nimport { normalizeSuiAddress } from '@mysten/sui/utils';\n\nimport type { RuleResolvingParams } from '../../types/index.js';\nimport { lock } from '../kiosk.js';\n\n/**\n * A helper to resolve the royalty rule.\n */\nexport async function resolveRoyaltyRule(params: RuleResolvingParams) {\n\tconst {\n\t\tkioskClient,\n\t\ttransaction: tx,\n\t\titemType,\n\t\tprice,\n\t\tpackageId,\n\t\ttransferRequest,\n\t\tpolicyId,\n\t} = params;\n\n\t// We attempt to resolve the fee amount outside of the PTB so that the split amount is known before the transaction is sent.\n\t// This improves the display of the transaction within the wallet.\n\n\tconst feeTx = new Transaction();\n\n\t// calculates the amount\n\tfeeTx.moveCall({\n\t\ttarget: `${packageId}::royalty_rule::fee_amount`,\n\t\ttypeArguments: [itemType],\n\t\targuments: [feeTx.object(policyId), feeTx.pure.u64(price || '0')],\n\t});\n\n\tconst policyObj = tx.object(policyId);\n\n\tconst { results } = await kioskClient.client.devInspectTransactionBlock({\n\t\tsender: tx.getData().sender || normalizeSuiAddress('0x0'),\n\t\ttransactionBlock: feeTx,\n\t});\n\n\tlet amount: TransactionArgument | bigint | null = null;\n\tif (results) {\n\t\tconst returnedAmount = results?.[0].returnValues?.[0]?.[0];\n\t\tif (returnedAmount) {\n\t\t\tamount = BigInt(bcs.U64.parse(new Uint8Array(returnedAmount as number[])));\n\t\t}\n\t}\n\n\t// We were not able to calculate the amount outside of the transaction, so fall back to resolving it within the PTB\n\tif (!amount) {\n\t\t[amount] = tx.moveCall({\n\t\t\ttarget: `${packageId}::royalty_rule::fee_amount`,\n\t\t\ttypeArguments: [itemType],\n\t\t\targuments: [policyObj, tx.pure.u64(price || '0')],\n\t\t});\n\t}\n\n\t// splits the coin.\n\tconst feeCoin = tx.splitCoins(tx.gas, [amount]);\n\n\t// pays the policy\n\ttx.moveCall({\n\t\ttarget: `${packageId}::royalty_rule::pay`,\n\t\ttypeArguments: [itemType],\n\t\targuments: [policyObj, transferRequest, feeCoin],\n\t});\n}\n\nexport function resolveKioskLockRule(params: RuleResolvingParams) {\n\tconst {\n\t\ttransaction: tx,\n\t\tpackageId,\n\t\titemType,\n\t\tkiosk,\n\t\tkioskCap,\n\t\tpolicyId,\n\t\tpurchasedItem,\n\t\ttransferRequest,\n\t} = params;\n\n\tif (!kiosk || !kioskCap) throw new Error('Missing Owned Kiosk or Owned Kiosk Cap');\n\n\tlock(tx, itemType, kiosk, kioskCap, policyId, purchasedItem);\n\n\t// proves that the item is locked in the kiosk to the TP.\n\ttx.moveCall({\n\t\ttarget: `${packageId}::kiosk_lock_rule::prove`,\n\t\ttypeArguments: [itemType],\n\t\targuments: [transferRequest, tx.object(kiosk)],\n\t});\n}\n\n/**\n * A helper to resolve the personalKioskRule.\n * @param params\n */\nexport function resolvePersonalKioskRule(params: RuleResolvingParams) {\n\tconst { transaction: tx, packageId, itemType, kiosk, transferRequest } = params;\n\n\tif (!kiosk) throw new Error('Missing owned Kiosk.');\n\n\t// proves that the destination kiosk is personal.\n\ttx.moveCall({\n\t\ttarget: `${packageId}::personal_kiosk_rule::prove`,\n\t\ttypeArguments: [itemType],\n\t\targuments: [tx.object(kiosk), transferRequest],\n\t});\n}\n\n/**\n * Resolves the floor price rule.\n */\nexport function resolveFloorPriceRule(params: RuleResolvingParams) {\n\tconst { transaction: tx, packageId, itemType, policyId, transferRequest } = params;\n\n\t// proves that the destination kiosk is personal\n\ttx.moveCall({\n\t\ttarget: `${packageId}::floor_price_rule::prove`,\n\t\ttypeArguments: [itemType],\n\t\targuments: [tx.object(policyId), transferRequest],\n\t});\n}\n"],
5
+ "mappings": "AAGA,SAAS,WAAW;AAEpB,SAAS,mBAAmB;AAC5B,SAAS,2BAA2B;AAGpC,SAAS,YAAY;AAKrB,eAAsB,mBAAmB,QAA6B;AACrE,QAAM;AAAA,IACL;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,IAAI;AAKJ,QAAM,QAAQ,IAAI,YAAY;AAG9B,QAAM,SAAS;AAAA,IACd,QAAQ,GAAG,SAAS;AAAA,IACpB,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,MAAM,OAAO,QAAQ,GAAG,MAAM,KAAK,IAAI,SAAS,GAAG,CAAC;AAAA,EACjE,CAAC;AAED,QAAM,YAAY,GAAG,OAAO,QAAQ;AAEpC,QAAM,EAAE,QAAQ,IAAI,MAAM,YAAY,OAAO,2BAA2B;AAAA,IACvE,QAAQ,GAAG,QAAQ,EAAE,UAAU,oBAAoB,KAAK;AAAA,IACxD,kBAAkB;AAAA,EACnB,CAAC;AAED,MAAI,SAA8C;AAClD,MAAI,SAAS;AACZ,UAAM,iBAAiB,UAAU,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC;AACzD,QAAI,gBAAgB;AACnB,eAAS,OAAO,IAAI,IAAI,MAAM,IAAI,WAAW,cAA0B,CAAC,CAAC;AAAA,IAC1E;AAAA,EACD;AAGA,MAAI,CAAC,QAAQ;AACZ,KAAC,MAAM,IAAI,GAAG,SAAS;AAAA,MACtB,QAAQ,GAAG,SAAS;AAAA,MACpB,eAAe,CAAC,QAAQ;AAAA,MACxB,WAAW,CAAC,WAAW,GAAG,KAAK,IAAI,SAAS,GAAG,CAAC;AAAA,IACjD,CAAC;AAAA,EACF;AAGA,QAAM,UAAU,GAAG,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;AAG9C,KAAG,SAAS;AAAA,IACX,QAAQ,GAAG,SAAS;AAAA,IACpB,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,WAAW,iBAAiB,OAAO;AAAA,EAChD,CAAC;AACF;AAEO,SAAS,qBAAqB,QAA6B;AACjE,QAAM;AAAA,IACL,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,IAAI;AAEJ,MAAI,CAAC,SAAS,CAAC,SAAU,OAAM,IAAI,MAAM,wCAAwC;AAEjF,OAAK,IAAI,UAAU,OAAO,UAAU,UAAU,aAAa;AAG3D,KAAG,SAAS;AAAA,IACX,QAAQ,GAAG,SAAS;AAAA,IACpB,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,iBAAiB,GAAG,OAAO,KAAK,CAAC;AAAA,EAC9C,CAAC;AACF;AAMO,SAAS,yBAAyB,QAA6B;AACrE,QAAM,EAAE,aAAa,IAAI,WAAW,UAAU,OAAO,gBAAgB,IAAI;AAEzE,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,sBAAsB;AAGlD,KAAG,SAAS;AAAA,IACX,QAAQ,GAAG,SAAS;AAAA,IACpB,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,GAAG,OAAO,KAAK,GAAG,eAAe;AAAA,EAC9C,CAAC;AACF;AAKO,SAAS,sBAAsB,QAA6B;AAClE,QAAM,EAAE,aAAa,IAAI,WAAW,UAAU,UAAU,gBAAgB,IAAI;AAG5E,KAAG,SAAS;AAAA,IACX,QAAQ,GAAG,SAAS;AAAA,IACpB,eAAe,CAAC,QAAQ;AAAA,IACxB,WAAW,CAAC,GAAG,OAAO,QAAQ,GAAG,eAAe;AAAA,EACjD,CAAC;AACF;",
6
6
  "names": []
7
7
  }
package/dist/esm/utils.js CHANGED
@@ -6,6 +6,7 @@ import {
6
6
  } from "@mysten/sui/utils";
7
7
  import { KioskType } from "./bcs.js";
8
8
  import { TRANSFER_POLICY_CAP_TYPE } from "./types/index.js";
9
+ import { chunk } from "@mysten/utils";
9
10
  const DEFAULT_QUERY_LIMIT = 50;
10
11
  async function getKioskObject(client, id) {
11
12
  const queryRes = await client.getObject({ id, options: { showBcs: true } });
@@ -110,14 +111,11 @@ async function getAllDynamicFields(client, parentId, pagination) {
110
111
  return data;
111
112
  }
112
113
  async function getAllObjects(client, ids, options, limit = DEFAULT_QUERY_LIMIT) {
113
- const chunks = Array.from(
114
- { length: Math.ceil(ids.length / limit) },
115
- (_, index) => ids.slice(index * limit, index * limit + limit)
116
- );
114
+ const chunks = chunk(ids, limit);
117
115
  const results = await Promise.all(
118
- chunks.map((chunk) => {
116
+ chunks.map((chunk2) => {
119
117
  return client.multiGetObjects({
120
- ids: chunk,
118
+ ids: chunk2,
121
119
  options
122
120
  });
123
121
  })
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils.ts"],
4
- "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type {\n\tDynamicFieldInfo,\n\tPaginationArguments,\n\tSuiClient,\n\tSuiObjectData,\n\tSuiObjectDataFilter,\n\tSuiObjectDataOptions,\n\tSuiObjectResponse,\n} from '@mysten/sui/client';\nimport {\n\tfromBase64,\n\tnormalizeStructTag,\n\tnormalizeSuiAddress,\n\tparseStructTag,\n} from '@mysten/sui/utils';\n\nimport { KioskType } from './bcs.js';\nimport type { Kiosk, KioskData, KioskListing, TransferPolicyCap } from './types/index.js';\nimport { TRANSFER_POLICY_CAP_TYPE } from './types/index.js';\n\nconst DEFAULT_QUERY_LIMIT = 50;\n\nexport async function getKioskObject(client: SuiClient, id: string): Promise<Kiosk> {\n\tconst queryRes = await client.getObject({ id, options: { showBcs: true } });\n\n\tif (!queryRes || queryRes.error || !queryRes.data) {\n\t\tthrow new Error(`Kiosk ${id} not found; ${queryRes.error}`);\n\t}\n\n\tif (!queryRes.data.bcs || !('bcsBytes' in queryRes.data.bcs)) {\n\t\tthrow new Error(`Invalid kiosk query: ${id}, expected object, got package`);\n\t}\n\n\treturn KioskType.parse(fromBase64(queryRes.data.bcs!.bcsBytes));\n}\n\n// helper to extract kiosk data from dynamic fields.\nexport function extractKioskData(\n\tdata: DynamicFieldInfo[],\n\tlistings: KioskListing[],\n\tlockedItemIds: string[],\n\tkioskId: string,\n): KioskData {\n\treturn data.reduce<KioskData>(\n\t\t(acc: KioskData, val: DynamicFieldInfo) => {\n\t\t\tconst type = val.name.type;\n\n\t\t\tif (type.startsWith('0x2::kiosk::Item')) {\n\t\t\t\tacc.itemIds.push(val.objectId);\n\t\t\t\tacc.items.push({\n\t\t\t\t\tobjectId: val.objectId,\n\t\t\t\t\ttype: val.objectType,\n\t\t\t\t\tisLocked: false,\n\t\t\t\t\tkioskId,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (type.startsWith('0x2::kiosk::Listing')) {\n\t\t\t\tacc.listingIds.push(val.objectId);\n\t\t\t\tlistings.push({\n\t\t\t\t\tobjectId: (val.name.value as { id: string }).id,\n\t\t\t\t\tlistingId: val.objectId,\n\t\t\t\t\tisExclusive: (val.name.value as { is_exclusive: boolean }).is_exclusive,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (type.startsWith('0x2::kiosk::Lock')) {\n\t\t\t\tlockedItemIds?.push((val.name.value as { id: string }).id);\n\t\t\t}\n\n\t\t\tif (type.startsWith('0x2::kiosk_extension::ExtensionKey')) {\n\t\t\t\tacc.extensions.push({\n\t\t\t\t\tobjectId: val.objectId,\n\t\t\t\t\ttype: normalizeStructTag(parseStructTag(val.name.type).typeParams[0]),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn acc;\n\t\t},\n\t\t{ items: [], itemIds: [], listingIds: [], extensions: [] },\n\t);\n}\n\n/**\n * A helper that attaches the listing prices to kiosk listings.\n */\nexport function attachListingsAndPrices(\n\tkioskData: KioskData,\n\tlistings: KioskListing[],\n\tlistingObjects: SuiObjectResponse[],\n) {\n\t// map item listings as {item_id: KioskListing}\n\t// for easier mapping on the nex\n\tconst itemListings = listings.reduce<Record<string, KioskListing>>(\n\t\t(acc: Record<string, KioskListing>, item, idx) => {\n\t\t\tacc[item.objectId] = { ...item };\n\n\t\t\t// return in case we don't have any listing objects.\n\t\t\t// that's the case when we don't have the `listingPrices` included.\n\t\t\tif (listingObjects.length === 0) return acc;\n\n\t\t\tconst content = listingObjects[idx].data?.content;\n\t\t\tconst data = content?.dataType === 'moveObject' ? content?.fields : null;\n\n\t\t\tif (!data) return acc;\n\n\t\t\tacc[item.objectId].price = (data as { value: string }).value;\n\t\t\treturn acc;\n\t\t},\n\t\t{},\n\t);\n\n\tkioskData.items.forEach((item) => {\n\t\titem.listing = itemListings[item.objectId] || undefined;\n\t});\n}\n\n/**\n * A helper that attaches the listing prices to kiosk listings.\n */\nexport function attachObjects(kioskData: KioskData, objects: SuiObjectData[]) {\n\tconst mapping = objects.reduce<Record<string, SuiObjectData>>(\n\t\t(acc: Record<string, SuiObjectData>, obj) => {\n\t\t\tacc[obj.objectId] = obj;\n\t\t\treturn acc;\n\t\t},\n\t\t{},\n\t);\n\n\tkioskData.items.forEach((item) => {\n\t\titem.data = mapping[item.objectId] || undefined;\n\t});\n}\n\n/**\n * A Helper to attach locked state to items in Kiosk Data.\n */\nexport function attachLockedItems(kioskData: KioskData, lockedItemIds: string[]) {\n\t// map lock status in an array of type { item_id: true }\n\tconst lockedStatuses = lockedItemIds.reduce<Record<string, boolean>>(\n\t\t(acc: Record<string, boolean>, item: string) => {\n\t\t\tacc[item] = true;\n\t\t\treturn acc;\n\t\t},\n\t\t{},\n\t);\n\n\t// parse lockedItemIds and attach their locked status.\n\tkioskData.items.forEach((item) => {\n\t\titem.isLocked = lockedStatuses[item.objectId] || false;\n\t});\n}\n\n/**\n * A helper to fetch all DF pages.\n * We need that to fetch the kiosk DFs consistently, until we have\n * RPC calls that allow filtering of Type / batch fetching of spec\n */\nexport async function getAllDynamicFields(\n\tclient: SuiClient,\n\tparentId: string,\n\tpagination: PaginationArguments<string>,\n) {\n\tlet hasNextPage = true;\n\tlet cursor = undefined;\n\tconst data: DynamicFieldInfo[] = [];\n\n\twhile (hasNextPage) {\n\t\tconst result = await client.getDynamicFields({\n\t\t\tparentId,\n\t\t\tlimit: pagination.limit || undefined,\n\t\t\tcursor,\n\t\t});\n\t\tdata.push(...result.data);\n\t\thasNextPage = result.hasNextPage;\n\t\tcursor = result.nextCursor;\n\t}\n\n\treturn data;\n}\n\n/**\n * A helper to fetch all objects that works with pagination.\n * It will fetch all objects in the array, and limit it to 50/request.\n * Requests are sent using `Promise.all`.\n */\nexport async function getAllObjects(\n\tclient: SuiClient,\n\tids: string[],\n\toptions: SuiObjectDataOptions,\n\tlimit: number = DEFAULT_QUERY_LIMIT,\n) {\n\tconst chunks = Array.from({ length: Math.ceil(ids.length / limit) }, (_, index) =>\n\t\tids.slice(index * limit, index * limit + limit),\n\t);\n\n\tconst results = await Promise.all(\n\t\tchunks.map((chunk) => {\n\t\t\treturn client.multiGetObjects({\n\t\t\t\tids: chunk,\n\t\t\t\toptions,\n\t\t\t});\n\t\t}),\n\t);\n\n\treturn results.flat();\n}\n\n/**\n * A helper to return all owned objects, with an optional filter.\n * It parses all the pages and returns the data.\n */\nexport async function getAllOwnedObjects({\n\tclient,\n\towner,\n\tfilter,\n\tlimit = DEFAULT_QUERY_LIMIT,\n\toptions = { showType: true, showContent: true },\n}: {\n\tclient: SuiClient;\n\towner: string;\n\tfilter?: SuiObjectDataFilter;\n\toptions?: SuiObjectDataOptions;\n\tlimit?: number;\n}) {\n\tlet hasNextPage = true;\n\tlet cursor = undefined;\n\tconst data: SuiObjectResponse[] = [];\n\n\twhile (hasNextPage) {\n\t\tconst result = await client.getOwnedObjects({\n\t\t\towner,\n\t\t\tfilter,\n\t\t\tlimit,\n\t\t\tcursor,\n\t\t\toptions,\n\t\t});\n\t\tdata.push(...result.data);\n\t\thasNextPage = result.hasNextPage;\n\t\tcursor = result.nextCursor;\n\t}\n\n\treturn data;\n}\n\n/**\n * Converts a number to basis points.\n * Supports up to 2 decimal points.\n * E.g 9.95 -> 995\n * @param percentage A percentage amount in the range [0, 100] including decimals.\n */\nexport function percentageToBasisPoints(percentage: number) {\n\tif (percentage < 0 || percentage > 100)\n\t\tthrow new Error('Percentage needs to be in the [0,100] range.');\n\treturn Math.ceil(percentage * 100);\n}\n\n/**\n * A helper to parse a transfer policy Cap into a usable object.\n */\nexport function parseTransferPolicyCapObject(\n\titem: SuiObjectResponse,\n): TransferPolicyCap | undefined {\n\tconst type = (item?.data?.content as { type: string })?.type;\n\n\t//@ts-ignore-next-line\n\tconst policy = item?.data?.content?.fields?.policy_id as string;\n\n\tif (!type.includes(TRANSFER_POLICY_CAP_TYPE)) return undefined;\n\n\t// Transform 0x2::transfer_policy::TransferPolicyCap<itemType> -> itemType\n\tconst objectType = type.replace(TRANSFER_POLICY_CAP_TYPE + '<', '').slice(0, -1);\n\n\treturn {\n\t\tpolicyId: policy,\n\t\tpolicyCapId: item.data?.objectId!,\n\t\ttype: objectType,\n\t};\n}\n\n// Normalizes the packageId part of a rule's type.\nexport function getNormalizedRuleType(rule: string) {\n\tconst normalizedRuleAddress = rule.split('::');\n\tnormalizedRuleAddress[0] = normalizeSuiAddress(normalizedRuleAddress[0]);\n\treturn normalizedRuleAddress.join('::');\n}\n"],
5
- "mappings": "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",
6
- "names": []
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type {\n\tDynamicFieldInfo,\n\tPaginationArguments,\n\tSuiClient,\n\tSuiObjectData,\n\tSuiObjectDataFilter,\n\tSuiObjectDataOptions,\n\tSuiObjectResponse,\n} from '@mysten/sui/client';\nimport {\n\tfromBase64,\n\tnormalizeStructTag,\n\tnormalizeSuiAddress,\n\tparseStructTag,\n} from '@mysten/sui/utils';\n\nimport { KioskType } from './bcs.js';\nimport type { Kiosk, KioskData, KioskListing, TransferPolicyCap } from './types/index.js';\nimport { TRANSFER_POLICY_CAP_TYPE } from './types/index.js';\nimport { chunk } from '@mysten/utils';\n\nconst DEFAULT_QUERY_LIMIT = 50;\n\nexport async function getKioskObject(client: SuiClient, id: string): Promise<Kiosk> {\n\tconst queryRes = await client.getObject({ id, options: { showBcs: true } });\n\n\tif (!queryRes || queryRes.error || !queryRes.data) {\n\t\tthrow new Error(`Kiosk ${id} not found; ${queryRes.error}`);\n\t}\n\n\tif (!queryRes.data.bcs || !('bcsBytes' in queryRes.data.bcs)) {\n\t\tthrow new Error(`Invalid kiosk query: ${id}, expected object, got package`);\n\t}\n\n\treturn KioskType.parse(fromBase64(queryRes.data.bcs!.bcsBytes));\n}\n\n// helper to extract kiosk data from dynamic fields.\nexport function extractKioskData(\n\tdata: DynamicFieldInfo[],\n\tlistings: KioskListing[],\n\tlockedItemIds: string[],\n\tkioskId: string,\n): KioskData {\n\treturn data.reduce<KioskData>(\n\t\t(acc: KioskData, val: DynamicFieldInfo) => {\n\t\t\tconst type = val.name.type;\n\n\t\t\tif (type.startsWith('0x2::kiosk::Item')) {\n\t\t\t\tacc.itemIds.push(val.objectId);\n\t\t\t\tacc.items.push({\n\t\t\t\t\tobjectId: val.objectId,\n\t\t\t\t\ttype: val.objectType,\n\t\t\t\t\tisLocked: false,\n\t\t\t\t\tkioskId,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (type.startsWith('0x2::kiosk::Listing')) {\n\t\t\t\tacc.listingIds.push(val.objectId);\n\t\t\t\tlistings.push({\n\t\t\t\t\tobjectId: (val.name.value as { id: string }).id,\n\t\t\t\t\tlistingId: val.objectId,\n\t\t\t\t\tisExclusive: (val.name.value as { is_exclusive: boolean }).is_exclusive,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (type.startsWith('0x2::kiosk::Lock')) {\n\t\t\t\tlockedItemIds?.push((val.name.value as { id: string }).id);\n\t\t\t}\n\n\t\t\tif (type.startsWith('0x2::kiosk_extension::ExtensionKey')) {\n\t\t\t\tacc.extensions.push({\n\t\t\t\t\tobjectId: val.objectId,\n\t\t\t\t\ttype: normalizeStructTag(parseStructTag(val.name.type).typeParams[0]),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn acc;\n\t\t},\n\t\t{ items: [], itemIds: [], listingIds: [], extensions: [] },\n\t);\n}\n\n/**\n * A helper that attaches the listing prices to kiosk listings.\n */\nexport function attachListingsAndPrices(\n\tkioskData: KioskData,\n\tlistings: KioskListing[],\n\tlistingObjects: SuiObjectResponse[],\n) {\n\t// map item listings as {item_id: KioskListing}\n\t// for easier mapping on the nex\n\tconst itemListings = listings.reduce<Record<string, KioskListing>>(\n\t\t(acc: Record<string, KioskListing>, item, idx) => {\n\t\t\tacc[item.objectId] = { ...item };\n\n\t\t\t// return in case we don't have any listing objects.\n\t\t\t// that's the case when we don't have the `listingPrices` included.\n\t\t\tif (listingObjects.length === 0) return acc;\n\n\t\t\tconst content = listingObjects[idx].data?.content;\n\t\t\tconst data = content?.dataType === 'moveObject' ? content?.fields : null;\n\n\t\t\tif (!data) return acc;\n\n\t\t\tacc[item.objectId].price = (data as { value: string }).value;\n\t\t\treturn acc;\n\t\t},\n\t\t{},\n\t);\n\n\tkioskData.items.forEach((item) => {\n\t\titem.listing = itemListings[item.objectId] || undefined;\n\t});\n}\n\n/**\n * A helper that attaches the listing prices to kiosk listings.\n */\nexport function attachObjects(kioskData: KioskData, objects: SuiObjectData[]) {\n\tconst mapping = objects.reduce<Record<string, SuiObjectData>>(\n\t\t(acc: Record<string, SuiObjectData>, obj) => {\n\t\t\tacc[obj.objectId] = obj;\n\t\t\treturn acc;\n\t\t},\n\t\t{},\n\t);\n\n\tkioskData.items.forEach((item) => {\n\t\titem.data = mapping[item.objectId] || undefined;\n\t});\n}\n\n/**\n * A Helper to attach locked state to items in Kiosk Data.\n */\nexport function attachLockedItems(kioskData: KioskData, lockedItemIds: string[]) {\n\t// map lock status in an array of type { item_id: true }\n\tconst lockedStatuses = lockedItemIds.reduce<Record<string, boolean>>(\n\t\t(acc: Record<string, boolean>, item: string) => {\n\t\t\tacc[item] = true;\n\t\t\treturn acc;\n\t\t},\n\t\t{},\n\t);\n\n\t// parse lockedItemIds and attach their locked status.\n\tkioskData.items.forEach((item) => {\n\t\titem.isLocked = lockedStatuses[item.objectId] || false;\n\t});\n}\n\n/**\n * A helper to fetch all DF pages.\n * We need that to fetch the kiosk DFs consistently, until we have\n * RPC calls that allow filtering of Type / batch fetching of spec\n */\nexport async function getAllDynamicFields(\n\tclient: SuiClient,\n\tparentId: string,\n\tpagination: PaginationArguments<string>,\n) {\n\tlet hasNextPage = true;\n\tlet cursor = undefined;\n\tconst data: DynamicFieldInfo[] = [];\n\n\twhile (hasNextPage) {\n\t\tconst result = await client.getDynamicFields({\n\t\t\tparentId,\n\t\t\tlimit: pagination.limit || undefined,\n\t\t\tcursor,\n\t\t});\n\t\tdata.push(...result.data);\n\t\thasNextPage = result.hasNextPage;\n\t\tcursor = result.nextCursor;\n\t}\n\n\treturn data;\n}\n\n/**\n * A helper to fetch all objects that works with pagination.\n * It will fetch all objects in the array, and limit it to 50/request.\n * Requests are sent using `Promise.all`.\n */\nexport async function getAllObjects(\n\tclient: SuiClient,\n\tids: string[],\n\toptions: SuiObjectDataOptions,\n\tlimit: number = DEFAULT_QUERY_LIMIT,\n) {\n\tconst chunks = chunk(ids, limit);\n\n\tconst results = await Promise.all(\n\t\tchunks.map((chunk) => {\n\t\t\treturn client.multiGetObjects({\n\t\t\t\tids: chunk,\n\t\t\t\toptions,\n\t\t\t});\n\t\t}),\n\t);\n\n\treturn results.flat();\n}\n\n/**\n * A helper to return all owned objects, with an optional filter.\n * It parses all the pages and returns the data.\n */\nexport async function getAllOwnedObjects({\n\tclient,\n\towner,\n\tfilter,\n\tlimit = DEFAULT_QUERY_LIMIT,\n\toptions = { showType: true, showContent: true },\n}: {\n\tclient: SuiClient;\n\towner: string;\n\tfilter?: SuiObjectDataFilter;\n\toptions?: SuiObjectDataOptions;\n\tlimit?: number;\n}) {\n\tlet hasNextPage = true;\n\tlet cursor = undefined;\n\tconst data: SuiObjectResponse[] = [];\n\n\twhile (hasNextPage) {\n\t\tconst result = await client.getOwnedObjects({\n\t\t\towner,\n\t\t\tfilter,\n\t\t\tlimit,\n\t\t\tcursor,\n\t\t\toptions,\n\t\t});\n\t\tdata.push(...result.data);\n\t\thasNextPage = result.hasNextPage;\n\t\tcursor = result.nextCursor;\n\t}\n\n\treturn data;\n}\n\n/**\n * Converts a number to basis points.\n * Supports up to 2 decimal points.\n * E.g 9.95 -> 995\n * @param percentage A percentage amount in the range [0, 100] including decimals.\n */\nexport function percentageToBasisPoints(percentage: number) {\n\tif (percentage < 0 || percentage > 100)\n\t\tthrow new Error('Percentage needs to be in the [0,100] range.');\n\treturn Math.ceil(percentage * 100);\n}\n\n/**\n * A helper to parse a transfer policy Cap into a usable object.\n */\nexport function parseTransferPolicyCapObject(\n\titem: SuiObjectResponse,\n): TransferPolicyCap | undefined {\n\tconst type = (item?.data?.content as { type: string })?.type;\n\n\t//@ts-ignore-next-line\n\tconst policy = item?.data?.content?.fields?.policy_id as string;\n\n\tif (!type.includes(TRANSFER_POLICY_CAP_TYPE)) return undefined;\n\n\t// Transform 0x2::transfer_policy::TransferPolicyCap<itemType> -> itemType\n\tconst objectType = type.replace(TRANSFER_POLICY_CAP_TYPE + '<', '').slice(0, -1);\n\n\treturn {\n\t\tpolicyId: policy,\n\t\tpolicyCapId: item.data?.objectId!,\n\t\ttype: objectType,\n\t};\n}\n\n// Normalizes the packageId part of a rule's type.\nexport function getNormalizedRuleType(rule: string) {\n\tconst normalizedRuleAddress = rule.split('::');\n\tnormalizedRuleAddress[0] = normalizeSuiAddress(normalizedRuleAddress[0]);\n\treturn normalizedRuleAddress.join('::');\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["chunk"]
7
7
  }