Bird
Raised Fist0
Blockchain / Solidityprogramming~10 mins

ERC-721 NFT standard in Blockchain / Solidity - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to declare the ERC-721 interface.

Blockchain / Solidity
interface IERC721 is IERC165 {
    function [1](address owner) external view returns (uint256);
}
Drag options to blanks, or click blank then click option'
Abalance_of
Bbalanceof
CbalanceOf
Dbalance
Attempts:
3 left
💡 Hint
Common Mistakes
Using incorrect function names like 'balance' or 'balance_of'.
Misspelling the function name with wrong capitalization.
2fill in blank
medium

Complete the code to emit the Transfer event when an NFT is transferred.

Blockchain / Solidity
event Transfer(address indexed from, address indexed to, uint256 indexed [1]);
Drag options to blanks, or click blank then click option'
AtokenId
Bid
CnftId
DassetId
Attempts:
3 left
💡 Hint
Common Mistakes
Using generic or incorrect parameter names like 'id' or 'nftId'.
Omitting the 'indexed' keyword which is required for event filtering.
3fill in blank
hard

Fix the error in the function signature for safeTransferFrom with data parameter.

Blockchain / Solidity
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata [1]) external;
Drag options to blanks, or click blank then click option'
Apayload
BextraData
Cinfo
Ddata
Attempts:
3 left
💡 Hint
Common Mistakes
Using incorrect parameter names like 'extraData' or 'payload'.
Omitting the 'calldata' keyword for the bytes parameter.
4fill in blank
hard

Fill both blanks to complete the mapping declaration for token owners and balances.

Blockchain / Solidity
mapping(uint256 => address) private [1];
mapping(address => uint256) private [2];
Drag options to blanks, or click blank then click option'
A_owners
B_balances
Cowners
Dbalances
Attempts:
3 left
💡 Hint
Common Mistakes
Using variable names without underscores.
Swapping the two mappings' variable names.
5fill in blank
hard

Fill all three blanks to complete the function that checks if an address is approved or owner of a token.

Blockchain / Solidity
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {
    address owner = [1](tokenId);
    return (spender == owner || spender == [2](tokenId) || isApprovedForAll(owner, [3]));
}
Drag options to blanks, or click blank then click option'
AownerOf
BgetApproved
Cowner
Dspender
Attempts:
3 left
💡 Hint
Common Mistakes
Using incorrect function names like 'owner' instead of 'ownerOf'.
Confusing the parameters in the isApprovedForAll call.
Using wrong variable names for the spender.

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