📖 Scenario: You are building a simple smart contract for a blockchain application. You want to notify users when a new user registers by using an event.
🎯 Goal: Create a Solidity contract that declares an event called UserRegistered with two parameters: address userAddress and string userName. Then emit this event when a new user registers.
📋 What You'll Learn
Declare an event named UserRegistered with parameters address userAddress and string userName
Create a public function registerUser that takes a string memory userName as input
Emit the UserRegistered event inside the registerUser function with the sender's address and the userName
Print the event declaration and the function emitting the event
💡 Why This Matters
🌍 Real World
Events in smart contracts are like signals that tell external apps when something important happens, such as a user registering or a transaction completing.
💼 Career
Understanding event declaration and emission is essential for blockchain developers to build interactive and responsive decentralized applications.
Progress0 / 4 steps
1
Declare the UserRegistered event
Declare an event called UserRegistered with parameters address userAddress and string userName inside the contract named UserRegistry.
Blockchain / Solidity
Hint
Use the event keyword followed by the event name and parameters inside the contract.
2
Create the registerUser function
Add a public function called registerUser that takes a string memory userName as input inside the UserRegistry contract.
Blockchain / Solidity
Hint
Define a function with the public visibility and a string memory parameter.
3
Emit the UserRegistered event inside registerUser
Inside the registerUser function, emit the UserRegistered event with msg.sender as userAddress and the input userName.
Blockchain / Solidity
Hint
Use the emit keyword followed by the event name and parameters.
4
Test the event emission
Add a comment line with // Event UserRegistered declared and emitted on user registration to confirm the event is declared and emitted correctly.
Blockchain / Solidity
Hint
Add a comment line to confirm the event is declared and emitted.
Practice
(1/5)
1. What is the purpose of declaring an event in a blockchain smart contract?
easy
A. To create a new token within the contract
B. To store user data permanently on the blockchain
C. To log important actions so external apps can track them
D. To execute a function automatically on contract deployment
Solution
Step 1: Understand event declaration purpose
Events are declared to notify external apps about important contract actions.
Step 2: Compare options with event role
Only To log important actions so external apps can track them matches the role of events as logs for external tracking.
Final Answer:
To log important actions so external apps can track them -> Option C
Quick Check:
Events = Logs for external apps [OK]
Hint: Events are for logging actions, not storing data [OK]
Common Mistakes:
Confusing events with storage variables
Thinking events execute code automatically
Assuming events create tokens
2. Which of the following is the correct syntax to declare an event named Transfer with two indexed address parameters from and to in Solidity?
easy
A. event Transfer(address from indexed, address to indexed);
B. event Transfer(address indexed from, address indexed to);
C. event Transfer(address from, address to) indexed;
D. event Transfer(indexed address from, indexed address to);
Solution
Step 1: Recall Solidity event syntax
Indexed parameters are declared as type indexed name inside parentheses.
Step 2: Check each option's syntax
Only event Transfer(address indexed from, address indexed to); correctly places indexed after the type and before the parameter name.
Final Answer:
event Transfer(address indexed from, address indexed to); -> Option B
Quick Check:
Indexed parameters = type indexed name [OK]
Hint: Put 'indexed' right after the type, before the name [OK]
Common Mistakes:
Placing 'indexed' after the parameter name
Adding 'indexed' outside parentheses
Swapping order of 'indexed' and type
3. Given the Solidity code below, what will be the output when the function sendTokens is called?
contract Token {
event Sent(address indexed from, address indexed to, uint amount);
function sendTokens(address receiver, uint amount) public {
emit Sent(msg.sender, receiver, amount);
}
}
medium
A. An event 'Sent' is emitted with sender, receiver, and amount data
B. A compilation error due to missing return statement
C. Nothing happens because events do not emit automatically
D. The function returns the amount sent
Solution
Step 1: Understand event emission in function
The function calls emit Sent(...) which triggers the event with given parameters.
Step 2: Check function behavior
The function does not return anything but emits the event, so An event 'Sent' is emitted with sender, receiver, and amount data is correct.
Final Answer:
An event 'Sent' is emitted with sender, receiver, and amount data -> Option A
Quick Check:
emit triggers event with data [OK]
Hint: emit keyword triggers event logs during function execution [OK]
Common Mistakes:
Expecting a return value from event emission
Thinking events execute code or change state
Confusing event emission with function return
4. Identify the error in the following Solidity event declaration:
contract Example {
event LogMessage(string message);
function log(string memory msg) public {
emit LogMessage(msg);
}
}
medium
A. There is no error; the code is correct
B. The event declaration is missing the indexed keyword
C. The event cannot have string type parameters
D. The function parameter name conflicts with a reserved keyword
Solution
Step 1: Review event declaration and usage
The event LogMessage with a string parameter is valid and emitted correctly.
Step 2: Check for reserved keyword conflicts
The parameter name msg is allowed as a variable name; it does not conflict with reserved keywords.
Final Answer:
There is no error; the code is correct -> Option A
Quick Check:
Valid event with string parameter and emit usage [OK]
Hint: Strings are allowed in events; 'msg' is not reserved as variable name [OK]
Common Mistakes:
Assuming all event parameters must be indexed
Thinking 'msg' is a reserved keyword variable
Believing strings cannot be event parameters
5. You want to declare an event Approval that logs the owner, spender, and amount approved. You also want to filter logs by owner and spender efficiently. Which is the best event declaration?
hard
A. event Approval(indexed address owner, indexed address spender, uint amount);
B. event Approval(address owner, address spender, uint indexed amount);
C. event Approval(address owner indexed, address spender indexed, uint amount);
D. event Approval(address indexed owner, address indexed spender, uint amount);
Solution
Step 1: Understand indexed parameters for filtering
Indexed parameters allow efficient filtering in event logs by those fields.
Step 2: Check correct syntax and indexing
event Approval(address indexed owner, address indexed spender, uint amount); correctly indexes owner and spender addresses, allowing filtering; amount is not indexed.