
Product
Introducing Reports: An Extensible Reporting Framework for Socket Data
Explore exportable charts for vulnerabilities, dependencies, and usage with Reports, Socket’s new extensible reporting framework.
@solana/plugin-interfaces
Advanced tools
This package defines common TypeScript interfaces for features that Kit plugins can provide or require. It can be used standalone, but it is also exported as part of Kit @solana/kit.
When building Solana applications, different environments require different capabilities. A browser wallet might support signing but not RPC calls. A testing environment might support airdrops. A full client might support everything.
These interfaces serve two purposes:
ClientWithAirdrop).ClientWithRpc to fetch account data).This enables a composable plugin architecture where plugins can build on top of each other's capabilities.
npm install @solana/plugin-interfaces
ClientWithPayerRepresents a client that provides a default transaction payer.
import { extendClient } from '@solana/plugin-core';
import { ClientWithPayer } from '@solana/plugin-interfaces';
function memoPlugin() {
return <T extends ClientWithPayer>(client: T) =>
extendClient(client, {
sendMemo: (message: string) => {
// Use client.payer as the fee payer for the memo transaction
const feePayer = client.payer;
// ...
},
});
}
ClientWithAirdropRepresents a client that can request SOL airdrops (typically on devnet/testnet). The airdrop succeeds when the promise resolves. Some implementations (e.g., LiteSVM) update balances directly without a transaction, so no signature is returned in those cases.
import { extendClient } from '@solana/plugin-core';
import { ClientWithAirdrop, ClientWithPayer } from '@solana/plugin-interfaces';
function faucetPlugin() {
return <T extends ClientWithAirdrop & ClientWithPayer>(client: T) =>
extendClient(client, {
fundMyself: async (amount: Lamports) => {
await client.airdrop(client.payer.address, amount);
},
});
}
ClientWithGetMinimumBalanceRepresents a client that can compute the minimum balance required for an account to be exempt from deletion. Different implementations may compute this differently — for example, by calling the getMinimumBalanceForRentExemption RPC method, or by using a locally cached value.
By default, the 128-byte account header is added on top of the provided space. Pass { withoutHeader: true } to skip adding the header bytes.
import { extendClient } from '@solana/plugin-core';
import { ClientWithGetMinimumBalance } from '@solana/plugin-interfaces';
function accountCreationPlugin() {
return <T extends ClientWithGetMinimumBalance>(client: T) =>
extendClient(client, {
getAccountCreationCost: async (dataSize: number) => {
const minimumBalance = await client.getMinimumBalance(dataSize);
console.log(`Minimum balance for ${dataSize} bytes: ${minimumBalance} lamports`);
return minimumBalance;
},
});
}
ClientWithRpc<TRpcMethods>Represents a client with access to a Solana RPC endpoint.
import { extendClient } from '@solana/plugin-core';
import { ClientWithRpc } from '@solana/plugin-interfaces';
import { GetBalanceApi } from '@solana/rpc-api';
function balancePlugin() {
return <T extends ClientWithRpc<GetBalanceApi>>(client: T) =>
extendClient(client, {
getBalance: async (address: Address): Promise<Lamports> => {
const { value } = await client.rpc.getBalance(address).send();
return value;
},
});
}
ClientWithRpcSubscriptions<TRpcSubscriptionsMethods>Represents a client that provides access to Solana RPC subscriptions for real-time notifications such as account changes, slot updates, and transaction confirmations.
import { extendClient } from '@solana/plugin-core';
import { ClientWithRpcSubscriptions } from '@solana/plugin-interfaces';
import { AccountNotificationsApi } from '@solana/rpc-subscriptions-api';
function accountWatcherPlugin() {
return <T extends ClientWithRpcSubscriptions<AccountNotificationsApi>>(client: T) =>
extendClient(client, {
onAccountChange: async (address: Address, callback: (lamports: Lamports) => void) => {
const subscription = await client.rpcSubscriptions.accountNotifications(address).subscribe();
for await (const notification of subscription) {
callback(notification.value.lamports);
}
},
});
}
ClientWithTransactionPlanningRepresents a client that can convert instructions or instruction plans into transaction plans.
import { flattenTransactionPlan } from '@solana/instruction-plans';
import { extendClient } from '@solana/plugin-core';
import { ClientWithTransactionPlanning } from '@solana/plugin-interfaces';
function transactionCounterPlugin() {
return <T extends ClientWithTransactionPlanning>(client: T) =>
extendClient(client, {
countTransactions: async (instructions: IInstruction[]) => {
const plan = await client.planTransactions(instructions);
return flattenTransactionPlan(plan).length;
},
});
}
ClientWithTransactionSendingRepresents a client that can send transactions to the Solana network. It supports flexible input formats including instructions, instruction plans, transaction messages, or transaction plans.
import { extendClient } from '@solana/plugin-core';
import { ClientWithPayer, ClientWithTransactionSending } from '@solana/plugin-interfaces';
function transferPlugin() {
return <T extends ClientWithPayer & ClientWithTransactionSending>(client: T) =>
extendClient(client, {
transfer: async (recipient: Address, amount: Lamports) => {
const instruction = getTransferSolInstruction({
source: client.payer,
destination: recipient,
amount,
});
const result = await client.sendTransaction(instruction);
return result.context.signature;
},
});
}
Use TypeScript intersection types to require multiple capabilities from the client:
import { extendClient } from '@solana/plugin-core';
import { ClientWithPayer, ClientWithRpc, ClientWithTransactionSending } from '@solana/plugin-interfaces';
import { GetAccountInfoApi } from '@solana/rpc-api';
function tokenTransferPlugin() {
return <T extends ClientWithPayer & ClientWithRpc<GetAccountInfoApi> & ClientWithTransactionSending>(client: T) =>
extendClient(client, {
transferToken: async (mint: Address, recipient: Address, amount: bigint) => {
// Use client.rpc to fetch token accounts
// Use client.payer as the token owner
// Use client.sendTransaction to execute the transfer
},
});
}
FAQs
TypeScript interfaces for building pluggable Solana clients
The npm package @solana/plugin-interfaces receives a total of 37,666 weekly downloads. As such, @solana/plugin-interfaces popularity was classified as popular.
We found that @solana/plugin-interfaces demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Product
Explore exportable charts for vulnerabilities, dependencies, and usage with Reports, Socket’s new extensible reporting framework.

Product
Socket for Jira lets teams turn alerts into Jira tickets with manual creation, automated ticketing rules, and two-way sync.

Company News
Socket won two 2026 Reppy Awards from RepVue, ranking in the top 5% of all sales orgs. AE Alexandra Lister shares what it's like to grow a sales career here.