DEV Community

Cover image for Build a Solana Wallet Balance Checker API with (C#) .NET and Solnett
Lucky Israel
Lucky Israel

Posted on

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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)
);
Enter fullscreen mode Exit fullscreen mode

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);
Enter fullscreen mode Exit fullscreen mode

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
    });
}
Enter fullscreen mode Exit fullscreen mode

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();
Enter fullscreen mode Exit fullscreen mode

Test your API

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

Example Response:

{
    "address": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
    "balanceInSol": 1.5,
    "balanceInLamports": 1500000000
}
Enter fullscreen mode Exit fullscreen mode

Error Handling

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

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

Top comments (0)