Setup Project

Project Setup (Devnet Client)

To simplify local development, we recommend creating a Solana client utility using @solana/kit. It handles signer generation, SOL airdrops, RPC setup, and transaction send and confirm factory.

  • Pre-configured RPC connections
  • Funded test wallet
  • Transaction send and confirm factory

Create src/client.ts

1. Required Imports

Import these utilities from @solana/kit:

import {
  airdropFactory,
  createSolanaRpc,
  createSolanaRpcSubscriptions,
  generateKeyPairSigner,
  lamports,
  MessageSigner,
  Rpc,
  RpcSubscriptions,
  sendAndConfirmTransactionFactory,
  SolanaRpcApi,
  SolanaRpcSubscriptionsApi,
  TransactionSigner,
} from "@solana/kit";

2. Define Client Type

This type describes our client's capabilities:

export type Client = {
  rpc: Rpc<SolanaRpcApi>;
  rpcSubscriptions: RpcSubscriptions<SolanaRpcSubscriptionsApi>;
  wallet: TransactionSigner & MessageSigner;
  sendAndConfirmTransaction: ReturnType<typeof sendAndConfirmTransactionFactory>;
};

3. Create Client Function

This singleton function initializes and funds your devnet client:

let client: Client;

export async function createClient(): Promise<Client> {
  if (!client) {
    // Initialize RPC connections
    const rpc = createSolanaRpc("https://api.devnet.solana.com");
    const rpcSubscriptions = createSolanaRpcSubscriptions("wss://api.devnet.solana.com");
    
    // Create and fund test wallet
    const wallet = await generateKeyPairSigner();
    await airdropFactory({ rpc, rpcSubscriptions })({
      recipientAddress: wallet.address,
      lamports: lamports(1_000_000_000n),
      commitment: "confirmed",
    });

    // Configure transaction sender
    const sendAndConfirmTransaction = sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions });

    client = {
      rpc,
      rpcSubscriptions,
      wallet,
      sendAndConfirmTransaction,
    };
  }
  return client;
}

Note: The client is cached after first creation for reuse.

4. Verify Setup

Test your client by checking a sample account balance:

import { createClient } from "./client";
import { address } from "@solana/kit";

async function testClient() {
  const client = await createClient();
  const sampleAccount = address("TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb");
  const { value: balance } = await client.rpc.getBalance(sampleAccount).send();
  console.log(`Balance: ${balance} lamports`);
}

testClient();

Expected output: Balance: 12500000 lamports

Your project is set up and ready — start building with Dropsy effortlessly!