A Guide to Events in Solidity

Rahul Ravindran

Events are inheritable members of contracts. When you call them, they cause the arguments to be stored in the transaction’s log — a special data structure in the blockchain. These logs are associated with the address of the contract, are incorporated into the blockchain, and stay there as long as a block is accessible

Solidity defines events with the event keyword. After events are called, their arguments are placed in the blockchain. This way we can query it later. Events can also be subscribed by the front end client application.

All information in the blockchain is public and any actions can be found by looking into the transactions close enough but events are a shortcut to ease development of outside systems in cooperation with smart contracts. They are also indexable, meaning you can search for them. So whenever something happens within your smart contract which some system outside the blockchain should know about you should emit an event and the outside system can listen for such events.

You can add the attribute indexed to up to three parameters which adds them to a special data structure known as “topics” instead of the data part of the log. If you use arrays (including string and bytes) as indexed arguments, its Keccak-256 hash is stored as a topic instead, this is because a topic can only hold a single word (32 bytes).


// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.21 <0.9.0;

contract ClientReceipt {
    event Deposit(
        address indexed _from,
        bytes32 indexed _id,
        uint _value

    function deposit(bytes32 _id) public payable {
        // Events are emitted using `emit`, followed by
        // the name of the event and the arguments
        // (if any) in parentheses. Any such invocation
        // (even deeply nested) can be detected from
        // the JavaScript API by filtering for `Deposit`.
        emit Deposit(msg.sender, _id, msg.value);

on the frontend

var abi = /* abi as generated by the compiler */;
var ClientReceipt = web3.eth.contract(abi);
var clientReceipt = ClientReceipt.at("0x1234...ab67" /* address */);

var depositEvent = clientReceipt.Deposit();

// watch for changes
depositEvent.watch(function(error, result){
    // result contains non-indexed arguments and topics
    // given to the `Deposit` call.
    if (!error)

// Or pass a callback to start watching immediately
var depositEvent = clientReceipt.Deposit(function(error, result) {
    if (!error)

Output of the event:

   "returnValues": {
       "_from": "0x1111…FFFFCCCC",
       "_id": "0x50…sd5adb20",
       "_value": "0x420042"
   "raw": {
       "data": "0x7f…91385",
       "topics": ["0xfd4…b4ead7", "0x7f…1a91385"]


Leave a Reply

More great articles

Your First Dapp using Create ETH App

One of the biggest challenges for setting up a blockchain project is to get the project setup correctly. Create-eth-app is…

Read Story

How to sign messages using Metamask

Signing messages in Ethereum Authentication for web3 ? If you’ve ever interacted with an Ethereum Dapp you’ve probably been asked…

Read Story

Getting Started With Ganache V7

Intro OK developers welcome back! In this video I think it's time for us to revisit Ganache. Ganache is part…

Read Story

Never miss a minute

Get great content to your inbox every week. No spam.
[contact-form-7 id="6" title="Footer CTA Subscribe Form"]