eth_getLogs - zkSync RPC Method
Query event logs on zkSync Era. Essential for indexing RWA tokenization ($1.9B, 25% market share), hyperchain deployment via ZK Stack, and cross-chain DeFi on Matter Labs' flagship zkEVM powering the Elastic Network of interoperable hyperchains.
Returns an array of all logs matching a given filter object on zkSync Era.
Why zkSync? Build on Matter Labs' flagship zkEVM powering the Elastic Network of interoperable hyperchains with ZK Stack modular framework, hyperchain interoperability, native account abstraction, and $1.9B in tokenized real-world assets.
When to Use This Method
The eth_getLogs method serves these key scenarios for ZK developers, RWA tokenization teams, and builders launching custom L2/L3 chains:
- Index smart contract events - Track transfers, swaps, and approvals emitted by any contract on zkSync for use in indexed databases
- Monitor DeFi protocol activity - Watch for liquidity changes, price updates, and position events in real time across RWA tokenization ($1.9B, 25% market share), hyperchain deployment via ZK Stack, and cross-chain DeFi
- Build analytics pipelines - Extract on-chain event data for dashboards, reporting, and trend analysis on zkSync Era
- Track token holder activity - Monitor whale movements and large transfers to detect significant market activity
Common Use Cases
1. Monitor ERC20 Transfer Events
Track all transfer events for a specific token contract within a defined block range. The Transfer event signature hash filters for exactly this event type, and you can optionally filter by sender or recipient address using indexed topics.
import { JsonRpcProvider } from 'ethers';
const provider = new JsonRpcProvider('https://api-zksync-era-mainnet-full.n.dwellir.com/YOUR_API_KEY');
const tokenAddress = '0x5AEa5775959fBC2557Cc8789bC1bf90A239D9a91';
const transferTopic = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';
async function getRecentTransfers(fromBlock, toBlock) {
const logs = await provider.getLogs({
address: tokenAddress,
fromBlock: fromBlock,
toBlock: toBlock,
topics: [transferTopic]
});
const transfers = logs.map(log => ({
from: '0x' + log.topics[1].slice(26),
to: '0x' + log.topics[2].slice(26),
amount: BigInt(log.data).toString(),
txHash: log.transactionHash
}));
console.log(`Found ${transfers.length} transfers`);
return transfers;
}
const recentTransfers = await getRecentTransfers('latest', 'latest');2. Track DEX Swap Events
Capture swap events from a DEX to analyze trading volume, price impact, and liquidity flow. Each swap emits event parameters that include the amounts and addresses involved - ideal for building price feeds and volume aggregators.
const provider = new JsonRpcProvider('https://api-zksync-era-mainnet-full.n.dwellir.com/YOUR_API_KEY');
const SWAP_TOPIC = '0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822';
const pairAddress = '0x5AEa5775959fBC2557Cc8789bC1bf90A239D9a91';
async function getRecentSwaps(fromBlock, toBlock) {
const logs = await provider.getLogs({
address: pairAddress,
fromBlock: fromBlock,
toBlock: toBlock,
topics: [SWAP_TOPIC]
});
return logs.map(log => ({
sender: '0x' + log.topics[1].slice(26),
to: '0x' + log.topics[2].slice(26),
amount0In: BigInt('0x' + log.data.slice(2, 66)).toString(),
amount1In: BigInt('0x' + log.data.slice(66, 130)).toString(),
amount0Out: BigInt('0x' + log.data.slice(130, 194)).toString(),
amount1Out: BigInt('0x' + log.data.slice(194, 258)).toString(),
txHash: log.transactionHash
}));
}
const swaps = await getRecentSwaps('latest', 'latest');
console.log(`Found ${swaps.length} swaps`);3. Multi-Contract Event Aggregation
Query events from multiple contracts simultaneously by passing an array of addresses. This is useful for cross-protocol analytics - aggregating lending, borrowing, and liquidation events from multiple DeFi protocols in a single query on zkSync.
const provider = new JsonRpcProvider('https://api-zksync-era-mainnet-full.n.dwellir.com/YOUR_API_KEY');
const contracts = [
'0xContractA...',
'0xContractB...',
'0xContractC...'
];
const EVENT_TOPIC = '0x...';
async function aggregateEvents(fromBlock, toBlock) {
const logs = await provider.getLogs({
address: contracts,
fromBlock: fromBlock,
toBlock: toBlock,
topics: [EVENT_TOPIC]
});
const grouped = {};
for (const log of logs) {
const contract = log.address;
if (!grouped[contract]) grouped[contract] = [];
grouped[contract].push(log);
}
for (const [contract, events] of Object.entries(grouped)) {
console.log(`${contract}: ${events.length} events`);
}
return grouped;
}
aggregateEvents('0x100000', '0x100500');Best Practices
- Limit block range to 1,000-5,000 blocks per query to avoid timeouts and rate limits on zkSync
- Use topic filters for efficient log filtering: the node filters at the storage level before returning results
- For high-volume monitoring, use
eth_newFilterwith polling instead of repeatedly callingeth_getLogs - Store the last processed block number for incremental indexing rather than re-scanning the full chain
- Be aware that
eth_getLogsoften has stricter rate limits than other RPC methods on zkSync Era
Code Examples
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
eth_call
Execute smart contract calls without creating transactions on zkSync Era. Essential for reading contract state for RWA tokenization ($1.9B, 25% market share), hyperchain deployment via ZK Stack, and cross-chain DeFi.
eth_newFilter
Create an event log filter on zkSync Era. Essential for event monitoring, contract activity tracking, and DeFi event streaming for RWA tokenization ($1.9B, 25% market share), hyperchain deployment via ZK Stack, and cross-chain DeFi.