Skip to content
Solidity

Events and Logs

Emit events for off-chain listeners.

#event#log#indexed

Code

solidity
contract Events {
    // Declare event (stored in logs, not state — cheaper)
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    mapping(address => uint256) public balanceOf;
    mapping(address => mapping(address => uint256)) public allowance;

    function transfer(address to, uint256 amount) external returns (bool) {
        require(balanceOf[msg.sender] >= amount, "Insufficient");

        balanceOf[msg.sender] -= amount;
        balanceOf[to] += amount;

        // Emit event (indexed fields are searchable)
        emit Transfer(msg.sender, to, amount);
        return true;
    }

    function approve(address spender, uint256 amount) external returns (bool) {
        allowance[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }
}

// Off-chain (JavaScript with ethers.js):
// contract.on("Transfer", (from, to, value) => {
//   console.log(from, to, value.toString());
// });
// Filter: contract.queryFilter(contract.filters.Transfer(fromAddr))