Bird
Raised Fist0
Blockchain / Solidityprogramming~20 mins

ERC-1155 multi-token standard in Blockchain / Solidity - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
ERC-1155 Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
What is the output of this ERC-1155 balance query?

Consider the following Solidity snippet querying balances of tokens in an ERC-1155 contract. What will be the output of the balances array?

Blockchain / Solidity
contract Test {
    function getBalances(address erc1155, address user) public view returns (uint256[] memory) {
        uint256[] memory ids = new uint256[](3);
        ids[0] = 1;
        ids[1] = 2;
        ids[2] = 3;
        return IERC1155(erc1155).balanceOfBatch(_fillArray(user, 3), ids);
    }
    
    function _fillArray(address user, uint256 length) internal pure returns (address[] memory) {
        address[] memory arr = new address[](length);
        for (uint256 i = 0; i < length; i++) {
            arr[i] = user;
        }
        return arr;
    }
}

interface IERC1155 {
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory);
}
A[10, 0, 5]
B[10, 5, 0]
C[0, 0, 0]
DCompilation error due to _fillArray visibility
Attempts:
2 left
💡 Hint

Remember that balanceOfBatch returns balances in the order of the input arrays.

🧠 Conceptual
intermediate
1:30remaining
Which feature distinguishes ERC-1155 from ERC-20 and ERC-721?

ERC-1155 is a multi-token standard. What key feature makes it different from ERC-20 and ERC-721?

AOnly supports fungible tokens with decimals
BSupports multiple token types (fungible and non-fungible) in a single contract
CRequires separate contracts for each token type
DDoes not support batch transfers
Attempts:
2 left
💡 Hint

Think about how many token types can be managed by one contract.

🔧 Debug
advanced
2:30remaining
Why does this batch transfer revert in ERC-1155?

Given this Solidity code snippet for batch transfer, why does the transaction revert?

Blockchain / Solidity
function safeBatchTransferFrom(
    address from,
    address to,
    uint256[] memory ids,
    uint256[] memory amounts,
    bytes memory data
) public {
    require(ids.length == amounts.length, "IDs and amounts length mismatch");
    for (uint256 i = 0; i < ids.length; i++) {
        require(balanceOf(from, ids[i]) >= amounts[i], "Insufficient balance");
        _balances[ids[i]][from] -= amounts[i];
        _balances[ids[i]][to] += amounts[i];
    }
    emit TransferBatch(msg.sender, from, to, ids, amounts);
}
AThe function lacks a check for 'to' being a valid address
BThe balances mapping is indexed incorrectly causing underflow
CThe function does not call _doSafeBatchTransferAcceptanceCheck, so it reverts on safe transfers to contracts
DThe require statement comparing ids and amounts lengths is incorrect
Attempts:
2 left
💡 Hint

ERC-1155 safe transfers require acceptance checks when sending to contracts.

📝 Syntax
advanced
1:30remaining
Identify the syntax error in this ERC-1155 mint function

What is the syntax error in this mint function snippet?

Blockchain / Solidity
function mint(address to, uint256 id, uint256 amount, bytes memory data) public {
    require(to != address(0), "Mint to zero address");
    _balances[id][to] += amount;
    emit TransferSingle(msg.sender, address(0), to, id, amount);
    _doSafeTransferAcceptanceCheck(msg.sender, address(0), to, id, amount, data);
}
AFunction lacks visibility specifier
BIncorrect event name TransferSingle should be TransferBatch
CIncorrect order of parameters in _doSafeTransferAcceptanceCheck
DMissing semicolon after updating _balances
Attempts:
2 left
💡 Hint

Check each line for missing punctuation.

🚀 Application
expert
2:00remaining
How many items are in the resulting balances array after batch mint?

An ERC-1155 contract mints tokens in batch with the following call:

mintBatch(user, [1,2,3,4], [10,0,5,7], "0x")

What is the length of the balances array returned by balanceOfBatch when querying for user balances of token IDs [1,2,3,4]?

A4
B3
C0
D1
Attempts:
2 left
💡 Hint

The length of the balances array matches the number of token IDs queried.

Practice

(1/5)
1. What is the main advantage of the ERC-1155 token standard compared to ERC-20 and ERC-721?
easy
A. It only supports fungible tokens.
B. It allows managing multiple token types in a single contract.
C. It is designed exclusively for non-fungible tokens.
D. It requires a separate contract for each token type.

Solution

  1. Step 1: Understand ERC-20 and ERC-721 limitations

    ERC-20 supports fungible tokens only, and ERC-721 supports non-fungible tokens but each token type needs its own contract.
  2. Step 2: Identify ERC-1155 feature

    ERC-1155 allows multiple token types (fungible and non-fungible) to be managed within a single contract efficiently.
  3. Final Answer:

    It allows managing multiple token types in a single contract. -> Option B
  4. Quick Check:

    ERC-1155 = multi-token single contract [OK]
