Bird
Raised Fist0
Blockchain / Solidityprogramming~10 mins

ERC-721 NFT standard in Blockchain / Solidity - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - ERC-721 NFT standard
Start: Deploy ERC-721 Contract
↓
Mint NFT Token
↓
Assign Token ID to Owner
↓
Check Ownership & Metadata
↓
Transfer Token to Another Owner
↓
Update Ownership Records
↓
Query Token Info or Owner
↓
End
This flow shows how an ERC-721 contract is deployed, NFTs are minted and assigned unique IDs, ownership is tracked, tokens can be transferred, and metadata can be queried.
Execution Sample
Blockchain / Solidity
contract SimpleNFT is ERC721 {
    uint256 public nextTokenId;
    constructor() ERC721("SimpleNFT", "SNFT") {}
    function mint() external {
        _safeMint(msg.sender, nextTokenId);
        nextTokenId++;
    }
}
This contract lets users mint unique NFTs with increasing token IDs assigned to their address.
Execution Table
StepActionToken IDOwnernextTokenIdOutput
1Deploy contract--0Contract ready
2User calls mint()0UserAddress0Mint token 0 to UserAddress
3Increment nextTokenId--1nextTokenId updated to 1
4User calls mint() again1UserAddress1Mint token 1 to UserAddress
5Increment nextTokenId--2nextTokenId updated to 2
6Transfer token 0 to AnotherAddress0AnotherAddress2Ownership of token 0 updated
7Query owner of token 11UserAddress2Returns UserAddress
8Query owner of token 00AnotherAddress2Returns AnotherAddress
9No more actions--2End of execution
💡 No more mint or transfer calls, execution ends.
Variable Tracker
VariableStartAfter Step 2After Step 3After Step 4After Step 5After Step 6Final
nextTokenId0112222
Owner of token 0NoneUserAddressUserAddressUserAddressUserAddressAnotherAddressAnotherAddress
Owner of token 1NoneNoneNoneUserAddressUserAddressUserAddressUserAddress
Key Moments - 3 Insights
Why does nextTokenId increment after minting?
Because each NFT must have a unique token ID, nextTokenId increments after minting to prepare the next unique ID (see steps 2 and 3 in execution_table).
What happens to ownership when a token is transferred?
Ownership changes from the current owner to the new owner, updating the record (see step 6 in execution_table where token 0 ownership changes).
Can two tokens have the same ID?
No, ERC-721 requires unique token IDs. The contract ensures this by incrementing nextTokenId after each mint (see variable_tracker for nextTokenId).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 4, who owns token 1?
AAnotherAddress
BUserAddress
CNo owner yet
DContract itself
💡 Hint
Check the 'Owner' column at step 4 in the execution_table.
At which step does nextTokenId become 2?
AStep 5
BStep 6
CStep 3
DStep 2
💡 Hint
Look at the 'nextTokenId' column in execution_table and variable_tracker.
If the transfer in step 6 did not happen, who would own token 0 at the end?
AAnotherAddress
BNo owner
CUserAddress
DContract owner
💡 Hint
Refer to the ownership changes in variable_tracker and execution_table steps 6 and 8.
Concept Snapshot
ERC-721 is a standard for unique NFTs.
Each token has a unique ID.
Tokens are minted to owners with _safeMint.
Ownership can be transferred.
Metadata and ownership can be queried.
nextTokenId tracks new token IDs.
Full Transcript
This visual execution traces the ERC-721 NFT standard contract. It starts with deploying the contract, then minting tokens with unique IDs assigned to the caller's address. After each mint, the nextTokenId increments to ensure uniqueness. Ownership of tokens is tracked and can be transferred to others. Queries return the current owner of each token. The execution table shows each step's action, token ID, owner, and nextTokenId value. Variable tracking highlights how ownership and nextTokenId change over time. Key moments clarify why IDs increment and how ownership updates. The quiz tests understanding of ownership and token ID changes during execution.

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