Skip to main content

eth_blockNumber

Returns the number of the most recent block on Immutable.

Why Immutable? Build on the gaming-optimized zkEVM with 660+ games, 5.5M+ Passport signups, and $40M TVL with first EVM chain with enforceable royalties, Polygon zkEVM technology, $2B+ ecosystem funding, and Agglayer cross-chain liquidity.

When to Use This Method#

eth_blockNumber is fundamental for AAA game studios, indie game developers, and NFT gaming teams seeking enforceable royalties:

  • Syncing Applications — Keep your dApp in sync with the latest Immutable blockchain state
  • Transaction Monitoring — Verify confirmations by comparing block numbers
  • Event Filtering — Set the correct block range for querying logs on Web3 gaming (Gods Unchained, RavenQuest), gaming NFTs with enforced royalties, and cross-chain game assets
  • Health Checks — Monitor node connectivity and sync status

Parameters#

This method accepts no parameters.

ParameterTypeRequiredDescription
None--This method takes no parameters

Returns#

FieldTypeDescription
resultQUANTITYHexadecimal string representing the current block number

Return format: 0x prefixed hexadecimal (e.g., 0x5BAD55 = 6,008,149 in decimal)

Request#

{
"jsonrpc": "2.0",
"method": "eth_blockNumber",
"params": [],
"id": 1
}

Response#

Successful Response#

{
"jsonrpc": "2.0",
"id": 1,
"result": "0x5BAD55"
}

Error Response#

{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32603,
"message": "Internal error"
}
}

Code Examples#

curl -X POST https://api-immutable-zkevm-mainnet.n.dwellir.com/YOUR_API_KEY \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "eth_blockNumber",
"params": [],
"id": 1
}'

Common Use Cases#

1. Block Confirmation Counter#

Monitor transaction confirmations on Immutable:

async function getConfirmations(provider, txHash) {
const tx = await provider.getTransaction(txHash);
if (!tx || !tx.blockNumber) return 0;

const currentBlock = await provider.getBlockNumber();
return currentBlock - tx.blockNumber + 1;
}

// Wait for specific confirmations
async function waitForConfirmations(provider, txHash, confirmations = 6) {
let currentConfirmations = 0;

while (currentConfirmations < confirmations) {
currentConfirmations = await getConfirmations(provider, txHash);
console.log(`Confirmations: ${currentConfirmations}/${confirmations}`);
await new Promise(r => setTimeout(r, 2000));
}

return true;
}

2. Event Log Filtering#

Query events from recent blocks on Immutable:

async function getRecentEvents(provider, contract, eventName, blockRange = 100) {
const currentBlock = await provider.getBlockNumber();
const fromBlock = currentBlock - blockRange;

const filter = contract.filters[eventName]();
const events = await contract.queryFilter(filter, fromBlock, currentBlock);

return events;
}

3. Node Health Monitoring#

Check if your Immutable node is synced:

async function checkNodeHealth(provider) {
try {
const blockNumber = await provider.getBlockNumber();
const block = await provider.getBlock(blockNumber);

const now = Date.now() / 1000;
const blockAge = now - block.timestamp;

if (blockAge > 60) {
console.warn(`Node may be behind. Last block was ${blockAge}s ago`);
return false;
}

console.log(`Node healthy. Latest block: ${blockNumber}`);
return true;
} catch (error) {
console.error('Node unreachable:', error);
return false;
}
}

Performance Optimization#

Caching Strategy#

Cache block numbers to reduce API calls:

class BlockNumberCache {
constructor(ttl = 2000) {
this.cache = null;
this.timestamp = 0;
this.ttl = ttl;
}

async get(provider) {
const now = Date.now();

if (this.cache && (now - this.timestamp) < this.ttl) {
return this.cache;
}

this.cache = await provider.getBlockNumber();
this.timestamp = now;
return this.cache;
}

invalidate() {
this.cache = null;
this.timestamp = 0;
}
}

const blockCache = new BlockNumberCache();

Batch Requests#

Combine with other calls for efficiency:

const batch = [
{ jsonrpc: '2.0', method: 'eth_blockNumber', params: [], id: 1 },
{ jsonrpc: '2.0', method: 'eth_gasPrice', params: [], id: 2 },
{ jsonrpc: '2.0', method: 'eth_chainId', params: [], id: 3 }
];

const response = await fetch('https://api-immutable-zkevm-mainnet.n.dwellir.com/YOUR_API_KEY', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(batch)
});

const results = await response.json();

Error Handling#

Common errors and solutions:

Error CodeDescriptionSolution
-32603Internal errorRetry with exponential backoff
-32005Rate limit exceededImplement rate limiting client-side
-32000Execution revertedCheck node sync status
async function safeGetBlockNumber(provider, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
return await provider.getBlockNumber();
} catch (error) {
if (error.code === -32005) {
await new Promise(r => setTimeout(r, Math.pow(2, i) * 1000));
} else if (i === maxRetries - 1) {
throw error;
}
}
}
}