Minting ERC 721 Tokens with FuseBox Web SDK - Smart Contract
In this tutorial, we'll explore how to use the FuseBox Web SDK to build a Next.js application that interacts with the Fuse blockchain. We'll cover connecting to MetaMask, initializing a Smart Contract Wallet, and minting NFT Tokens on the Fuse blockchain.
To build an NFT DApp with Hardhat and a frontend powered by Account Abstraction on the Fuse blockchain, we'll create a simple NFT smart contract using Hardhat and integrate it with the Fuse web SDK for account abstraction. This guide is divided into 2 parts: Part 1: The NFT Smart Contract Part 2: The User Interface.
Part 1: The NFT Smart Contract
1. Initialize Hardhat Project
Create a new directory for your project and initialize a Hardhat project.
mkdir NFTDApp
cd NFTDApp
npm init -y
npm install --save-dev hardhat
npx hardhat
Follow the prompts to set up your Hardhat project.
2. Install Required Packages
Install the necessary packages for the project.
npm install ethers hardhat-waffle @nomiclabs/hardhat-ethers
3. Smart Contract Development
Create a simple NFT contract using Hardhat. Save the file as NFTContract.sol
in the contracts
directory. This particular NFT allow an EOA to mint no more than 5 times each.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts@4.0.0/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts@4.0.0/access/Ownable.sol";
contract LimitedMintERC721 is ERC721, Ownable {
// Counter to keep track of the number of NFTs minted by each address
mapping(address => uint256) private _mintedCount;
// Maximum number of NFTs that an address can mint
uint256 private _maxMintPerAddress = 5;
uint256 private _nextTokenId;
// Event triggered upon a successful minting
event Minted(address indexed to, uint256 tokenId);
// Constructor to initialize the ERC721 contract
constructor(address initialOwner)
ERC721("MyToken", "MTK")
Ownable()
{}
// Function to set the maximum mint limit per address
function setMaxMintPerAddress(uint256 maxMintPerAddress) external onlyOwner {
_maxMintPerAddress = maxMintPerAddress;
}
// Function to get the maximum mint limit per address
function getMaxMintPerAddress() external view returns (uint256) {
return _maxMintPerAddress;
}
// Function to mint a new NFT
function mint() external {
// Ensure the caller is not exceeding the mint limit
require(_mintedCount[msg.sender] < _maxMintPerAddress, "Exceeds mint limit");
// Mint the NFT
uint256 tokenId = _nextTokenId++;
_safeMint(msg.sender, tokenId);
// Increment mint count for the caller
_mintedCount[msg.sender]++;
// Emit the Minted event
emit Minted(msg.sender, tokenId);
}
}
4. Hardhat Configuration
Update the hardhat.config.js
file to include the required plugins.
// hardhat.config.js
require("@nomiclabs/hardhat-waffle");
module.exports = {
solidity: "0.8.0",
networks: {
fuse: {
url: `https://rpc.fuse.io`,
accounts: [`${PRIVATE_KEY}`],
gas: 2100000,
gasPrice: 8000000000,
saveDeployments: true,
},
},
};
5. Deploy the Smart Contract
Create a deployment script for the NFT contract. Save the file as scripts/deploy.js
.
// scripts/deploy.js
async function main() {
const NFTContract = await ethers.getContractFactory("NFTContract");
const nftContract = await NFTContract.deploy();
console.log("NFTContract deployed to:", nftContract.address);
}
main();
Deploy the smart contract to the Fuse network.
npx hardhat run scripts/deploy.js --network fuse