Query Blocks and Transactions
After sending transactions (as covered in Transfer Ether and Send Transactions), you'll want to inspect what happened on-chain. All queries in this guide are read-only — no gas, signing, or fees needed.
This guide covers querying blocks, looking up transactions by hash, reading receipts to check success/failure, and detecting whether an address is a contract or a regular account.
dotnet add package Nethereum.Web3
Connect to Ethereum
using Nethereum.Web3;
var web3 = new Web3("https://mainnet.infura.io/v3/YOUR-PROJECT-ID");
Get the Current Block Number
var blockNumber = await web3.Eth.Blocks.GetBlockNumber.SendRequestAsync();
Console.WriteLine("Current block number: " + blockNumber.Value);
Get a Block with Its Transactions
Use GetBlockWithTransactionsByNumber to retrieve a block with full transaction objects:
using Nethereum.Hex.HexTypes;
var block = await web3.Eth.Blocks.GetBlockWithTransactionsByNumber
.SendRequestAsync(new HexBigInteger(8257129));
Console.WriteLine("Block number: " + block.Number.Value);
Console.WriteLine("Block hash: " + block.BlockHash);
Console.WriteLine("Number of transactions: " + block.Transactions.Length);
// Access individual transactions
Console.WriteLine("Transaction 0 From: " + block.Transactions[0].From);
Console.WriteLine("Transaction 0 To: " + block.Transactions[0].To);
Console.WriteLine("Transaction 0 Value: " + block.Transactions[0].Value);
Console.WriteLine("Transaction 0 Hash: " + block.Transactions[0].TransactionHash);
Use GetBlockWithTransactionsHashesByNumber if you only need transaction hashes (lighter response).
Get a Block by Hash
var block = await web3.Eth.Blocks.GetBlockWithTransactionsByHash
.SendRequestAsync("0xabc123...");
Get a Transaction by Hash
var transaction = await web3.Eth.Transactions.GetTransactionByHash
.SendRequestAsync(
"0xb4729a0d8dd30e3070d0cb203090f2b792e029f6fa4629e96d2ebc1de13cb5c4");
Console.WriteLine("From: " + transaction.From);
Console.WriteLine("To: " + transaction.To);
Console.WriteLine("Value: " + transaction.Value);
Console.WriteLine("Hash: " + transaction.TransactionHash);
For EIP-1559 transactions, transaction.MaxFeePerGas and transaction.MaxPriorityFeePerGas are populated instead of transaction.GasPrice. The transaction.Type field indicates the transaction type (0x0 = legacy, 0x2 = EIP-1559).
Get a Transaction Receipt
The receipt contains the execution result after a transaction has been mined:
var receipt = await web3.Eth.Transactions.GetTransactionReceipt
.SendRequestAsync(
"0xb4729a0d8dd30e3070d0cb203090f2b792e029f6fa4629e96d2ebc1de13cb5c4");
Console.WriteLine("Transaction Hash: " + receipt.TransactionHash);
Console.WriteLine("Logs count: " + receipt.Logs.Count);
The receipt includes Status (1 = success, 0 = revert), GasUsed, EffectiveGasPrice, Logs (raw event logs), BlockNumber, and TransactionIndex.
GetTransactionReceipt returns null if the transaction has not been mined yet. Use receipt.HasErrors() to check if the transaction reverted.
Get Transaction Count (Nonce)
The transaction count for an address is its nonce (the transaction sequence number for an address) — the number of transactions sent from that address:
var nonce = await web3.Eth.Transactions.GetTransactionCount
.SendRequestAsync("0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae");
Console.WriteLine("Nonce: " + nonce.Value);
Detect if an Address is a Contract
Use GetCode to check whether an address has deployed bytecode. Externally owned accounts (EOAs) return "0x":
var code = await web3.Eth.GetCode.SendRequestAsync("0xaddress...");
var isContract = code != null && code != "0x";
Console.WriteLine("Is contract: " + isContract);
Decode Events from a Receipt
Use DecodeAllEvents<T>() to decode typed events from a transaction receipt. TransferEventDTO is a built-in type from Nethereum.Contracts.Standards.ERC20:
using Nethereum.Contracts;
using Nethereum.Contracts.Standards.ERC20.ContractDefinition;
var receipt = await web3.Eth.Transactions.GetTransactionReceipt
.SendRequestAsync("0x654288d8...");
var transferEvents = receipt.DecodeAllEvents<TransferEventDTO>();
foreach (var e in transferEvents)
{
Console.WriteLine($"From: {e.Event.From}, To: {e.Event.To}, Value: {e.Event.Value}");
}
Next Steps
- Decode Transactions — decode function calls from transaction input data
- Pending Transactions — retrieve pending transactions from the mempool
- Query Balances — check account and token balances