Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(docs/kiosk): update some Kiosk links, add more examples #4193

Merged
merged 25 commits into from
Dec 5, 2024
Merged
Show file tree
Hide file tree
Changes from 19 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
d9cc1d2
feat(move/examples): draft of kiosk nft marketplace using kiosk rules
Dkwcs Nov 20, 2024
e5b37b3
feat(move/examples/nft_marketplace): update buy function with royalti…
Dkwcs Nov 21, 2024
4b11522
feat(examples/move/nft_marketplace): highlighted the rental extension…
Dkwcs Nov 22, 2024
ac68331
readme updated
Dkwcs Nov 22, 2024
b6e5d88
fix(docs/kiosk): update some Kiosk links, add more examples
Dkwcs Nov 22, 2024
8c7d374
dprint
Dkwcs Nov 25, 2024
24f3516
update readme
Dkwcs Nov 25, 2024
17b6582
review comments fix, improving readme descroption, minor code refacto…
Dkwcs Nov 26, 2024
0eda47f
ETotalPriceOverflow check moved to list method from the rent
Dkwcs Nov 26, 2024
c140b10
Update docs/examples/move/nft_marketplace/sources/nft_marketplace.move
Dkwcs Nov 26, 2024
c056138
Minor code refactroing
Dkwcs Nov 26, 2024
79a6412
Minor fix
Dkwcs Nov 26, 2024
97dc111
Fix review comments, improvements of bying flow
Dkwcs Nov 27, 2024
2c859cf
Minor space fixes
Dkwcs Nov 27, 2024
eb830f7
Update docs/examples/move/nft_marketplace/sources/clothing_store.move
Dkwcs Nov 27, 2024
6535b5c
Update docs/examples/move/nft_marketplace/sources/nft_marketplace.move
Dkwcs Nov 27, 2024
4c8441c
Add tests for nft_marketplace package
Dkwcs Nov 28, 2024
340cb12
Add minor comments to the buy_item method
Dkwcs Nov 28, 2024
683415a
Merge branch 'sc-platform/Create-an-example-NFT-marketplace-using-the…
Dkwcs Nov 28, 2024
d4bb351
Minor link fix
Dkwcs Nov 28, 2024
88b4d52
Merge branch 'develop' into sc-platform/update-Kiosk-related-docs
Dkwcs Dec 5, 2024
dd6a94a
Merge remote-tracking branch 'origin/develop' into sc-platform/update…
Dkwcs Dec 5, 2024
86ffbcb
fix(docs): create marketplace extension doc page
Dkwcs Dec 5, 2024
1de7956
fix(docs): add short description for Marketplace Extension Usage
Dkwcs Dec 5, 2024
b6b0299
fix(docs): import readme instead of duplicate it
Dkwcs Dec 5, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions docs/content/developer/iota-101/nft/rent-nft.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -77,10 +77,10 @@ The rental smart contract utilizes th [Kiosk Apps](../../standards/kiosk-apps.md
Both lenders and borrowers must install a Kiosk extension to participate.
Additionally, the creator of the NFT type must create a rental policy and a `ProtectedTP` object to allow the extension to manage rentals while enforcing royalties.

## Move Module Details TODO UPDATE LINK
## Move Module Details

The NFT rental functionality is implemented in a single Move module: `nft_rental.move`.
You can find the source code in the [IOTA repository](https://github.com/iotaledger/iota/tree/main/examples/move/nft-rental/sources/nft_rental.move) under the `examples` directory. The code includes comments to help you understand the logic and structure.
You can find the source code in the [IOTA repository](https://github.com/iotaledger/iota/tree/develop/docs/examples/move/nft_marketplace/sources/rental_extension.move) under the `examples` directory. The code includes comments to help you understand the logic and structure.

### The `nft_rental` Module

Expand Down
2 changes: 2 additions & 0 deletions docs/content/developer/standards/kiosk-apps.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -259,5 +259,7 @@ txb.moveCall({
## Related links

- [NFT Rental](../iota-101/nft/rent-nft.mdx): An example implementation of the Kiosk Apps standard that enables renting NFTs.
- [NFT Rental Extension](https://github.com/iotaledger/iota/tree/develop/docs/examples/move/nft_marketplace/sources/rental_extension.move): An example implementation of the Kiosk Extension standard that enables renting NFTs.
- [Marketplace Extension](https://github.com/iotaledger/iota/tree/develop/docs/examples/move/nft_marketplace/sources/nft_marketplace.move): Move package that contains the source code(Kiosk extension) for the marketplace app.

<Quiz questions={questions} />
35 changes: 35 additions & 0 deletions docs/examples/move/nft_marketplace/Move.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
[package]
name = "nft_marketplace"
edition = "2024.beta"

[dependencies]
Iota = { local = "../../../../crates/iota-framework/packages/iota-framework" }
Kiosk = { local = "../../../../kiosk" }

# For remote import, use the `{ git = "...", subdir = "...", rev = "..." }`.
# Revision can be a branch, a tag, and a commit hash.
# MyRemotePackage = { git = "https://some.remote/host.git", subdir = "remote/path", rev = "main" }

# For local dependencies use `local = path`. Path is relative to the package root
# Local = { local = "../path/to" }

# To resolve a version conflict and force a specific version for dependency
# override use `override = true`
# Override = { local = "../conflicting/version", override = true }

[addresses]
nft_marketplace = "0x0"

# Named addresses will be accessible in Move as `@name`. They're also exported:
# for example, `std = "0x1"` is exported by the Standard Library.
# alice = "0xA11CE"

[dev-dependencies]
# The dev-dependencies section allows overriding dependencies for `--test` and
# `--dev` modes. You can introduce test-only dependencies here.
# Local = { local = "../path/to/dev-build" }

[dev-addresses]
# The dev-addresses section allows overwriting named addresses for the `--test`
# and `--dev` modes.
# alice = "0xB0B"
179 changes: 179 additions & 0 deletions docs/examples/move/nft_marketplace/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
# Marketplace Guide

The `marketplace_extension.move` module provides a straightforward implementation of a marketplace extension. To utilize it, follow the steps outlined below.
The `item_for_market.move` contains mocked item data for use within the marketplace.
The `rental_extension.move` is an extension adds functionality to enable item rentals.

## Steps to Use the Marketplace

### 1. Connect to the Network

Connect to the IOTA network (e.g., using a faucet to obtain tokens).

### 2. Install Kiosk

By installation, we mean creating a Kiosk object and an OwnerCap, then transferring them to the caller.
Run the following command to install the Kiosk module:

```bash
iota client call \
--package 0x2 \
--module kiosk \
--function default
```

### 3. Publish `nft_marketplace` package

#### 3.1(Optional) Publish Kiosk rules modules if these are not present in the network you are using

Publish Kiosk rules modules(package):

```bash
iota client publish iota/kiosk
```

After publishing, export the following variable:

- `RULES_PACKAGE_ID`: The ID of rules package.

#### 3.2 Publish marketplace extension

Publish the marketplace_extension.move module:

```bash
iota client publish iota/docs/examples/move/nft_marketplace
```

After publishing, export the following variables:

- `MARKETPLACE_PACKAGE_ID`: The ID of whole marketplace package.
- `MARKETPLACE_PUBLISHER_ID`: The ID of the publisher object created during marketplace package publishing."

### 4. Create an Clothing Store Item

Create an item, for instance:

```bash
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 acting as a central authority enforcing everyone to check their purchase is valid against the defined policy before the purchased item is transferred to the buyers. Object is specified by concrete type.
`default` function creates `TransferPolicy` object and an OwnerCap, then transferring them to the caller.

Set up a transfer policy for the created item using the command:

```bash
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 installation of the Marketplace extension in a kiosk.
Under the hood it invokes `kiosk_extension::add` that adds extension to the Kiosk via dynamic field.
Install the marketplace extension on the created kiosk using the command:

```bash
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

Set the price for the item:

```bash
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 the use or sale of their asset.

Set royalties for the item:

```bash
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:

```bash
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 rolyalties of the Item:

```bash
--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):

```bash
--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`:

Here, when we buy an item, we 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 transferring to the buyer.

To purchase the item:

```bash
--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:

```bash
--move-call 0x2::transfer::public_transfer "<$MARKETPLACE_PACKAGE_ID::clothing_store::Jeans>" purchased_item @<buyer address> \
```

The final purchase PTB request, including royalties, should look like this:

```bash
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>
```
60 changes: 60 additions & 0 deletions docs/examples/move/nft_marketplace/sources/clothing_store.move
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/// Module provides `mock` items for using them in marketplace and rental extensions.
#[allow(lint(self_transfer))]
module nft_marketplace::clothing_store {
use iota::package;
/// One Time Witness.
public struct CLOTHING_STORE has drop {}


fun init(otw: CLOTHING_STORE, ctx: &mut TxContext) {
package::claim_and_keep(otw, ctx)
}

public struct TShirt has key, store {
id: UID,
}

public struct Jacket has key, store {
id: UID,
}

public struct Shoes has key, store {
id: UID,
}

public struct Jeans has key, store {
id: UID,
}

public fun new_tshirt(ctx: &mut TxContext) {
let tshirt = TShirt {
id: object::new(ctx),
};

transfer::public_transfer(tshirt, ctx.sender());
}

public fun new_jeans(ctx: &mut TxContext) {
let jeans = Jeans {
id: object::new(ctx),
};

transfer::public_transfer(jeans, ctx.sender());
}

public fun new_shoes(ctx: &mut TxContext) {
let shoes = Shoes {
id: object::new(ctx),
};

transfer::public_transfer(shoes, ctx.sender());
}

public fun new_jacket(ctx: &mut TxContext) {
let jacket = Jacket {
id: object::new(ctx),
};

transfer::public_transfer(jacket, ctx.sender());
}
}
Loading
Loading