Kiosk SDK
This package is still in active development. Use at your own risk.
This Kiosk SDK library provides different utilities to interact/create/manage a
Kiosk.
Installation
To install, add @mysten/kiosk
package to your project
npm i @mysten/kiosk
You can also use your preferred package manager, such as yarn or pnpm.
Examples
Here are some indicative examples on how to use the kiosk SDK.
Find the kiosks owned by an address
import { getOwnedKiosks } from '@mysten/kiosk';
import { SuiClient } from '@mysten/sui.js/client';
const client = new SuiClient(
url: 'https://fullnode.testnet.sui.io:443',
);
const getUserKiosks = async () => {
const address = `0xAddress`;
const { data } = await getOwnedKiosks(client, address);
console.log(data);
};
Getting the listings & items by the kiosk's ID
import { fetchKiosk } from '@mysten/kiosk';
import { SuiClient } from '@mysten/sui.js/client';
const client = new SuiClient(
url: 'https://fullnode.testnet.sui.io:443',
);
const getKiosk = async () => {
const kioskAddress = `0xSomeKioskAddress`;
const { data } = await fetchKiosk(
client,
kioskAddress,
{},
{ withListingPrices: true, withKioskFields: true },
);
console.log(data);
};
Purchasing an item (currently supports royalty rule, kiosk_lock_rule, no rules, (combination works too))
import { queryTransferPolicy, purchaseAndResolvePolicies, place, testnetEnvironment } from '@mysten/kiosk';
import { SuiClient } from '@mysten/sui.js/client';
const client = new SuiClient(
url: 'https://fullnode.testnet.sui.io:443',
);
const kioskId = `0xSomeKioskAddress`;
const item = {
isLocked: false,
objectId: "0xb892d61a9992a10c9453efcdbd14ca9720d7dc1000a2048224209c9e544ed223"
type: "0x52852c4ba80040395b259c641e70b702426a58990ff73cecf5afd31954429090::test::TestItem",
listing: {
isExclusive: false,
listingId: "0x368b512ff2514dbea814f26ec9a3d41198c00e8ed778099961e9ed22a9f0032b",
price: "20000000000"
}
}
const ownedKiosk = `0xMyKioskAddress`;
const ownedKioskCap = `0xMyKioskOwnerCap`;
const purchaseItem = async (item, kioskId) => {
const policies = await queryTransferPolicy(client, item.type);
const policyId = policy[0]?.id;
const tx = new TransactionBlock();
const extraParams = {
ownedKiosk,
ownedKioskCap
}
const environment = testnetEnvironment;
const result = purchaseAndResolvePolicies(tx, item.type, item.listing.price, kioskId, item.objectId, policy[0], environment, extraParams);
if(result.canTransfer) place(tx, item.type, ownedKiosk, ownedKioskCap , result.item);
};
Create a kiosk, share it and get transfer the `kioskOwnerCap` to the wallet's address
import { createKioskAndShare } from '@mysten/kiosk';
import { TransactionBlock } from '@mysten/sui.js/transactions';
const createKiosk = async () => {
const accountAddress = '0xSomeSuiAddress';
const tx = new TransactionBlock();
const kiosk_cap = createKioskAndShare(tx);
tx.transferObjects([kiosk_cap], tx.pure(accountAddress, 'address'));
};
Place an item and list it for sale in the kiosk
import { placeAndList } from '@mysten/kiosk';
import { TransactionBlock } from '@mysten/sui.js/transactions';
const placeAndListToKiosk = async () => {
const kiosk = 'SomeKioskId';
const kioskCap = 'KioskCapObjectId';
const itemType = '0xItemAddr::some:ItemType';
const item = 'SomeItemId';
const price = '100000';
const tx = new TransactionBlock();
placeAndList(tx, itemType, kiosk, kioskCap, item, price);
};
Withdraw profits from your kiosk
import { withdrawFromKiosk } from '@mysten/kiosk';
import { TransactionBlock } from '@mysten/sui.js/transactions';
const withdraw = async () => {
const kiosk = 'SomeKioskId';
const kioskCap = 'KioskCapObjectId';
const address = '0xSomeAddressThatReceivesTheFunds';
const amount = '100000';
const tx = new TransactionBlock();
withdrawFromKiosk(tx, kiosk, kioskCap, amount);
tx.transferObjects([coin], tx.pure(address, 'address'));
};
Create a Transfer Policy for a Type
You can create a TransferPolicy only for packages for which you own the publisher
object.
As a best practice, you should use a single Transfer policy per type (T). If you use more than one
policy for a type, and the rules for each differ, anyone that meets the conditions for any of the
attached policies can purchase an asset from a kiosk. You can't specify which policy applies to a
specific asset for the type when there is more than one policy attached. When someone meets the
conditions that are easiest to meet, they are allowed to purchase and transfer the asset.
Before you create a transfer policy, you can use the queryTransferpolicy
function to check the
transfer policy associated with a type. This is similar to the purchaseAndResolvePolicies
example
above.
import { createTransferPolicy } from '@mysten/kiosk';
import { TransactionBlock } from '@mysten/sui.js';
const createPolicyForType = async () => {
const type = 'SomePackageId::type::MyType';
const publisher = 'publisherObjectId';
const address = 'AddressToReceiveTheCap';
const tx = new TransactionBlock();
let transferPolicyCap = createTransferPolicy(tx, type, publisher);
tx.transferObjects([transferPolicyCap], tx.pure(address, 'address'));
};
Attach Royalty and Lock rules to a Transfer policy
import {
createTransferPolicy,
attachKioskLockRule,
attachRoyaltyRule,
testnetEnvironment,
percentageToBasisPoints,
} from '@mysten/kiosk';
import { TransactionBlock } from '@mysten/sui.js';
const attachStrongRoyalties = async () => {
const type = 'SomePackageId::type::MyType';
const policyId = 'policyObjectId';
const transferPolicyCap = 'transferPolicyCapId';
const percentage = 2.55;
const minAmount = 100_000_000;
const enviroment = testnetEnvironment;
const tx = new TransactionBlock();
attachKioskLockRule(tx, type, policyId, policyCapId, enviroment);
attachRoyaltyRule(
tx,
type,
policyId,
policyCapId,
percentageToBasisPoints(percentage),
minAmount,
enviroment,
);
};