eth_getLogs
Returns an array of all logs matching a given filter object on Flow EVM Gateway.
Why Flow EVM? Build on the EVM-equivalent layer on Flow blockchain enabling Cadence+Solidity composability with full EVM equivalence on Flow, atomic multi-operation transactions, 40% lower gas fees, and 473% contract growth in 2025.
Use Cases#
The eth_getLogs method is essential for:
- Event indexing - Track contract events for consumer NFTs (NBA Top Shot, Disney Pinnacle), gaming dApps, and hybrid Cadence-EVM applications
- Token transfers - Monitor ERC20/ERC721 transfers
- DeFi analytics - Track swaps, liquidity events, and more
- Notification systems - Alert on specific on-chain events
Parameters#
| Parameter | Type | Required | Description |
|---|---|---|---|
fromBlock | QUANTITY|TAG | No | Starting block (default: "latest") |
toBlock | QUANTITY|TAG | No | Ending block (default: "latest") |
address | DATA|Array | No | Contract address(es) to filter |
topics | Array | No | Array of topic filters |
blockHash | DATA | No | Filter single block by hash |
Request#
{
"jsonrpc": "2.0",
"method": "eth_getLogs",
"params": [{
"fromBlock": "latest",
"toBlock": "latest",
"address": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb",
"topics": ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"]
}],
"id": 1
}
Returns#
Array of log objects:
| Field | Type | Description |
|---|---|---|
address | DATA | Contract that emitted the log |
topics | Array | Array of indexed topics |
data | DATA | Non-indexed log data |
blockNumber | QUANTITY | Block number |
transactionHash | DATA | Transaction hash |
logIndex | QUANTITY | Log index in block |
Response#
{
"jsonrpc": "2.0",
"id": 1,
"result": [{
"address": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb",
"topics": ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x...", "0x..."],
"data": "0x...",
"blockNumber": "0x5BAD55",
"transactionHash": "0x...",
"logIndex": "0x0"
}]
}
Code Examples#
- cURL
- JavaScript
- Python
- Go
curl -X POST https://api-flow-evm-gateway-mainnet.n.dwellir.com/YOUR_API_KEY \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "eth_getLogs",
"params": [{
"fromBlock": "latest",
"toBlock": "latest",
"address": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb",
"topics": ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"]
}],
"id": 1
}'
import { JsonRpcProvider, Contract } from 'ethers';
const provider = new JsonRpcProvider('https://api-flow-evm-gateway-mainnet.n.dwellir.com/YOUR_API_KEY');
// Get Transfer events
const TRANSFER_TOPIC = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';
async function getTransferEvents(tokenAddress, fromBlock, toBlock) {
const logs = await provider.getLogs({
address: tokenAddress,
topics: [TRANSFER_TOPIC],
fromBlock: fromBlock,
toBlock: toBlock
});
return logs.map(log => ({
from: '0x' + log.topics[1].slice(26),
to: '0x' + log.topics[2].slice(26),
blockNumber: log.blockNumber,
transactionHash: log.transactionHash
}));
}
const events = await getTransferEvents(
'0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb',
'latest',
'latest'
);
console.log('Transfer events:', events);
from web3 import Web3
w3 = Web3(Web3.HTTPProvider('https://api-flow-evm-gateway-mainnet.n.dwellir.com/YOUR_API_KEY'))
TRANSFER_TOPIC = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'
def get_transfer_events(token_address, from_block, to_block):
logs = w3.eth.get_logs({
'address': token_address,
'topics': [TRANSFER_TOPIC],
'fromBlock': from_block,
'toBlock': to_block
})
events = []
for log in logs:
events.append({
'from': '0x' + log['topics'][1].hex()[26:],
'to': '0x' + log['topics'][2].hex()[26:],
'block': log['blockNumber'],
'tx': log['transactionHash'].hex()
})
return events
events = get_transfer_events(
'0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb',
'latest',
'latest'
)
print(f'Found {len(events)} transfer events')
package main
import (
"context"
"fmt"
"log"
"math/big"
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/ethclient"
)
func main() {
client, err := ethclient.Dial("https://api-flow-evm-gateway-mainnet.n.dwellir.com/YOUR_API_KEY")
if err != nil {
log.Fatal(err)
}
contractAddress := common.HexToAddress("0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb")
transferTopic := common.HexToHash("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef")
query := ethereum.FilterQuery{
FromBlock: big.NewInt(0),
ToBlock: nil,
Addresses: []common.Address{contractAddress},
Topics: [][]common.Hash,
}
logs, err := client.FilterLogs(context.Background(), query)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Found %d events\n", len(logs))
}
Error Handling#
| Error Code | Message | Description |
|---|---|---|
| -32005 | Query returned more than 10000 results | Reduce block range |
| -32602 | Invalid params | Invalid filter parameters |
Related Methods#
eth_newFilter- Create a filter for logseth_getFilterChanges- Poll filter for new logs