{"version":3,"file":"kiosk-client.mjs","names":["rules"],"sources":["../../src/client/kiosk-client.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { SuiClientTypes } 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 type {\n\tFetchKioskOptions,\n\tKioskClientOptions,\n\tKioskCompatibleClient,\n\tKioskData,\n\tKioskPaginationArguments,\n\tOwnedKiosks,\n} from '../types/index.js';\n\nexport type KioskExtensionOptions<Name extends string = 'kiosk'> = {\n\tname?: Name;\n\tpackageIds?: BaseRulePackageIds;\n};\n\n/**\n * Creates a kiosk client extension that can be used with `client.$extend()`.\n *\n * @example\n * ```ts\n * import { SuiGrpcClient } from '@mysten/sui/grpc';\n * import { kiosk } from '@mysten/kiosk';\n *\n * const client = new SuiGrpcClient({\n *   baseUrl: 'https://fullnode.mainnet.sui.io:443',\n *   network: 'mainnet',\n * }).$extend(kiosk());\n *\n * const ownedKiosks = await client.kiosk.getOwnedKiosks({ address: '0x...' });\n * ```\n */\nexport function kiosk<const Name extends string = 'kiosk'>({\n\tname = 'kiosk' as Name,\n\tpackageIds,\n}: KioskExtensionOptions<Name> = {}) {\n\treturn {\n\t\tname,\n\t\tregister: (client: KioskCompatibleClient) => {\n\t\t\treturn new KioskClient({\n\t\t\t\tclient,\n\t\t\t\tnetwork: client.network,\n\t\t\t\tpackageIds,\n\t\t\t});\n\t\t},\n\t};\n}\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: KioskCompatibleClient;\n\tnetwork: SuiClientTypes.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?: KioskPaginationArguments;\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 !== 'mainnet' && 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"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAkDA,SAAgB,MAA2C,EAC1D,OAAO,SACP,eACgC,EAAE,EAAE;AACpC,QAAO;EACN;EACA,WAAW,WAAkC;AAC5C,UAAO,IAAI,YAAY;IACtB;IACA,SAAS,OAAO;IAChB;IACA,CAAC;;EAEH;;;;;;;;AASF,IAAa,cAAb,MAAyB;CAMxB,YAAY,SAA6B;AACxC,OAAK,SAAS,QAAQ;AACtB,OAAK,UAAU,QAAQ;AACvB,OAAK,QAAQ;AACb,OAAK,aAAa,QAAQ;AAI1B,MAAI,QAAQ,WAAY,MAAK,MAAM,KAAK,GAAG,aAAa,QAAQ,WAAW,CAAC;;;;;;;;CAW7E,MAAM,eAAe,EACpB,SACA,cAIwB;EACxB,MAAM,oBACL,KAAK,YAAY,8BAA8B,4BAA4B,KAAK;AAEjF,SAAO,eAAe,KAAK,QAAQ,SAAS;GAC3C;GACA,mBAAmB,oBAChB,GAAG,kBAAkB,sCACrB;GACH,CAAC;;;;;;;;CASH,MAAM,SAAS,EAAE,IAAI,WAA4E;AAChG,UAAQ,MAAM,WAAW,KAAK,QAAQ,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE;;;;;;;CAQ/D,MAAM,kBAAkB,EAAE,SAAS,QAA2C;AAC7E,SAAO,oBAAoB,KAAK,QAAQ,SAAS,KAAK;;;;;;CAOvD,MAAM,oBAAoB,EAAE,QAA0B;AACrD,SAAO,oBAAoB,KAAK,QAAQ,KAAK;;;;;;;CAQ9C,MAAM,yBAAyB,EAAE,WAAgC;AAChE,SAAO,2BAA2B,KAAK,QAAQ,QAAQ;;;;;;;CAQxD,MAAM,+BAA+B,EAAE,MAAM,WAA8C;AAC1F,SAAO,8BAA8B,KAAK,QAAQ,SAAS,KAAK;;CAMjE,gBAAgB,MAA0B;AACzC,MAAI,KAAK,MAAM,MAAM,MAAM,EAAE,SAAS,KAAK,KAAK,CAC/C,OAAM,IAAI,MAAM,QAAQ,KAAK,KAAK,2BAA2B;AAC9D,OAAK,MAAM,KAAK,KAAK;;;;;;CAOtB,iBACC,MAKC;EACD,MAAMA,UAAQ,KAAK,cAAc,EAAE;EACnC,MAAM,UAAU,KAAK;AAIrB,MAAI,CAACA,QAAM,SAAS,YAAY,aAAa,YAAY,UACxD,OAAM,IAAI,MAAM,8BAA8B,OAAO;AAGtD,UAAQ,MAAR;GACC,KAAK,yBACJ,QAAOA,QAAM,SAAS,wBAAwB;GAC/C,KAAK,uBACJ,QAAOA,QAAM,SAAS,qBAAqB;GAC5C,KAAK,6BACJ,QAAOA,QAAM,SAAS,4BAA4B;GACnD,KAAK,0BACJ,QAAOA,QAAM,SAAS,yBAAyB"}