eth_newFilter
JSON-RPC method creates a filter object to notify when logs match the specified criteria. This method returns a filter ID that can be used with eth_getFilterChanges
and eth_getFilterLogs
to retrieve matching logs. Filters are essential for monitoring specific events on the blockchain.
fromBlock
(string, optional) — Block number (hexadecimal) or tag (“latest”, “earliest”, “pending”)toBlock
(string, optional) — Block number (hexadecimal) or tag (“latest”, “earliest”, “pending”)address
(string or array, optional) — Contract address or array of addresses to filtertopics
(array, optional) — Array of topic hashes to match (supports null wildcards)eth_getFilterChanges
to get new matching logseth_getFilterLogs
to get all matching logsfromBlock
and toBlock
define the block range to monitor"0xB7C609cFfa0e47DB2467ea03fF3e598bf59361A5"
["0xAddr1", "0xAddr2"]
null
as wildcard for any value at that position[]
matches all topics// Create a new filter
const createFilter = async (filterOptions) => {
const response = await fetch('https://hyperliquid-mainnet.core.chainstack.com/YOUR_ENDPOINT/evm', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
jsonrpc: '2.0',
method: 'eth_newFilter',
params: [filterOptions],
id: 1
})
});
const data = await response.json();
return data.result;
};
// Monitor specific contract events
const monitorContractEvents = async (contractAddress, eventSignature) => {
const filter = await createFilter({
fromBlock: 'latest',
toBlock: 'latest',
address: contractAddress,
topics: [eventSignature] // topic0 is the event signature hash
});
console.log(`Created filter ${filter} for contract ${contractAddress}`);
return filter;
};
// Create filter for ERC-20 Transfer events
const monitorTokenTransfers = async (tokenAddress, fromAddress = null, toAddress = null) => {
// Transfer event signature: Transfer(address,address,uint256)
const transferSignature = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';
const topics = [transferSignature];
// Add indexed parameters (from and to addresses)
if (fromAddress) {
topics.push('0x000000000000000000000000' + fromAddress.slice(2).toLowerCase());
} else {
topics.push(null); // Wildcard for any from address
}
if (toAddress) {
topics.push('0x000000000000000000000000' + toAddress.slice(2).toLowerCase());
}
const filter = await createFilter({
fromBlock: 'latest',
toBlock: 'latest',
address: tokenAddress,
topics: topics
});
return filter;
};
// Monitor multiple contracts
const monitorMultipleContracts = async (addresses, topics = []) => {
const filter = await createFilter({
fromBlock: 'latest',
toBlock: 'latest',
address: addresses,
topics: topics
});
console.log(`Created multi-contract filter: ${filter}`);
return filter;
};
// Historical event filter
const createHistoricalFilter = async (fromBlock, toBlock, contractAddress) => {
const filter = await createFilter({
fromBlock: `0x${fromBlock.toString(16)}`,
toBlock: `0x${toBlock.toString(16)}`,
address: contractAddress,
topics: []
});
console.log(`Created historical filter from block ${fromBlock} to ${toBlock}`);
return filter;
};
// Usage examples
const contractAddress = '0xB7C609cFfa0e47DB2467ea03fF3e598bf59361A5';
// Monitor all events from a contract
monitorContractEvents(contractAddress, null).then(filterId => {
console.log('Monitor filter created:', filterId);
});
// Monitor token transfers
monitorTokenTransfers(contractAddress).then(filterId => {
console.log('Transfer filter created:', filterId);
});
// Monitor multiple contracts
const addresses = [
'0xB7C609cFfa0e47DB2467ea03fF3e598bf59361A5',
'0xAnother...Address'
];
monitorMultipleContracts(addresses).then(filterId => {
console.log('Multi-contract filter created:', filterId);
});
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "eth_newFilter",
"params": [
{
"fromBlock": "latest",
"toBlock": "latest",
"address": "0xB7C609cFfa0e47DB2467ea03fF3e598bf59361A5",
"topics": []
}
],
"id": 1
}' \
https://hyperliquid-mainnet.core.chainstack.com/4f8d8f4040bdacd1577bff8058438274/evm
eth_newFilter
method is essential for applications that need to: