diff --git a/docs/learn/smart-contract-developers/create-nft-collection.md b/docs/learn/smart-contract-developers/create-nft-collection.md index 8e4ffd3ca4..af2c08d459 100644 --- a/docs/learn/smart-contract-developers/create-nft-collection.md +++ b/docs/learn/smart-contract-developers/create-nft-collection.md @@ -8,13 +8,7 @@ import TabItem from '@theme/TabItem'; # Create an NFT Collection Using LSP8 -This tutorial will explore how to create a collection of unique [digital assets](../../standards/tokens/LSP8-Identifiable-Digital-Asset.md). - -:::info - -⌨️ The full code of this example can be found in the 👾 [lukso-hardhat-template](https://github.com/CJ42/LUKSO-Hardhat-template). - -::: +This tutorial explains how to create a collection of unique Digital Assets based on the [LSP8-Identifiable-Digital-Asset](../../standards/tokens/LSP8-Identifiable-Digital-Asset.md) standard. :::note @@ -22,33 +16,20 @@ This guide builds on top of a Hardhat project using TypeScript as described in t ::: -## Setup +:::info -Make sure you have the following dependencies installed: +⌨️ The full code of this example can be found in the 👾 [LUKSO-Hardhat-template](https://github.com/CJ42/LUKSO-Hardhat-template) repository. - - - -```shell -npm install @lukso/lsp-smart-contracts -``` -Install hardhat-web3: -```shell -npm install --save-dev @nomiclabs/hardhat-web3 'web3@^1.0.0-beta.36' -``` +::: - +## Setup - +To create your custom contract based on the [LUKSO smart contracts](../../contracts/introduction.md), you will need the [`@lukso/lsp-smart-contracts`](../../tools/lsp-smart-contracts/getting-started.md) library. Go ahead and add it to your project: ```shell -npm install ethers @lukso/lsp-smart-contracts +npm install @lukso/lsp-smart-contracts ``` - - - - ## Create the Smart Contracts When creating smart contracts representing digital assets on LUKSO, you will need to specify the token type and data keys for the 📄 [LSP4 Digital Asset Metadata](../../standards/tokens/LSP4-Digital-Asset-Metadata) that will be stored in the 🗂️ [ERC725Y](../../standards/lsp-background/erc725.md#erc725y-generic-data-keyvalue-store) storage of the Digital Asset. There are three different token types: @@ -61,7 +42,7 @@ When creating smart contracts representing digital assets on LUKSO, you will nee // SPDX-License-Identifier: MIT pragma solidity ^0.8.4; -bytes32 constant _LSP4_TOKEN_TYPE_DATA_KEY = 0xe0261fa95db2eb3b5439bd033cda66d56b96f92f243a8228fd87550ed7bdfdb3; // kecca256 hash of the word `LSP4TokenType` +bytes32 constant _LSP4_TOKEN_TYPE_DATA_KEY = 0xe0261fa95db2eb3b5439bd033cda66d56b96f92f243a8228fd87550ed7bdfdb3; enum TokenType { TOKEN, @@ -70,6 +51,8 @@ enum TokenType { } ``` +The data key value `0xe026...` is the keccak256 hash of the word `LSP4TokenType` as defined by the [LSP2 - ERC725Y JSON Schema](../../standards/generic-standards/lsp2-json-schema.md#singleton) standard. + After defining the type of the asset and its 🗂️ [ERC725 data key](../../standards/lsp-background/erc725.md#erc725y-generic-data-keyvalue-store) you can create a custom 🌄 [LSP8 Identfiable Digital Asset Collection](../../standards/tokens/LSP8-Identifiable-Digital-Asset.md) that extends [LSP8Mintable](../../contracts/contracts/LSP8IdentifiableDigitalAsset/presets/LSP8Mintable.md) so that new assets can be created within the smart contract. ```solidity title="contracts/Example3/BasicNFTCollection.sol" @@ -106,14 +89,15 @@ contract BasicNFTCollection is LSP8Mintable { } ``` -Next you define the deployment script. +## Deploy the Smart Contract - - +The contract is ready, it's time to deploy it. You can easily do it with hardhat deployment script. + ```js title="scripts/deploy.ts" import { ethers } from "hardhat"; + import {BasicNFTCollection, BasicNFTCollection__factory} from "../typechain-types"; async function deployLSP8Collection() { @@ -124,7 +108,7 @@ async function deployLSP8Collection() { "NFT Collection Name", // collection name "NFT", // collection symbol deployer.address - ); + ); const nftCollectionAddress = await nftCollection.getAddress() console.log("NFT Collection deployed to:", nftCollectionAddress) console.log("Check the block explorer to see the deployed contract") @@ -134,53 +118,33 @@ deployLSP8Collection().catch((error) => { console.error(error); process.exitCode = 1; }); - ``` - - - -Add the following to your `hardhat.config.ts`: +If you get issues related to `typechain-types`, you need to generate the types with: -```js -import '@nomiclabs/hardhat-web3'; +``` +npx hardhat typechain ``` -Write your deployment script: - -```js - -import { ethers, web3 } from "hardhat"; -import {BasicNFTCollection, BasicNFTCollection__factory} from "../typechain-types"; + -async function deployLSP8Collection() { - const accounts = await web3.eth.getAccounts(); - const deployer = await ethers.getSigner(accounts[0]) +Finally, run the deploy script: - const nftCollection: BasicNFTCollection = await new BasicNFTCollection__factory(deployer).deploy( - "NFT Collection Name", // collection name - "NFT", // collection symbol - deployer.address - ); +```sh +npx hardhat run --network luksoTestnet scripts/deploy.ts +``` - const nftCollectionAddress = await nftCollection.getAddress() - console.log("NFT Collection deployed to:", nftCollectionAddress) - console.log("Check the block explorer to see the deployed contract") -} +:::tip -deployLSP8Collection().catch((error) => { - console.error(error); - process.exitCode = 1; -}); +The [Create a deploy script](./create-lsp7-token#create-a-deploy-script.md) section of the Create LSP7 Token guide gives more details and information about how to deploy the contracts. -``` +::: - - +## View your NFT Collection -## Check Your NFT Collection +You can now use the contract address to check the deployment on the [testnet execution block explorer](https://explorer.execution.testnet.lukso.network/) -You can now check out your NFT collection on the [execution block explorer](https://explorer.execution.testnet.lukso.network/) using the address output to the web console during deployment. + ## References diff --git a/docs/learn/smart-contract-developers/getting-started.md b/docs/learn/smart-contract-developers/getting-started.md index 8c5e3ca53e..2e1e6fe738 100644 --- a/docs/learn/smart-contract-developers/getting-started.md +++ b/docs/learn/smart-contract-developers/getting-started.md @@ -10,8 +10,7 @@ Smart contract developer, welcome to the LUKSO documentation! The LUKSO ecosyste As LUKSO is an EVM-based Blockchain, all tools and tutorials for Ethereum also work well for LUKSO. The following tutorial will teach you how to: - set up a [Hardhat](https://hardhat.org/) installation (using TypeScript) -- install the [`@lukso/lsp-smart-contracts`](https://www.npmjs.com/package/@lukso/lsp-smart-contracts) package (using version 0.11.0-rc.1) -- create a basic [`LSP7DigitalAsset` (token)](../../standards/tokens/LSP7-Digital-Asset.md) contract +- install the [`@lukso/lsp-smart-contracts`](https://www.npmjs.com/package/@lukso/lsp-smart-contracts) package. - deploy it on [LUKSO Testnet](../../networks/testnet/parameters). If you need more low level information about our contracts, you can check the dedicated [contracts](../../contracts/introduction.md) section. @@ -22,7 +21,7 @@ Happy coding 🧙 The first thing to do is to [create a new Hardhat project](https://hardhat.org/hardhat-runner/docs/getting-started#quick-start) that will use TypeScript: -```bash title="Setup new hardhat project" +```bash mkdir lukso-app cd lukso-app npx hardhat @@ -38,7 +37,7 @@ To work in the best condition possible, we will install libraries that includes ```bash npm i -D dotenv -npm i -s @lukso/lsp-smart-contracts@0.11.0-rc.1 +npm i -s @lukso/lsp-smart-contracts@0.12.1 ``` Update your `package.json` with the following: @@ -72,6 +71,10 @@ UP_ADDR=0x... We now have a base Hardhat setup that we can use to develop and deploy our smart contracts. +## Get testnet LYXt + +To pay for the deployment fees, you need LYXt. You can request some from the [LUKSO Testnet faucet](https://faucet.testnet.lukso.network/) + ## Deploy your contracts on the LUKSO Testnet :::info @@ -80,7 +83,15 @@ By default, the deployment will be to your local network. If you want to deploy ::: -```js +```js title="hardhat.config.ts" +// ... +import { NetworkUserConfig } from 'hardhat/types'; + +import * as dotenv from 'dotenv'; +dotenv.config(); + +// ... + function getTestnetChainConfig(): NetworkUserConfig { const config: NetworkUserConfig = { url: 'https://rpc.testnet.lukso.network', @@ -93,11 +104,8 @@ function getTestnetChainConfig(): NetworkUserConfig { return config; } -``` - -Also add a definition for the testnet in the `HardhatUserConfig`: -```js +// Edit the default config object so it matches this one: const config: HardhatUserConfig = { solidity: { version: '0.8.19',