Last Updated: 2026-03-09
What You'll Build
The Kit client (createKitKoraClient) is the recommended way to integrate Kora
into Solana applications. It wraps Kora's fee abstraction into Kit's plugin
architecture, giving you a client that automatically handles:
- Blockhash management
- Fee estimation and payment instruction injection
- Transaction signing via Kora
- Transaction submission and confirmation
- Compute budget optimization (simulation-based CU estimation)
This means you can use Kit program plugins like tokenProgram() and have Kora
handle all the gas fee complexity behind the scenes.
Prerequisites
- Completed the Kora Quick Start Guide — running Kora server and local validator
- Familiarity with Solana Kit and its plugin system
Installation
pnpm add @solana/kora @solana/kit
Peer dependencies (@solana-program/token, @solana-program/compute-budget,
@solana/kit-plugin-*) are auto-installed by most package managers. See
Installation if you need to
install them manually.
Creating the Client
createKitKoraClient composes multiple Kit plugins into a single client that
satisfies ClientWithPayer, ClientWithTransactionPlanning, and
ClientWithTransactionSending.
import { createKitKoraClient } from "@solana/kora";import { address } from "@solana/kit";const client = await createKitKoraClient({endpoint: "http://localhost:8080", // Kora RPC endpointrpcUrl: "http://127.0.0.1:8899", // Solana RPC for CU estimationfeeToken: address("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"), // USDC mintfeePayerWallet: userSigner // TransactionSigner for fee payment});
The feePayerWallet must be a TransactionSigner — this is the wallet that
authorizes the SPL token fee payment to the Kora operator. The Kora operator
handles the SOL network fees.
Configuration Options
| Option | Required | Description |
|---|---|---|
endpoint | Yes | Kora RPC endpoint URL |
rpcUrl | Yes | Solana RPC URL (not the Kora endpoint) — used for compute unit simulation and program plugin compatibility |
feeToken | Yes | SPL mint address for fee payment (e.g., USDC) |
feePayerWallet | Yes | TransactionSigner that authorizes the SPL fee payment |
apiKey | No | API key for Kora authentication |
hmacSecret | No | HMAC secret for signature-based authentication |
computeUnitLimit | No | Fixed CU limit. If omitted, Kora simulates the transaction to estimate optimal CU (recommended) |
computeUnitPrice | No | Priority fee in micro-lamports |
tokenProgramId | No | Defaults to Token Program. Set to TOKEN_2022_PROGRAM_ADDRESS for Token-2022 fee tokens |
Using with Kit Program Plugins
The Kit client is composable with Kit program plugins. For example, with
tokenProgram():
import { createKitKoraClient } from "@solana/kora";import { tokenProgram } from "@solana-program/token";import { address } from "@solana/kit";const koraClient = await createKitKoraClient({endpoint: "http://localhost:8080",rpcUrl: "http://127.0.0.1:8899",feeToken: address("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"),feePayerWallet: userSigner});// Compose with the token program pluginconst client = koraClient.use(tokenProgram());// Use token program methods — Kora handles all fee abstractionawait client.token.instructions.transferToATA({source: userTokenAccount,destination: recipientAddress,amount: 1_000_000n, // 1 USDCauthority: userSigner}).sendTransaction();
Behind the scenes, the Kit client:
- Plans the transaction with a Kora-managed blockhash and compute budget instructions
- Estimates the fee and injects (or updates) the SPL payment instruction to the Kora operator
- Partially signs the transaction with the user's wallet
- Sends the transaction to Kora for co-signing and submission to Solana
Accessing Kora RPC Methods
The Kit client also exposes the full Kora API via the .kora namespace (from
the koraPlugin):
// Get server configurationconst config = await client.kora.getConfig();// Get supported fee tokensconst { tokens } = await client.kora.getSupportedTokens();// Estimate fees for an arbitrary transactionconst estimate = await client.kora.estimateTransactionFee({transaction: base64EncodedTx,fee_token: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"});
All .kora method responses use Kit-typed values (Address, Blockhash,
Signature) instead of raw strings.
Token-2022 Support
To pay fees with a Token-2022 token, pass the tokenProgramId option:
import { TOKEN_2022_PROGRAM_ADDRESS } from "@solana-program/token-2022";const client = await createKitKoraClient({endpoint: "http://localhost:8080",rpcUrl: "http://127.0.0.1:8899",feeToken: address("your-token-2022-mint"),feePayerWallet: userSigner,tokenProgramId: TOKEN_2022_PROGRAM_ADDRESS});
Compute Budget
By default, the Kit client simulates the transaction against the Solana RPC to determine the optimal compute unit limit. This results in tighter CU allocation and lower fees.
To override with a fixed value:
const client = await createKitKoraClient({// ...computeUnitLimit: 200_000,computeUnitPrice: 1_000_000n // priority fee in micro-lamports});
When to Use Each Client
| Client | Use Case |
|---|---|
createKitKoraClient | Recommended. Full Kit integration with automatic fee handling. Best for applications using Kit program plugins. |
KoraClient | Direct RPC access when you need full control over transaction construction, signing, and submission. |
koraPlugin | Adding Kora methods to an existing Kit client you've already composed with other plugins. |
Next Steps
- Full Transaction Flow — Lower-level
walkthrough using
KoraClientdirectly - API Reference — All available RPC methods
- Kora Configuration — Server-side configuration options
Is this page helpful?