📖 Scenario: You are building a simple blockchain smart contract to manage the status of a package delivery. The package can be in one of several states: Pending, Shipped, Delivered, or Returned.Using an enum helps keep track of these states clearly and safely.
🎯 Goal: Create a Solidity smart contract that uses an enum to represent package delivery status. You will set the initial status, update it, and then display the current status.
📋 What You'll Learn
Create an enum called Status with values Pending, Shipped, Delivered, and Returned.
Create a state variable called currentStatus of type Status.
Set the initial currentStatus to Pending.
Write a function to update currentStatus to Shipped.
Write a function to get the current status as a string.
Print the current status after updating it.
💡 Why This Matters
🌍 Real World
Enums help track fixed states like package delivery status, voting phases, or contract stages in blockchain smart contracts.
💼 Career
Understanding enums is essential for blockchain developers to write clear, safe, and maintainable smart contracts.
Progress0 / 4 steps
1
Create the Enum and State Variable
Create an enum called Status with values Pending, Shipped, Delivered, and Returned. Then create a public state variable called currentStatus of type Status and set it to Status.Pending.
Blockchain / Solidity
Hint
Use enum Status { Pending, Shipped, Delivered, Returned } to define the states. Then declare Status public currentStatus = Status.Pending;.
2
Add a Function to Update Status
Add a public function called shipPackage that sets currentStatus to Status.Shipped.
Blockchain / Solidity
Hint
Define function shipPackage() public and inside set currentStatus = Status.Shipped;.
3
Add a Function to Get Status as String
Add a public view function called getStatus that returns a string memory representing the current status. Use if or else if statements to check currentStatus and return the matching string: "Pending", "Shipped", "Delivered", or "Returned".
Blockchain / Solidity
Hint
Use if statements to compare currentStatus with each Status value and return the corresponding string.
4
Print the Current Status
Write a public view function called printStatus that returns the current status string by calling getStatus(). This simulates printing the status.
Blockchain / Solidity
Hint
Create function printStatus() public view returns (string memory) and return the result of getStatus().
Practice
(1/5)
1. What is the main purpose of using enum in blockchain programming?
easy
A. To execute smart contracts faster
B. To create random numbers for cryptography
C. To store large amounts of data efficiently
D. To group related named values together for clarity and safety
Solution
Step 1: Understand enum purpose
Enums group related named values, making code easier to read and safer.
Step 2: Compare options
Only To group related named values together for clarity and safety correctly describes enums' main purpose in blockchain code.
Final Answer:
To group related named values together for clarity and safety -> Option D
Quick Check:
Enums group named values = A [OK]
Hint: Enums group fixed options with names, not data or speed [OK]
Common Mistakes:
Confusing enums with random number generators
Thinking enums store large data
Believing enums speed up contract execution
2. Which of the following is the correct syntax to declare an enum named Status with values Pending, Active, and Closed in Solidity?
easy
A. enum Status: Pending, Active, Closed
B. enum Status = (Pending, Active, Closed);
C. enum Status { Pending, Active, Closed }
D. enum Status { 'Pending', 'Active', 'Closed' }
Solution
Step 1: Recall Solidity enum syntax
In Solidity, enums are declared with enum Name { Value1, Value2, ... } without equals or colons.
Step 2: Check each option
enum Status { Pending, Active, Closed } matches correct syntax; others use invalid symbols or quotes.
Final Answer:
enum Status { Pending, Active, Closed } -> Option C
Quick Check:
Solidity enum syntax uses braces and commas = C [OK]
Hint: Enums use braces and commas, no equals or quotes [OK]
Common Mistakes:
Using equals sign instead of braces
Adding quotes around enum values
Using colons instead of braces
3. Given the Solidity enum declaration:
enum Role { User, Admin, Guest }
and the code:
Role userRole = Role.Admin; if (userRole == Role.Guest) { return "Guest Access"; } else { return "Not Guest"; }
What will be the output?
medium
A. "Not Guest"
B. "Guest Access"
C. Compilation error
D. Runtime error
Solution
Step 1: Understand enum values and assignment
Role.Admin is assigned to userRole, which is not equal to Role.Guest.
Step 2: Evaluate the if condition
The condition userRole == Role.Guest is false, so the else branch runs returning "Not Guest".
Final Answer:
"Not Guest" -> Option A
Quick Check:
Role.Admin != Role.Guest, so output = "Not Guest" [OK]
4. Identify the error in this Solidity enum usage:
enum State { Created, Locked, Inactive } State public state; function setState(uint _state) public { state = _state; }
medium
A. Enum declaration syntax is wrong
B. Cannot assign uint directly to enum variable
C. Function setState should be private
D. Missing return type in function
Solution
Step 1: Analyze enum assignment
Enums require assignment from enum values, not raw uint integers.
Step 2: Check function assignment
Assigning _state (uint) directly to state (enum) causes a type mismatch error.
Final Answer:
Cannot assign uint directly to enum variable -> Option B
Quick Check:
Enum variables need enum values, not uints [OK]
Hint: Assign enum values, not integers, to enum variables [OK]
Common Mistakes:
Assigning integers directly to enums
Thinking enum syntax is wrong
Confusing function visibility with errors
5. You want to represent user roles in a blockchain contract using enums. You need to check if a user has either Admin or Moderator role to allow special access. Given:
enum Role { User, Admin, Moderator, Guest }
Which of the following Solidity code snippets correctly checks for this condition?
hard
A. if (userRole == Role.Admin || userRole == Role.Moderator) { /* allow access */ }
B. if (userRole == Role.Admin && userRole == Role.Moderator) { /* allow access */ }
C. if (userRole in [Role.Admin, Role.Moderator]) { /* allow access */ }
D. if (userRole.equals(Role.Admin) || userRole.equals(Role.Moderator)) { /* allow access */ }
Solution
Step 1: Understand logical conditions for enums
To allow access if userRole is Admin OR Moderator, use logical OR (||) between equality checks.
Step 2: Evaluate each option
if (userRole == Role.Admin || userRole == Role.Moderator) { /* allow access */ } uses correct OR condition; B uses AND which is impossible; C uses invalid syntax; A uses non-existent method equals.
Final Answer:
if (userRole == Role.Admin || userRole == Role.Moderator) { /* allow access */ } -> Option A
Quick Check:
Use || for OR between enum comparisons [OK]
Hint: Use || to check multiple enum values, not && or invalid syntax [OK]
Common Mistakes:
Using && instead of || for OR condition
Trying to use 'in' keyword for enums
Calling non-existent methods on enums
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.