Docs

eth_getBlockByNumber - Sonic RPC Method

Retrieve complete block data by block number on Sonic. Perfect for DeFi developers, high-frequency trading builders, and teams requiring sub-second finality building on the world's fastest EVM chain with 720ms finality, $1.2B+ TVL, and 1,534% growth since launch.

Returns information about a block by block number on Sonic.

Why Sonic? Build on the world's fastest EVM chain with 720ms finality, $1.2B+ TVL, and 1,534% growth since launch with 720ms transaction finality, 10K TPS, 90% fee sharing via FeeM, Fantom heritage with Andre Cronje leadership.

When to Use This Method

eth_getBlockByNumber is essential for DeFi developers, high-frequency trading builders, and teams requiring sub-second finality:

  • Block explorers and analytics dashboards: Display comprehensive block data and chain metrics for end-user interfaces on Sonic
  • Transaction indexers processing block contents: Extract and index every transaction within a block for data pipelines and search backends
  • Cross-chain bridges verifying block data: Validate block headers and transaction proofs for ultra-fast DeFi, high-frequency trading dApps, and performance-critical applications
  • Timestamp-based logic: Verify block age and enforce time-dependent contract logic on the world's fastest EVM chain with 720ms finality, $1.2B+ TVL, and 1,534% growth since launch

Common Use Cases

1. Process All Transactions in the Latest Block

Fetch the latest block on Sonic with full transaction objects, then iterate through each transaction to extract sender, receiver, value, and gas data. This pattern powers indexers, analytics dashboards, and event backfill pipelines.

JavaScript
import { JsonRpcProvider, formatEther } from 'ethers';

const provider = new JsonRpcProvider('https://api-sonic-mainnet-archive.n.dwellir.com/YOUR_API_KEY');

async function processLatestBlock() {
  const block = await provider.getBlock('latest', true);

  if (!block) return;

  console.log(`Block #${block.number}: ${block.transactions.length} transactions`);

  for (const tx of block.prefetchedTransactions) {
    console.log(`  ${tx.hash}`);
    console.log(`    From: ${tx.from}  To: ${tx.to}`);
    console.log(`    Value: ${formatEther(tx.value)}  Gas: ${tx.gasLimit.toString()}`);
  }
}

processLatestBlock();

2. Monitor New Blocks with a Polling Loop

Poll eth_getBlockByNumber at regular intervals to detect new blocks as they are produced on Sonic. This lightweight pattern is suitable for bots, watchers, and notification services that need near-real-time block awareness.

Python
from web3 import Web3
import time

w3 = Web3(Web3.HTTPProvider('https://api-sonic-mainnet-archive.n.dwellir.com/YOUR_API_KEY'))

last_block = w3.eth.block_number

print(f'Starting from block #{last_block}')

while True:
    current_block = w3.eth.block_number
    if current_block > last_block:
        for block_num in range(last_block + 1, current_block + 1):
            block = w3.eth.get_block(block_num)
            tx_count = len(block.transactions)
            print(f'New block #{block.number}: {tx_count} txns, '
                  f'gas used {block.gasUsed}')
        last_block = current_block
    time.sleep(2)

3. Verify Block Finality on L2 Chains

Layer 2 rollup chains on the world's fastest EVM chain with 720ms finality, $1.2B+ TVL, and 1,534% growth since launch expose additional block tags that indicate settlement confidence. Use safe or finalized tags alongside the base latest tag for use cases requiring strong finality guarantees.

Go
package main

import (
    "context"
    "fmt"
    "log"
    "math/big"

    "github.com/ethereum/go-ethereum/ethclient"
)

func main() {
    client, _ := ethclient.Dial("https://api-sonic-mainnet-archive.n.dwellir.com/YOUR_API_KEY")

    // Latest block (may be unconfirmed on L2)
    latest, _ := client.BlockByNumber(context.Background(), nil)
    fmt.Printf("Latest block: %d (timestamp: %d)\n",
        latest.Number().Uint64(), latest.Time())

    // Finalized block (settled on L1 for rollups)
    finalized, _ := client.BlockByNumber(context.Background(),
        big.NewInt(int64(RPCLatestBlockNumber-32))) // placeholder: use rpc.FinalizedBlockNumber
    if finalized != nil {
        fmt.Printf("Finalized block: %d\n", finalized.Number().Uint64())
    }
}

Best Practices

  • Cache block data by block number: Blocks are immutable once finalized, so cache results indefinitely keyed by block number to eliminate redundant API calls
  • Use latest tag for most use cases; avoid pending for production: The pending tag returns speculative data that may never be included in the canonical chain
  • For L2 chains, check chain-specific finality tags: Tags like safe and finalized provide settlement guarantees specific to each rollup's proof mechanism
  • Combine with eth_getBlockReceipts for efficient receipt scanning: When you need both block headers and transaction outcomes, use eth_getBlockReceipts alongside this method rather than fetching receipts individually

Code Examples

Error Handling

Error CodeMessageDescription
-32602Invalid paramsInvalid block number or parameter format
-32000Block not foundBlock does not exist