Hardhat: Creating an NFT Contract using Hardhat and Setting NFT Metadata using IPFS on Filebase
Learn how to create an NFT contract using Hardhat and set the NFT metadata using IPFS on Filebase.
What is Hardhat?
Hardhat is a local Ethereum network designed for development and deployment of smart contracts. Hardhat allows you to deploy and run tests using Solidity and replicate Ethereum network environments without using real cryptocurrency or paying gas fees.
What is Metadata?
Metadata is simply data that provides additional data about other data. Metadata of an object stored on Filebase typically includes the owner’s account email, size, ETag, object key or name, time and date last modified, and if the object is stored on an IPFS bucket, the IPFS CID is included in the object’s metadata.
In this guide, we’ll use Hardhat to create a test environment for creating a smart contract, then deploy and mint that contract to be used with an NFT token. Lastly, we’ll edit the contract to include metadata when we mint NFTs, and in this metadata we’ll include an image URL that uses the IPFS CID that we get from uploading an image to a Filebase IPFS bucket.
1. First, we need an image to use as an NFT. We’ll start by uploading an image to Filebase for us to use.
To do this, navigate to console.filebase.com. If you don’t have an account already, sign up, then log in.
2. Select ‘Buckets’ from the left side bar menu, or navigate to console.filebase.com/buckets.
Select ‘Create Bucket’ in the top right corner to create a new bucket for your NFTs.
3. Enter a bucket name and choose the IPFS storage network to create the bucket.
Bucket names must be unique across all Filebase users, be between 3 and 63 characters long, and can contain only lowercase characters, numbers, and dashes.
4. Next, select the bucket from your list of buckets, then select ‘Upload’ in the top right corner to upload an image file.
5. Select an image to be uploaded.
Once uploaded, it will be listed in the bucket.
6. Click on your uploaded object to display the metadata for the object.
Take note of the IPFS CID. We will reference this later.
7. Open a command line interface and create a new directory for your project with the commands:
mkdir nft-tutorial
cd nft-tutorial
8. Initialize your npm configuration if you have not previously done so with the command:
npm init
9. Install npm dependencies for this project with the commands:
npm install --save-dev hardhat
npm install --save-dev @nomiclabs/hardhat-ethers
npm install --save-dev @nomiclabs/hardhat-etherscan
npm install @openzeppelin/contracts
npm install dotenv --save
npm install --save-dev ethers@^5.0.0
npm install --save-dev node-fetch@2
10. Next, initialize Hardhat with the command:
npx hardhat
11. Create two new directories for contracts and scripts with the commands:
mkdir contracts
mkdir scripts
12. Open your preferred IDE and create a new file inside the contracts directory.
Name this file NFT.sol.
Enter the following content to the new file:
14. From the Alchemy dashboard, we need to create an app.
Select the ‘Create App’ button to get started.
15. Create a new app.
For our example, we called our app NFTs. Set the environment to ‘Staging’, the chain to ‘Ethereum’, and the network to ‘Ropsten’.
16. Next, we need an Ethereum wallet.
For this, we’ll need a Metamask account. You can sign up for one for free here. For additional information on how Ethereum transactions work, check out the Ethereum foundation’s information page here.
17. Once you have a Metamask account, change the network to the ‘Ropsten Test Network’ in the top right corner.
This is so we aren’t dealing with actual currency.
18. Next we’ll need some test currency in our wallet to cover the gas fees for the contract creation.
To do this, we’ll need to go to the Ropsten faucet, enter our wallet address, and click ‘Send Ropsten Eth’.
19. Then, create a file called .env
and add your Alchemy API URL and Metamask private key to this file.
.env
and add your Alchemy API URL and Metamask private key to this file.This file must be called .env, otherwise it will not work as expected.
For instructions on getting your Metamask private key, see here.
For instructions on how to get your Alchemy API URL, see here.
The format of the .env
file is as follows:
ALCHEMY_KEY = "alchemy-api-key"
ACCOUNT_PRIVATE_KEY = "private-key"
20. Next, update the hardhat.config.js
file with the following content:
hardhat.config.js
file with the following content:21. Now let’s compile the contract with the command:
npx hardhat compile
22. Now that the contract is compiled, we need to deploy it.
To do this, we’ll need to create a file in the scripts directory called deploy.js
. Enter the following content in this new file:
23. We can now deploy the contract with the following command:
npx hardhat run scripts/deploy.js --network rinkeby
Take note of the value that gets returned. This is your contract address, we’ll reference this later. You’ve successfully deployed your contract! Now let’s move onto minting our new contract.
24. Edit the existing deploy.js
script so it reflects the following:
deploy.js
script so it reflects the following:25. We also need to create a new script in our scripts directory called helpers.js
.
helpers.js
.In this script, enter the following content:
26. We also need to edit our hardhat.config.js
configuration file to reflect the newly defined tasks we created in the scripts above.
hardhat.config.js
configuration file to reflect the newly defined tasks we created in the scripts above.Edit your hardhat.confg.js
file to reflect the following configuration:
27. Now let’s add a minting task. Create a new script in the scripts directory called mint.js
and enter the following content to create your minting task:
mint.js
and enter the following content to create your minting task:28. Now we need to edit our .env
file to reflect our NFT contract address that we took note of when we deployed our contract.
.env
file to reflect our NFT contract address that we took note of when we deployed our contract.Edit your .env
file so it resembles the following:
ALCHEMY_KEY = "alchemy-api-key"
ACCOUNT_PRIVATE_KEY = "private-key"
NETWORK="ropsten"
NFT_CONTRACT_ADDRESS="nft-contract-address"
29. Let’s edit our helpers.js
script to include a helper function called getContract()
to read the new environment variable we just added to our .env
file.
helpers.js
script to include a helper function called getContract()
to read the new environment variable we just added to our .env
file.Edit your helpers.js
script so it looks like the following:
We also need to edit our hardhat.config.js configuration file again so that our new mint.js script is included:
30. Let’s mint our NFT now!
Use the following command with your NFT contract address to mint your deployed contract:
npx hardhat mint --address [NFT-CONTRACT-ADDRESS]
31. Lastly, let’s add some metadata to our NFTs.
This includes the name, description, and image that we uploaded to our IPFS Filebase bucket in the beginning of this guide. To do this, we’ll need to edit our NFT.sol
contract to resemble the following:
32. Then, create a metadata file for our NFT.
We’ll call this file 1, which does not require a file extension. In this file, paste the following content:
Edit the values in this file to reflect your desired configuration. Replace the name, description, and IPFS-CID values. The IPFS CID value is the value we took note of after uploading our image file to our Filebase bucket at the start of this guide.
You will need to upload this metadata file to your Filebase IPFS bucket in the same way that we used to upload our image file to our Filebase bucket. Copy the IPFS CID for the metadata file once uploaded to Filebase.
33. Now we need to edit our mint.js
script to include a function that sets this metadata.
mint.js
script to include a function that sets this metadata.Edit your mint.js
file to reflect the following:
34. Finally, we’re ready to put it all together. Let’s start by compiling our project:
npx hardhat compile
Then deploy our contract:
npx hardhat deploy
Then set your NFT_CONTRACT_ADDRESS
env variable in your .env
file. Next, set your metadata file:
npx hardhat set-base-token-uri --base-url "https://METADATA-IPFS-CID.ipfs.dweb.link"
Replace the METADATA-IPFS-CID
value with the IPFS CID you copied after uploading your metadata file to your IPFS Filebase bucket.
Then mint your contract:
npx hardhat mint --address [NFT-CONTRACT-ADDRESS]
Then lastly, retrieve your NFT token and it’s metadata:
npx hardhat token-uri --token-id 1
From here, you can move this configuration to a live network such as the Ethereum network by simply creating a new Alchemy app on the Ethereum network and updating your .env
file with the new Alchemy API key and changing the network value to ethereum
instead of rinkeby
.
Keep in mind that once you move to the Ethereum network, you’ll be working with real cryptocurrency and you’ll be charged gas fees for transactions.
Last updated