Bird
Raised Fist0
Blockchain / Solidityprogramming~5 mins

Listening to events on frontend in Blockchain / Solidity

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction

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.

When you want to show a message after a user sends a transaction.
When you want to update the balance on the page after it changes.
When you want to react to a new block or a contract event.
When you want to notify users about changes in real-time.
When you want to keep your app data synced with the blockchain.
Syntax
Blockchain / Solidity
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.

Examples
Listen to a Transfer event and print who sent tokens, who received, and how many.
Blockchain / Solidity
contract.on('Transfer', (from, to, amount, event) => {
  console.log(`Transfer from ${from} to ${to} of ${amount.toString()}`);
});
Listen to Approval event to know when someone approves spending tokens.
Blockchain / Solidity
contract.on('Approval', (owner, spender, value) => {
  console.log(`Approval: ${owner} allowed ${spender} to spend ${value.toString()}`);
});
Listen to an event that has no parameters.
Blockchain / Solidity
contract.on('EventName', () => {
  console.log('Event happened with no parameters');
});
Sample Program

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.

Blockchain / Solidity
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);
OutputSuccess
Important Notes

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.

Summary

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

(1/5)
1. What is the main purpose of listening to blockchain events on the frontend?
easy
A. To compile smart contracts
B. To send transactions to the blockchain
C. To react instantly to changes happening on the blockchain
D. To mine new blocks

Solution

  1. Step 1: Understand what events represent

    Events are signals emitted by smart contracts when something important happens.
  2. Step 2: Connect event listening to frontend behavior

    Listening to these events lets the frontend update immediately without waiting for manual refresh.
  3. Final Answer:

    To react instantly to changes happening on the blockchain -> Option C
  4. Quick Check:

    Listening to events = instant frontend updates [OK]
Hint: Events notify frontend about blockchain changes instantly [OK]
Common Mistakes:
  • Confusing event listening with sending transactions
  • Thinking events compile contracts
  • Believing events mine blocks
2. Which of the following is the correct way to start listening to an event named Transfer using ethers.js?
easy
A. contract.subscribe('Transfer', (from, to, amount) => { console.log(from, to, amount); });
B. contract.listen('Transfer', (from, to, amount) => { console.log(from, to, amount); });
C. contract.addEventListener('Transfer', (from, to, amount) => { console.log(from, to, amount); });
D. contract.on('Transfer', (from, to, amount) => { console.log(from, to, amount); });

Solution

  1. Step 1: Recall ethers.js event listening syntax

    In ethers.js, the method to listen to events is on.
  2. Step 2: Match the correct method with parameters

    The correct syntax is contract.on(eventName, callback).
  3. Final Answer:

    contract.on('Transfer', (from, to, amount) => { console.log(from, to, amount); }); -> Option D
  4. Quick Check:

    ethers.js uses .on() for events [OK]
Hint: Use .on() method to listen to events in ethers.js [OK]
Common Mistakes:
  • 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
3. Given the following code snippet, what will be logged when the Deposit event is emitted with arguments user='0x123' and amount=100?
contract.on('Deposit', (user, amount) => {
  console.log(`User ${user} deposited ${amount} tokens`);
});
medium
A. User undefined deposited undefined tokens
B. User 0x123 deposited 100 tokens
C. User [object Object] deposited 100 tokens
D. SyntaxError: Unexpected token

Solution

  1. Step 1: Understand event callback parameters

    The callback receives event arguments in order: user and amount.
  2. Step 2: Check the console.log output format

    The template string inserts user and amount correctly into the message.
  3. Final Answer:

    User 0x123 deposited 100 tokens -> Option B
  4. Quick Check:

    Event args used correctly = correct message [OK]
Hint: Event callback parameters match emitted event arguments [OK]
Common Mistakes:
  • Assuming parameters are undefined if not destructured
  • Confusing objects with strings in output
  • Expecting syntax errors from correct code
4. Identify the error in this code snippet that listens to an event and suggest the fix:
contract.on('Approval', (owner, spender, value) => {
  console.log(owner, spender, value);
});

// Later in the code
contract.off('Approval');
medium
A. The off method requires the same callback function to remove the listener
B. The event name should be lowercase 'approval' instead of 'Approval'
C. The callback function must be async to listen to events
D. The off method does not exist in ethers.js

Solution

  1. 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.
  2. Step 2: Check the code's off usage

    The code calls contract.off('Approval') without the callback, so it won't remove the listener.
  3. Final Answer:

    The off method requires the same callback function to remove the listener -> Option A
  4. Quick Check:

    Remove listener = same callback needed [OK]
Hint: Pass same callback to .off() to remove listener [OK]
Common Mistakes:
  • Calling .off() without callback removes nothing
  • Changing event name case incorrectly
  • Thinking callback must be async
5. You want to listen to a 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?
hard
A. Listen to all MessageSent events and inside the callback check if sender === currentUser before updating UI
B. Use contract.on('MessageSent', callback, { filter: sender === currentUser }) to filter events automatically
C. Filter events by modifying the contract ABI to include only currentUser events
D. Listen to events only once using contract.once and update UI

Solution

  1. Step 1: Understand event filtering on frontend

    ethers.js does not support filtering events by passing filter objects in on method directly.
  2. 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.
  3. Final Answer:

    Listen to all MessageSent events and inside the callback check if sender === currentUser before updating UI -> Option A
  4. Quick Check:

    Filter inside callback = correct approach [OK]
Hint: Filter events inside callback, not in .on() parameters [OK]
Common Mistakes:
  • Trying to filter events via .on() parameters
  • Modifying ABI to filter events (not possible)
  • Using .once() which listens only once, not continuously