Hint: ERC-1155 = many tokens, one contract [OK]
Common Mistakes:
  • Thinking ERC-1155 supports only one token type
  • Confusing ERC-1155 with ERC-20 or ERC-721
  • Believing ERC-1155 requires multiple contracts
2. Which of the following is the correct Solidity function signature to mint multiple tokens in ERC-1155?
easy
A. function mintBatch(address to, uint256[] ids, uint256[] amounts, bytes data) external;
B. function mintToken(address to, uint256 id) external;
C. function mint(address to, uint256 id, uint256 amount, bytes data) external;
D. function mintSingle(address to, uint256 id, uint256 amount) external;

Solution

  1. Step 1: Recall ERC-1155 minting functions

    ERC-1155 defines mintBatch to mint multiple token types at once, taking arrays of ids and amounts.
  2. Step 2: Match function signature

    function mintBatch(address to, uint256[] ids, uint256[] amounts, bytes data) external; matches the standard signature: mintBatch(address to, uint256[] ids, uint256[] amounts, bytes data).
  3. Final Answer:

    function mintBatch(address to, uint256[] ids, uint256[] amounts, bytes data) external; -> Option A
  4. Quick Check:

    mintBatch = batch minting function [OK]
Hint: Batch mint uses arrays of ids and amounts [OK]
Common Mistakes:
  • Using single id and amount for batch mint
  • Confusing mintBatch with mintSingle
  • Missing bytes data parameter
3. Given the following Solidity snippet, what will be the balance of token ID 5 for address 0xABC after execution?
_mint(0xABC, 5, 10, "");
_mintBatch(0xABC, [5, 7], [5, 3], "");
medium
A. 10
B. 5
C. 15
D. 3

Solution

  1. Step 1: Analyze first mint call

    The first call mints 10 tokens of ID 5 to address 0xABC.
  2. Step 2: Analyze mintBatch call

    The batch mint adds 5 tokens of ID 5 and 3 tokens of ID 7 to the same address.
  3. Step 3: Calculate total balance for token ID 5

    Total = 10 (first mint) + 5 (batch mint) = 15 tokens.
  4. Final Answer:

    15 -> Option C
  5. Quick Check:

    10 + 5 = 15 tokens [OK]
Hint: Add amounts from all mints for same token ID [OK]
Common Mistakes:
  • Ignoring batch mint amounts
  • Confusing token IDs in batch mint
  • Assuming batch mint overwrites balance
4. Identify the error in this ERC-1155 transfer function snippet:
function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes data) public {
    require(balanceOf(from, id) >= amount, "Insufficient balance");
    balances[from][id] -= amount;
    balances[to][id] += amount;
}
medium
A. Missing event emission after transfer.
B. Incorrect parameter types for safeTransferFrom.
C. Using 'public' instead of 'external' visibility.
D. No check if 'to' is a smart contract supporting ERC-1155.

Solution

  1. Step 1: Review ERC-1155 transfer requirements

    ERC-1155 requires checking if the recipient is a contract and supports the interface to avoid tokens being locked.
  2. Step 2: Identify missing safety check

    The snippet lacks the call to onERC1155Received for smart contract recipients.
  3. Final Answer:

    No check if 'to' is a smart contract supporting ERC-1155. -> Option D
  4. Quick Check:

    Check recipient contract support to prevent token loss [OK]
Hint: Always check recipient contract supports ERC-1155 [OK]
Common Mistakes:
  • Forgetting safe transfer acceptance check
  • Assuming event emission is enough
  • Ignoring contract recipient handling
5. You want to create a game inventory using ERC-1155 where players can hold multiple types of items. Which approach best uses ERC-1155 features to efficiently track and transfer items?
hard
A. Deploy one ERC-1155 contract with unique IDs for each item type and use batch transfers for multiple items.
B. Deploy separate ERC-721 contracts for each item type and transfer items individually.
C. Use ERC-20 tokens for each item type and transfer amounts representing item counts.
D. Create one ERC-1155 contract but mint only one token type for all items.

Solution

  1. Step 1: Understand game inventory needs

    Players hold many item types, needing efficient tracking and transfers.
  2. Step 2: Evaluate ERC-1155 advantages

    ERC-1155 supports multiple token IDs in one contract and batch transfers, reducing gas and complexity.
  3. Step 3: Compare options

    Deploy one ERC-1155 contract with unique IDs for each item type and use batch transfers for multiple items. uses one contract with unique IDs and batch transfers, matching ERC-1155 strengths. Others use less efficient or wrong standards.
  4. Final Answer:

    Deploy one ERC-1155 contract with unique IDs for each item type and use batch transfers for multiple items. -> Option A
  5. Quick Check:

    One contract + batch transfers = efficient multi-item management [OK]
Hint: Use one ERC-1155 contract with batch transfers for many items [OK]
Common Mistakes:
  • Using multiple contracts unnecessarily
  • Choosing ERC-20 or ERC-721 for multi-item inventory
  • Minting only one token type for all items
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