We listen to events on the frontend to know when something important happens in the blockchain. This helps us update the webpage automatically without refreshing.
Listening to events on frontend in Blockchain / Solidity
Start learning this pattern below
Jump into concepts and practice - no test required
const contract = new ethers.Contract(contractAddress, contractABI, provider);
contract.on('EventName', (param1, param2, event) => {
// Your code to handle the event
console.log(param1, param2);
});You need the contract address, ABI, and a provider or signer to listen to events.
The callback function receives event parameters and an event object with extra info.
contract.on('Transfer', (from, to, amount, event) => { console.log(`Transfer from ${from} to ${to} of ${amount.toString()}`); });
contract.on('Approval', (owner, spender, value) => { console.log(`Approval: ${owner} allowed ${spender} to spend ${value.toString()}`); });
contract.on('EventName', () => { console.log('Event happened with no parameters'); });
This program connects to the Ethereum mainnet and listens for Transfer events on the DAI token contract. When a transfer happens, it prints details to the console.
import { ethers } from 'ethers'; async function main() { // Connect to Ethereum mainnet via default provider const provider = ethers.getDefaultProvider(); // Example contract: DAI stablecoin const contractAddress = '0x6B175474E89094C44Da98b954EedeAC495271d0F'; const contractABI = [ 'event Transfer(address indexed from, address indexed to, uint256 value)' ]; // Create contract instance const contract = new ethers.Contract(contractAddress, contractABI, provider); console.log('Listening for Transfer events on DAI contract...'); // Listen to Transfer events contract.on('Transfer', (from, to, value, event) => { console.log(`Transfer event detected:`); console.log(`From: ${from}`); console.log(`To: ${to}`); console.log(`Value: ${value.toString()}`); console.log('---'); }); // Keep the script running // In a real frontend app, this runs as part of the app lifecycle } main().catch(console.error);
Listening to events uses network resources; avoid listening to too many events at once.
Time complexity: O(1) per event received, but depends on event frequency.
Space complexity: O(1) as events are handled one by one.
Common mistake: forgetting to remove listeners when no longer needed, which can cause memory leaks.
Use event listening when you want real-time updates; use polling only if event listening is not supported.
Listening to blockchain events lets your frontend react instantly to changes.
You need contract address, ABI, and a provider to listen to events.
Always clean up listeners to keep your app efficient.
Practice
Solution
Step 1: Understand what events represent
Events are signals emitted by smart contracts when something important happens.Step 2: Connect event listening to frontend behavior
Listening to these events lets the frontend update immediately without waiting for manual refresh.Final Answer:
To react instantly to changes happening on the blockchain -> Option CQuick Check:
Listening to events = instant frontend updates [OK]
- Confusing event listening with sending transactions
- Thinking events compile contracts
- Believing events mine blocks
Transfer using ethers.js?Solution
Step 1: Recall ethers.js event listening syntax
In ethers.js, the method to listen to events ison.Step 2: Match the correct method with parameters
The correct syntax iscontract.on(eventName, callback).Final Answer:
contract.on('Transfer', (from, to, amount) => { console.log(from, to, amount); }); -> Option DQuick Check:
ethers.js uses .on() for events [OK]
- Using .listen() which does not exist in ethers.js
- Using .addEventListener() which is DOM method, not ethers.js
- Using .subscribe() which is not ethers.js syntax
Deposit event is emitted with arguments user='0x123' and amount=100?
contract.on('Deposit', (user, amount) => {
console.log(`User ${user} deposited ${amount} tokens`);
});Solution
Step 1: Understand event callback parameters
The callback receives event arguments in order: user and amount.Step 2: Check the console.log output format
The template string inserts user and amount correctly into the message.Final Answer:
User 0x123 deposited 100 tokens -> Option BQuick Check:
Event args used correctly = correct message [OK]
- Assuming parameters are undefined if not destructured
- Confusing objects with strings in output
- Expecting syntax errors from correct code
contract.on('Approval', (owner, spender, value) => {
console.log(owner, spender, value);
});
// Later in the code
contract.off('Approval');Solution
Step 1: Understand how to remove event listeners in ethers.js
To remove a listener, you must pass the exact callback function used when adding it.Step 2: Check the code's
The code callsoffusagecontract.off('Approval')without the callback, so it won't remove the listener.Final Answer:
Theoffmethod requires the same callback function to remove the listener -> Option AQuick Check:
Remove listener = same callback needed [OK]
- Calling .off() without callback removes nothing
- Changing event name case incorrectly
- Thinking callback must be async
MessageSent event on your frontend and update the UI only for messages sent by the current user. Which approach correctly filters events before updating the UI?Solution
Step 1: Understand event filtering on frontend
ethers.js does not support filtering events by passing filter objects inonmethod directly.Step 2: Use callback logic to filter events
Listen to all events, then check inside the callback if the sender matches the current user before updating UI.Final Answer:
Listen to allMessageSentevents and inside the callback check ifsender === currentUserbefore updating UI -> Option AQuick Check:
Filter inside callback = correct approach [OK]
- Trying to filter events via .on() parameters
- Modifying ABI to filter events (not possible)
- Using .once() which listens only once, not continuously
