> For the complete documentation index, see [llms.txt](https://docs.bukprotocol.io/buk-protocol-v2/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.bukprotocol.io/buk-protocol-v2/buk-protocol-smart-contracts/buk-marketplace.md).

# BUK Marketplace

## BUK Marketplace Contract

The `Marketplace` contract is a Solidity smart contract designed for managing the listing, delisting, buying, and other marketplace functionalities for BUK Protocol NFTs.

### Overview

The contract is designed with the following key components:

* **BUK Protocol**: Address of the BUK Protocol contract.
* **BUK NFTs Contract**: Address of the BUK NFTs contract.
* **Stable Token**: ERC20 token used for transactions in the marketplace.
* **Listed NFTs**: Mapping of listed bookings for sale.
* **Roles**: Constants for roles like ADMIN and BUK\_PROTOCOL.
* **Pausable:** Pausable **c**ontrols for contract

### Features

* **NFT Listing**: Allows users to list their NFTs for sale.
* **NFT Delisting**: Allows users to delist their NFTs.
* **NFT Buying**: Enables users to buy listed NFTs.
* **Role-based Access**: Different functionalities accessible by admin, BUK Protocol, and NFT owners.
* **Stable Token Transactions**: Uses a stable token for transactions in the marketplace.
* **Pausable :** Controls contract pause and unpause functions

### Functions

#### Public and External Functions:

* **pause**: To pause contract, only admin.
* **unpause**: To pause contract, only admin.
* **createListing**: List a booking/room NFT for sale.
* **deleteListing**: Delete a listing of a booking/room NFT.
* **relist**: Update the price and status for a listed NFT.
* **buyAsset:** Buy a listed room/booking NFT.
* **buyAssetBatch**: Buy a listed room/booking NFT in batch.
* **setBukProtocol**: Set a new BUK Protocol address.
* **setBukNFT**: Set a new BUK NFT address.
* **setStableToken**: Set a new stable token address.
* **getStableToken**: Get the address of the stable token.
* **getBukProtocol**: Get the current BUK Protocol address.
* **getBukNFT**: Get the current BUK NFT address.
* **getListingDetails**: Provide listing details of a booking.
* **isAssetListed**: Check if a booking/NFT is listed.

#### Private Functions:

* **\\\_setBukNFT**: Set a new BUK NFT address.
* **\\\_setBukProtocol**: Set a new BUK Protocol address.
* **\\\_setStableToken**: Set a new stable token address.
* **\\\_buy**: Safe transfer NFT to buyer and transfer the price to the owner.

### Events

* **AssetBought**: Emitted when a room/booking NFT is bought.
* **ListingCreated**: Emitted when a room/booking NFT is listed for sale.
* **Relisted**: Emitted when a booking/room NFT is relisted with a new price.
* **DeletedListing**: Emitted when a booking/room listing is deleted.
* **BukProtocolSet**: Emitted when a new BUK Protocol address is set.
* **BukNFTSet**: Emitted when a new BUK NFT address is set.
* **StableTokenSet**: Emitted when a new stable token address is set.

### Interface: IMarketplace

The `IMarketplace` interface provides a blueprint for the main `Marketplace` contract. It defines the essential functions, events, and data structures that the main contract should implement.

#### Key Components:

* **ListingDetails**: Struct to define the booking/room listing details.
* **ListingStatus**: Enum for listing statuses.
* **Events**: Various events like `dAssetBought`, `ListingCreated`, `Relisted`, etc.
* **Functions**: Functions like `createListing`, `delist`, `deleteListing`, `relist`, etc.

### License

This project is licensed under the MIT License.
