eth_newBlockFilter - Cronos RPC Method
Create a filter for new block notifications on Cronos. Essential for block monitoring, chain progression tracking, and reorg detection for DeFi protocols, NFT marketplaces, and Crypto.com ecosystem integrations.
Creates a filter on Cronos that notifies when new blocks arrive. Once created, poll the filter with eth_getFilterChanges to receive an array of block hashes for each new block added to the chain since your last poll.
Why Cronos? Build on the EVM-compatible Crypto.com blockchain with fast finality and deep Crypto.com ecosystem integration.
When to Use This Method
eth_newBlockFilter is essential for Cronos developers building DeFi and payment applications:
- Block Monitoring — Detect new blocks on Cronos as they are mined or finalized, without repeatedly calling
eth_blockNumber - Chain Progression Tracking — Build dashboards or alerting systems that track block production rate and timing
- Reorg Detection — Identify chain reorganizations by monitoring for blocks that are replaced or missing
- Event-Driven Architectures — Trigger downstream processing (indexing, notifications, settlement) whenever a new block appears
Request Parameters
This method accepts no parameters.
Response Body
A hex-encoded filter ID used to poll for new blocks via eth_getFilterChanges
Array of 32-byte block hashes for each new block since the last poll
Error Responses
Code Examples
# Create the block filter
FILTER_ID=$(curl -s -X POST https://api-cronos-mainnet-archive.n.dwellir.com/YOUR_API_KEY \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "eth_newBlockFilter",
"params": [],
"id": 1
}' | jq -r '.result')
echo "Filter ID: $FILTER_ID"
# Poll for new blocks
curl -X POST https://api-cronos-mainnet-archive.n.dwellir.com/YOUR_API_KEY \
-H "Content-Type: application/json" \
-d "{
\"jsonrpc\": \"2.0\",
\"method\": \"eth_getFilterChanges\",
\"params\": [\"$FILTER_ID\"],
\"id\": 2
}"Common Use Cases
1. Block Production Rate Monitor
Track block times and detect slowdowns on Cronos:
async function monitorBlockRate(provider) {
const filterId = await provider.send('eth_newBlockFilter', []);
let lastBlockTime = null;
const blockTimes = [];
setInterval(async () => {
const blockHashes = await provider.send('eth_getFilterChanges', [filterId]);
for (const hash of blockHashes) {
const block = await provider.getBlock(hash);
const blockTime = block.timestamp;
if (lastBlockTime) {
const interval = blockTime - lastBlockTime;
blockTimes.push(interval);
// Keep last 100 block times
if (blockTimes.length > 100) blockTimes.shift();
const avgBlockTime = blockTimes.reduce((a, b) => a + b, 0) / blockTimes.length;
console.log(`Block #${block.number} | interval: ${interval}s | avg: ${avgBlockTime.toFixed(1)}s`);
if (interval > avgBlockTime * 3) {
console.warn(`Slow block detected — ${interval}s vs ${avgBlockTime.toFixed(1)}s average`);
}
}
lastBlockTime = blockTime;
}
}, 2000);
}2. Reorg-Aware Block Tracker
Detect chain reorganizations by tracking block hashes:
async function trackBlocksWithReorgDetection(provider) {
const filterId = await provider.send('eth_newBlockFilter', []);
const blockHistory = new Map(); // blockNumber -> blockHash
setInterval(async () => {
const newBlockHashes = await provider.send('eth_getFilterChanges', [filterId]);
for (const hash of newBlockHashes) {
const block = await provider.getBlock(hash);
const existingHash = blockHistory.get(block.number);
if (existingHash && existingHash !== hash) {
console.warn(`Reorg detected at block #${block.number}!`);
console.warn(` Old hash: ${existingHash}`);
console.warn(` New hash: ${hash}`);
// Trigger reorg handling logic
}
blockHistory.set(block.number, hash);
// Prune old entries
if (blockHistory.size > 1000) {
const minBlock = block.number - 500;
for (const [num] of blockHistory) {
if (num < minBlock) blockHistory.delete(num);
}
}
}
}, 2000);
}3. Block-Triggered Task Scheduler
Execute tasks whenever a new block is produced:
async function onNewBlock(provider, callback) {
const filterId = await provider.send('eth_newBlockFilter', []);
const poll = async () => {
try {
const hashes = await provider.send('eth_getFilterChanges', [filterId]);
for (const hash of hashes) {
await callback(hash);
}
} catch (error) {
if (error.message.includes('filter not found')) {
return provider.send('eth_newBlockFilter', []).then(newId => {
console.log('Block filter recreated');
return newId;
});
}
throw error;
}
return filterId;
};
let currentFilterId = filterId;
setInterval(async () => {
currentFilterId = await poll() || currentFilterId;
}, 2000);
}
// Usage
onNewBlock(provider, async (blockHash) => {
console.log(`Processing block: ${blockHash}`);
// Run indexer, check conditions, send notifications, etc.
});Error Handling
Common errors and solutions:
| Error Code | Description | Solution |
|---|---|---|
| -32603 | Internal error | Node may not support filters — verify node capabilities |
| -32000 | Filter not found | Filter expired (~5 min inactivity) — recreate with eth_newBlockFilter |
| -32005 | Rate limit exceeded | Reduce polling frequency or implement client-side rate limiting |
| -32601 | Method not found | Node does not support filter methods — use eth_blockNumber polling instead |
async function createBlockFilterWithFallback(provider) {
try {
const filterId = await provider.send('eth_newBlockFilter', []);
return { type: 'filter', id: filterId };
} catch (error) {
console.warn('Block filter not supported — falling back to polling');
return { type: 'polling', lastBlock: await provider.getBlockNumber() };
}
}Related Methods
eth_getFilterChanges— Poll this filter for new block hasheseth_uninstallFilter— Remove the block filter when no longer neededeth_blockNumber— Get the current block number (alternative to filter-based monitoring)eth_getBlockByHash— Fetch full block details for hashes returned by the filter
eth_uninstallFilter
Remove a filter on Cronos created by eth_newFilter, eth_newBlockFilter, or eth_newPendingTransactionFilter. Essential for resource cleanup after event monitoring.
eth_newPendingTransactionFilter
Create a filter for pending transaction notifications on Cronos. Essential for mempool monitoring, transaction tracking, and MEV opportunity detection for DeFi protocols, NFT marketplaces, and Crypto.com ecosystem integrations.