Bird
Raised Fist0
Blockchain / Solidityprogramming~30 mins

ERC-721 NFT standard in Blockchain / Solidity - Mini Project: Build & Apply

Choose your learning style10 modes available
Create a Simple ERC-721 NFT Contract
📖 Scenario: You want to create your own unique digital collectibles on the blockchain. These collectibles are called NFTs (Non-Fungible Tokens). The ERC-721 standard is a popular way to make NFTs that are one-of-a-kind.In this project, you will build a simple ERC-721 contract that lets you create and track unique tokens.
🎯 Goal: Build a basic ERC-721 smart contract that can mint unique NFTs with token IDs and names.
📋 What You'll Learn
Create a contract that inherits from OpenZeppelin's ERC721
Set the NFT collection name and symbol
Add a function to mint new NFTs with unique token IDs
Store and retrieve token metadata (like a name)
💡 Why This Matters
🌍 Real World
NFTs are used for digital art, collectibles, gaming items, and more. This project shows how to create unique tokens that represent ownership of digital items.
💼 Career
Understanding ERC-721 is essential for blockchain developers working on NFT marketplaces, games, or digital asset platforms.
Progress0 / 4 steps
1
Set up the ERC-721 contract
Write a Solidity contract named MyNFT that inherits from ERC721. Import @openzeppelin/contracts/token/ERC721/ERC721.sol. In the constructor, set the token name to "MyNFTCollection" and the symbol to "MNFT".
Blockchain / Solidity
Hint

Use import to bring in the ERC721 contract. Then create MyNFT that extends ERC721. The constructor calls the parent constructor with the name and symbol.

2
Add a counter for token IDs
Add a private uint256 variable called _tokenIdCounter initialized to 0 to keep track of the next token ID to mint.
Blockchain / Solidity
Hint

Declare a private variable _tokenIdCounter of type uint256 and set it to zero.

3
Create a minting function
Add a public function mintNFT that takes an address to and a string memory tokenName. Inside, increment _tokenIdCounter, mint a new token with the new ID to to, and store the tokenName in a mapping called _tokenNames keyed by token ID.
Blockchain / Solidity
Hint

Inside mintNFT, increase _tokenIdCounter, mint the token to to, and save the name in _tokenNames.

4
Add a function to get token name and test minting
Add a public view function getTokenName that takes uint256 tokenId and returns the stored token name from _tokenNames. Then, mint an NFT to your own address with the name "FirstNFT" and print the token name for token ID 1.
Blockchain / Solidity
Hint

Create getTokenName to return the name for a token ID. Minting and printing can be tested in your development environment.

Practice

(1/5)
1. What is the main purpose of the ERC-721 standard in blockchain?
easy
A. To define a standard for unique non-fungible tokens (NFTs)
B. To create fungible tokens like cryptocurrencies
C. To manage smart contract deployment
D. To encrypt blockchain transactions

Solution

  1. Step 1: Understand ERC-721's role

    ERC-721 is designed specifically for unique tokens, called NFTs, which are different from fungible tokens like cryptocurrencies.
  2. Step 2: Compare with other token standards

    ERC-20 is for fungible tokens, while ERC-721 is for unique, non-fungible tokens.
  3. Final Answer:

    To define a standard for unique non-fungible tokens (NFTs) -> Option A
  4. Quick Check:

    ERC-721 = Unique NFTs [OK]
Hint: ERC-721 is for unique tokens, not fungible ones [OK]
Common Mistakes:
  • Confusing ERC-721 with ERC-20 fungible tokens
  • Thinking ERC-721 manages encryption
  • Assuming ERC-721 handles contract deployment
2. Which of the following is the correct function signature to get the owner of an NFT in ERC-721?
easy
A. function getOwner(address token) public returns (uint256);
B. function ownerOf(uint256 tokenId) external view returns (address);
C. function owner(uint256 id) external returns (address);
D. function tokenOwner(uint256 tokenId) public view returns (string);

Solution

  1. Step 1: Recall ERC-721 standard function names

    The standard defines ownerOf with a uint256 tokenId parameter returning an address.
  2. Step 2: Check function visibility and return type

    The function is external view and returns an address, matching function ownerOf(uint256 tokenId) external view returns (address); exactly.
  3. Final Answer:

    function ownerOf(uint256 tokenId) external view returns (address); -> Option B
  4. Quick Check:

    ownerOf(tokenId) returns owner address [OK]
Hint: Look for 'ownerOf' with tokenId returning address [OK]
Common Mistakes:
  • Using wrong function names like getOwner or tokenOwner
  • Incorrect return types like string instead of address
  • Missing view or external keywords
3. Given the following Solidity snippet, what will be the output of ownerOf(1) if token 1 is owned by address 0xABC...?
contract MyNFT is ERC721 {
    mapping(uint256 => address) private _owners;
    
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _owners[tokenId];
    }

    function mint(address to, uint256 tokenId) public {
        _owners[tokenId] = to;
    }
}
medium
A. 0x0000000000000000000000000000000000000000
B. Compilation error
C. 0xABC...
D. Function does not return anything

Solution

  1. Step 1: Understand the mint function effect

    The mint function sets the owner of tokenId to the given address in the _owners mapping.
  2. Step 2: Check ownerOf return value

    The ownerOf function returns the address stored in _owners[tokenId]. If token 1 was minted to 0xABC..., it returns that address.
  3. Final Answer:

    0xABC... -> Option C
  4. Quick Check:

    ownerOf(1) = minted owner address [OK]
Hint: ownerOf returns stored owner address from mapping [OK]
Common Mistakes:
  • Assuming default zero address if not minted
  • Thinking function has no return
  • Confusing compilation errors with runtime behavior
4. Identify the error in this ERC-721 transfer function snippet:
function transferFrom(address from, address to, uint256 tokenId) public override {
    require(ownerOf(tokenId) == msg.sender, "Not owner");
    _owners[tokenId] = to;
}
medium
A. The require should check if msg.sender is approved or owner, not just owner
B. The function should not override transferFrom
C. The _owners mapping should not be updated
D. The function is missing a return statement

Solution

  1. Step 1: Check transferFrom permission logic

    ERC-721 requires that the caller is either the owner or approved to transfer the token, not just the owner.
  2. Step 2: Identify missing approval check

    The code only checks if msg.sender is the owner, missing approval checks, which can block valid transfers.
  3. Final Answer:

    The require should check if msg.sender is approved or owner, not just owner -> Option A
  4. Quick Check:

    transferFrom needs owner or approved check [OK]
Hint: Check both owner and approved in transferFrom require [OK]
Common Mistakes:
  • Only checking owner without approval
  • Forgetting to override transferFrom
  • Not updating ownership mapping
5. You want to create an NFT contract that allows only the original minter to burn their token. Which ERC-721 function should you override and what check should you add?
hard
A. Override mint and check if msg.sender is approved
B. Override transferFrom and check if msg.sender is the owner
C. Override approve and check if msg.sender is the contract owner
D. Override _burn and check if msg.sender is the original minter

Solution

  1. Step 1: Identify burn function in ERC-721

    The _burn internal function handles token destruction in ERC-721 contracts.
  2. Step 2: Add ownership check for burning

    To restrict burning to original minters, override _burn and add a check that msg.sender matches the original minter address stored during minting.
  3. Final Answer:

    Override _burn and check if msg.sender is the original minter -> Option D
  4. Quick Check:

    Burn control = override _burn + minter check [OK]
Hint: Control burn by overriding _burn with minter check [OK]
Common Mistakes:
  • Trying to control burn in transferFrom or approve
  • Not storing original minter address
  • Checking approval instead of minter for burn
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard