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

Add Create an NFT Collection using LSP8 tutorial #715

Merged
merged 15 commits into from
Nov 24, 2023
Merged
Changes from 1 commit
Commits
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
114 changes: 114 additions & 0 deletions docs/learn/smart-contract-developers/create-nft-collection.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
---
sidebar_label: '🗃 Create an NFT Collection'
sidebar_position: 4
---

# Create an NFT Collection Using LSP8

This tutorial goes over creating a collection of collectibles, where each item is unique and has its own design.
biancabuzea200 marked this conversation as resolved.
Show resolved Hide resolved

:::info
⌨️ The full code of this example can be found in 👾 [here](https://github.com/CJ42/LUKSO-Hardhat-template).
biancabuzea200 marked this conversation as resolved.
Show resolved Hide resolved
:::

## Setup

Make sure you have the following dependencies installed:

- [`ethers.js`](https://github.com/ethers-io/ethers.js/) (alternatively you can use [`web3.js`](https://github.com/web3/web3.js))
biancabuzea200 marked this conversation as resolved.
Show resolved Hide resolved
- [`@lukso/lsp-smart-contracts`](https://github.com/lukso-network/lsp-smart-contracts/)

biancabuzea200 marked this conversation as resolved.
Show resolved Hide resolved
## Create the Smart Contracts

When creating digital asset smart contracts on LUKSO, you will need to specify the token type and the following data keys in the ERC725Y storage. There are three types that you can define:
biancabuzea200 marked this conversation as resolved.
Show resolved Hide resolved

- 0 = Token
- 1 = NFT
- 2 = Collection
biancabuzea200 marked this conversation as resolved.
Show resolved Hide resolved

```solidity title="contracts/TokenTypes.sol"
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

bytes32 constant _LSP4_TOKEN_TYPE_DATA_KEY = 0xe0261fa95db2eb3b5439bd033cda66d56b96f92f243a8228fd87550ed7bdfdb3;
biancabuzea200 marked this conversation as resolved.
Show resolved Hide resolved

enum TokenType {
TOKEN,
NFT,
COLLECTION
}


```

You will also create a custom [LSP8 Identfiable Digital Asset Collection](../../standards/tokens/LSP8-Identifiable-Digital-Asset.md) that extends [LSP8Mintable](../../contracts/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.md).
biancabuzea200 marked this conversation as resolved.
Show resolved Hide resolved

```solidity title="contracts/MyNFTCollection.sol"
biancabuzea200 marked this conversation as resolved.
Show resolved Hide resolved

biancabuzea200 marked this conversation as resolved.
Show resolved Hide resolved
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

// modules
import {
LSP8Mintable
} from "@lukso/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.sol";

// constants
import {
_LSP8_TOKENID_TYPE_NUMBER
} from "@lukso/lsp-smart-contracts/contracts/LSP8IdentifiableDigitalAsset/LSP8Constants.sol";
import {_LSP4_TOKEN_TYPE_DATA_KEY, TokenType} from "../TokenTypes.sol";

contract BasicNFTCollection is LSP8Mintable {
constructor(
string memory nftCollectionName,
string memory nftCollectionSymbol,
address contractOwner
)
LSP8Mintable(
nftCollectionName, // NFT collection name
nftCollectionSymbol, // NFT collection symbol
contractOwner, // owner of the NFT contract (the address that controls it, sets metadata, can transfer the ownership of the contract)
_LSP8_TOKENID_TYPE_NUMBER // type of NFT/ tokenIds
)
{
// set token type
_setData(_LSP4_TOKEN_TYPE_DATA_KEY, abi.encode(TokenType.COLLECTION));
}
}
```

## Deploy our NFT Collection Contract on the LUKSO Testnet
biancabuzea200 marked this conversation as resolved.
Show resolved Hide resolved

biancabuzea200 marked this conversation as resolved.
Show resolved Hide resolved
```js
biancabuzea200 marked this conversation as resolved.
Show resolved Hide resolved
import { ethers } from "hardhat";

import {BasicNFTCollection, BasicNFTCollection__factory} from "../typechain-types";

async function deployLSP8Collection() {
const accounts = await ethers.getSigners();
const deployer = accounts[0];

const nftCollection: BasicNFTCollection = await new BasicNFTCollection__factory(deployer).deploy(
"NFT Collection Name", // collection name
"NFT", // collection symbol
deployer.address
);

}

deployLSP8Collection().catch((error) => {
console.error(error);
process.exitCode = 1;
});


```

## Congratulations 🥳

You have deployed your first LSP8 NFT Collection on the LUKSO Testnet.
biancabuzea200 marked this conversation as resolved.
Show resolved Hide resolved
biancabuzea200 marked this conversation as resolved.
Show resolved Hide resolved

## References

- [BuildUP #2 | Create an NFT Collection using LSP7 or LSP8 (YouTube)](https://www.youtube.com/watch?v=DMpeMswK12w)