Marketplace Extension
The Marketplace Extension for IOTA Kiosk is a customizable framework that extends the functionality of the IOTA Kiosk by enabling efficient asset trading with integrated royalty management and pricing mechanism.
Kiosk owners can list items for sale by setting prices, and enforce royalties, ensuring creators receive a percentage of each sale. Buyers can securely purchase items, with the extension validating payments and handling royalties automatically. All transactions are governed by robust transfer policies, ensuring security and compliance.
Marketplace Extension Usage
Modules
The marketplace_extension.move
module provides a straightforward implementation of a marketplace extension. To use it, follow the
steps outlined below.
The clothing_store.move
module contains mocked item data for
use within the marketplace.
The rental_extension.move
module adds the functionality to enable item rentals.
How To Use the Marketplace
1. Install the IOTA CLI and Connect to the Network
The first thing you'll need to do is install the IOTA CLI, connect to an IOTA network and get some test tokens to pay for gas.
2. Install Kiosk
You can install the Kiosk by creating a Kiosk
object, which will also create its OwnerCap
, and then transferring
them to the caller.
Run the following command to install the Kiosk module:
iota client call \
--package 0x2 \
--module kiosk \
--function default
After publishing, export the following variables:
KIOSK_ID
: The ID of the installed Kiosk object.KIOSK_CAP_ID
: The ID of the installed Kiosk's owner cap
3. Publish nft_marketplace
package
3.1(Optional) Publish Kiosk rules modules if these are not present in the network you are using
You can publish Kiosk rules modules(package) using the following command:
iota client publish $IOTA_REPO_DIR/kiosk
After publishing, export the following variable:
RULES_PACKAGE_ID
: The ID of the rules package.
3.2 Publish the nft_marketplace
Package
iota client publish $IOTA_REPO_DIR/docs/examples/move/nft_marketplace
After publishing, export the following variables:
MARKETPLACE_PACKAGE_ID
: The ID of the whole marketplace package.MARKETPLACE_PUBLISHER_ID
: The ID of the publisher object created during marketplace package publishing."
4. Create a Clothing Store Item
Next, you should use the functions in the clothing_store
module to create an item, for instance:
iota client call \
--package $MARKETPLACE_PACKAGE_ID \
--module clothing_store \
--function new_jeans
After creation, export the following variable:
CLOTHING_STORE_ITEM_ID
: The ID of the published item (in this case, Jeans).
5. Create a Transfer Policy
TransferPolicy
is a generic-shared object that acts as a central authority enforcing that everyone checks their
purchase is valid against the defined policy before the purchased item is transferred to the buyer. The object is
specified by concrete type:
The default
function creates a TransferPolicy
object and a TransferPolicyCap
, then transfers them to the caller.
The TransferPolicyCap
object serves as proof of ownership of the TransferPolicy
object.
A capability granting the owner permission to add/remove
rules, withdraw
, and destroy_and_withdraw
the TransferPolicy
.
You can set up a transfer policy for the created item using the following command:
iota client call \
--package 0x2 \
--module transfer_policy \
--function default \
--gas-budget 10000000 \
--args $MARKETPLACE_PUBLISHER_ID \
--type-args "$MARKETPLACE_PACKAGE_ID::clothing_store::Jeans"
After publishing, export the following variables:
ITEM_TRANS_POLICY
: The ID of the item transfer policy object.ITEM_TRANS_POLICY_CAP
: The ID of the item transfer policy object owner capability"
6. Install the Extension on the Kiosk
The install
function enables the installation of the Marketplace extension in a kiosk.
Under the hood, it invokes kiosk_extension::add
, which adds an extension to the Kiosk via a dynamic field.
You can install the marketplace extension on the created kiosk using the following command:
iota client call \
--package $MARKETPLACE_PACKAGE_ID \
--module marketplace_extension \
--function install \
--args $KIOSK_ID $KIOSK_CAP_ID
7. Set a Price for the Item
You can use the set_price
function to set the price for the item:
iota client call \
--package $MARKETPLACE_PACKAGE_ID \
--module marketplace_extension \
--function set_price \
--args $KIOSK_ID $KIOSK_CAP_ID $CLOTHING_STORE_ITEM_ID 50000 \
--type-args "$MARKETPLACE_PACKAGE_ID::clothing_store::Jeans"
8.(Optional) Set Royalties
Royalties are a percentage of the item's price or revenue paid to the owner for using or selling their asset.
You can use the set_royalties
function to set royalties for the item:
iota client call \
--package $MARKETPLACE_PACKAGE_ID \
--module marketplace_extension \
--function setup_royalties \
--args $ITEM_TRANS_POLICY $ITEM_TRANS_POLICY_CAP 5000 2000 \
--type-args "$MARKETPLACE_PACKAGE_ID::clothing_store::Jeans"
9. Buy an Item
9.1 Get the Item Price
You can use the following Programmable Transaction Block to call the
get_item_price
and assign it to an item_price
variable. In this case, the Jeans item:
iota client ptb \
--move-call $MARKETPLACE_PACKAGE_ID::marketplace_extension::get_item_price "<$MARKETPLACE_PACKAGE_ID::clothing_store::Jeans>" @$KIOSK_ID @$CLOTHING_STORE_ITEM_ID --assign item_price \
9.2(Optional) Calculate the Royalties For the Item
You can use the following move-call to get the royalties for any given product by calling the kiosk::royalty_rule::fee_amount
function
and assign it to a royalties_amount
variable. In this case, the Jeans item:
--move-call $RULES_PACKAGE_ID::royalty_rule::fee_amount "<$MARKETPLACE_PACKAGE_ID::clothing_store::Jeans>" @$ITEM_TRANS_POLICY item_price --assign royalties_amount \
9.3 Create a Payment Coin With a Specific Amount (Price + Optional Royalties)
You can use the following command to split your gas tokens to pay for the item's price and royalties:
--split-coins gas "[item_price, royalties_amount]" --assign payment_coins \
--merge-coins payment_coins.0 "[payment_coins.1]" \
9.4 Buy an Item Using payment_coins.0
You can use the following move-call to pay the owner the item's price. If the royalty rule is enabled, an additional royalty fee, calculated as a percentage of the initial item price, is also paid. Once both payments are completed, the item is ready for transfer to the buyer.
To purchase the item:
--move-call $MARKETPLACE_PACKAGE_ID::marketplace_extension::buy_item "<$MARKETPLACE_PACKAGE_ID::clothing_store::Jeans>" @$KIOSK_ID @$ITEM_TRANS_POLICY @$CLOTHING_STORE_ITEM_ID payment_coins.0 --assign purchased_item
9.5 Transfer an Item to the Buyer
Finally, you can set up the public_transfer to transfer the purchased item to the buyer:
--move-call 0x2::transfer::public_transfer "<$MARKETPLACE_PACKAGE_ID::clothing_store::Jeans>" purchased_item @<buyer address> \
You can combine all the previous steps into one purchase PTB request, including royalties, which should look like this:
iota client ptb \
--move-call $MARKETPLACE_PACKAGE_ID::marketplace_extension::get_item_price "<$MARKETPLACE_PACKAGE_ID::clothing_store::Jeans>" @$KIOSK_ID @$CLOTHING_STORE_ITEM_ID --assign item_price \
--move-call $RULES_PACKAGE_ID::royalty_rule::fee_amount "<$MARKETPLACE_PACKAGE_ID::clothing_store::Jeans>" @$ITEM_TRANS_POLICY item_price --assign royalties_amount \
--split-coins gas "[item_price, royalties_amount]" --assign payment_coins \
--merge-coins payment_coins.0 "[payment_coins.1]" \
--move-call $MARKETPLACE_PACKAGE_ID::marketplace_extension::buy_item "<$MARKETPLACE_PACKAGE_ID::clothing_store::Jeans>" @$KIOSK_ID @$ITEM_TRANS_POLICY @$CLOTHING_STORE_ITEM_ID payment_coins.0 --assign purchased_item \
--move-call 0x2::transfer::public_transfer "<$MARKETPLACE_PACKAGE_ID::clothing_store::Jeans>" purchased_item @<buyer address>