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