Introduction to ERC20 Event Logs
ERC20 tokens emit two primary event types on the Ethereum blockchain:
- Transfer events: Triggered when tokens move between accounts
- Approval events: Generated when token owners authorize spending allowances
Step 1: Create the ERC20 Interface File
First, create erc20.sol with the following Solidity code:
pragma solidity ^0.4.24;
contract ERC20 {
event Transfer(address indexed from, address indexed to, uint tokens);
event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}Step 2: Generate Go Package from ABI
Execute these commands to generate Go bindings:
solc --abi erc20.sol
abigen --abi=erc20_sol_ERC20.abi --pkg=token --out=erc20.goStep 3: Define Go Structs for Event Logs
type LogTransfer struct {
From common.Address
To common.Address
Tokens *big.Int
}
type LogApproval struct {
TokenOwner common.Address
Spender common.Address
Tokens *big.Int
}Step 4: Initialize Ethereum Client
client, err := ethclient.Dial("https://cloudflare-eth.com")
if err != nil {
log.Fatal(err)
}👉 Best practices for Ethereum client connections
Step 5: Configure Filter Query
contractAddress := common.HexToAddress("0xe41d2489571d322189246dafa5ebde1f4699f498") // ZRX token
query := ethereum.FilterQuery{
FromBlock: big.NewInt(6383820),
ToBlock: big.NewInt(6383840),
Addresses: []common.Address{contractAddress},
}Step 6: Filter and Process Logs
logs, err := client.FilterLogs(context.Background(), query)
contractAbi, err := abi.JSON(strings.NewReader(string(token.TokenABI)))
// Calculate event signature hashes
logTransferSigHash := crypto.Keccak256Hash([]byte("Transfer(address,address,uint256)"))
logApprovalSigHash := crypto.Keccak256Hash([]byte("Approval(address,address,uint256)"))Step 7: Parse Log Data
for _, vLog := range logs {
switch vLog.Topics[0].Hex() {
case logTransferSigHash.Hex():
// Parse transfer event
case logApprovalSigHash.Hex():
// Parse approval event
}
}Complete Code Implementation
package main
import (
// ... imports ...
)
func main() {
// Full implementation as shown in previous steps
}👉 Advanced Ethereum development techniques
FAQ Section
What are ERC20 event logs?
Event logs are Ethereum's way of recording contract activity that clients can query. ERC20 tokens emit standardized events for transfers and approvals.
How do I verify parsed logs against Etherscan?
Compare your parsed data with the transaction details on Etherscan using the transaction hash. The event parameters should match exactly.
Why use Keccak256 hashes for event filtering?
Ethereum stores event signatures as topic hashes for efficient searching. The Keccak256 hash of the event signature becomes topic[0].
Can I parse historical ERC20 events?
Yes, specify the block range in your FilterQuery to retrieve events from any historical period.
What's the difference between indexed and non-indexed parameters?
Indexed parameters (marked in Solidity) are searchable but limited to 3 per event. Non-indexed parameters contain the full event data.
Best Practices
- Always verify contract ABIs match the deployed code
- Handle big.Int values carefully to avoid overflow
- Consider adding exponential backoff for rate-limited RPC endpoints
- Cache frequently accessed logs to reduce RPC calls