Logo

dev-resources.site

for different kinds of informations.

Build a Solana Wallet Balance Checker API with (C#) .NET and Solnett

Published at
1/6/2025
Categories
blockchain
web3
solana
csharp
Author
Lucky Israel
Categories
4 categories in total
blockchain
open
web3
open
solana
open
csharp
open
Build a Solana Wallet Balance Checker API with (C#) .NET and Solnett

Let us build a simple yet powerful API that allows you to check any Solana wallet's balance using .NET 8 and the Solnett library. We'll create a minimal API with proper error handling, documentation, and clean architecture.

Prerequisites
Before we begin, make sure you have:

  • .NET 8 SDK installed
  • Your favorite code editor (Visual Studio, VS Code, etc.)
  • Basic understanding of C# and RESTful APIs
  • Basic knowledge of Solana blockchain concepts

Setting Up the Project

First, create a new web API project:

dotnet new web -n SolanaBalanceChecker
cd SolanaBalanceChecker

Next, let us install the required NuGet packages:

dotnet add package Solnet.Rpc
dotnet add package Solnet.Wallet
dotnet add package Microsoft.AspNetCore.OpenApi
dotnet add package Swashbuckle.AspNetCore

Understanding the Code

Let's break down our solution into key components:

1. Setting up the Dependencies

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

// Add Solana RPC client as a singleton
builder.Services.AddSingleton<IRpcClient>(sp => 
    ClientFactory.GetClient(Cluster.MainNet)
);

What are we doing here?

  • We're creating a minimal API application
  • Adding Swagger support for API documentation
  • Registering Solnet's RPC client as a singleton service
  • Configuring it to use Solana's MainNet (you can change this to TestNet or DevNet)

2. Creating the Balance Endpoint

app.MapGet("/balance/{walletAddress}", async (string walletAddress, IRpcClient rpcClient) =>
{
    try
    {
        // Validate wallet address format
        if (!Solnet.Wallet.PublicKey.IsValid(walletAddress))
        {
            return Results.BadRequest("Invalid Solana wallet address");
        }

        // Create public key from address
        var publicKey = new Solnet.Wallet.PublicKey(walletAddress);

        // Get the balance
        var balance = await rpcClient.GetBalanceAsync(publicKey);

Notes:

  • We create a GET endpoint that accepts a wallet address as a parameter
  • The address is validated using Solnet's built-in validator
  • We convert the address string to a PublicKey object
  • The RPC client is injected automatically thanks to dependency injection

3. Processing the Balance

if (balance.WasSuccessful)
{
    // Convert lamports to SOL (1 SOL = 1,000,000,000 lamports)
    decimal solBalance = balance.Result.Value / 1000000000m;

    return Results.Ok(new
    {
        Address = walletAddress,
        BalanceInSol = solBalance,
        BalanceInLamports = balance.Result.Value
    });
}

Important Details:

  • Solana balances are returned in lamports (1 SOL = 1,000,000,000 lamports)
  • We convert the balance to SOL for better readability
  • We return both SOL and lamports values for flexibility
  • The response is automatically serialized to JSON

At the end, your get request should look like this:

app.MapGet("/balance/{walletAddress}", async (string walletAddress, IRpcClient rpcClient) =>
{
    try
    {
        // Validate wallet address format
        if (!Solnet.Wallet.PublicKey.IsValid(walletAddress))
        {
            return Results.BadRequest("Invalid Solana wallet address");
        }

        // Create public key from address
        var publicKey = new Solnet.Wallet.PublicKey(walletAddress);

        // Get the balance
        var balance = await rpcClient.GetBalanceAsync(publicKey);

        if (balance.WasSuccessful)
        {
            // Convert lamports to SOL (1 SOL = 1,000,000,000 lamports)
            decimal solBalance = balance.Result.Value / 1000000000m;

            return Results.Ok(new
            {
                Address = walletAddress,
                BalanceInSol = solBalance,
                BalanceInLamports = balance.Result.Value
            });
        }
        else
        {
            return Results.Problem(
                detail: balance.Reason,
                statusCode: 500
            );
        }
    }
    catch (Exception ex)
    {
        return Results.Problem(
            detail: ex.Message,
            statusCode: 500
        );
    }
})
.WithName("GetBalance")
.WithOpenApi();

Test your API

  1. Run your application:
dotnet run or dotnet watch run
  1. Open your browser and navigate to:
https://localhost:5001/swagger
  1. Try it out with a real Solana wallet address:
GET /balance/7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU

Example Response:

{
    "address": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
    "balanceInSol": 1.5,
    "balanceInLamports": 1500000000
}

Error Handling

catch (Exception ex)
{
    return Results.Problem(
        detail: ex.Message,
        statusCode: 500
    );
}

You'll receive clean error messages depending on the error:

  • Invalid wallet addresses
  • Network connection issues
  • RPC errors

Conclusion

Congrtatulation now have a working Solana wallet balance checker API built with .NET!.

Resources

Featured ones: