Overview
The Kit integration utilities allow you to convert legacy wallet adapters into Kit-compatible signers, enabling seamless use of @solana/kit’s modern architecture.
DualConnection Support: All functions in this module support both legacy Connection from @solana/web3.js and Kit Rpc. Wallet adapters created with the Hermis wallet standard handle both connection types transparently through their sendTransaction and signAndSendTransaction methods.
createKitSignersFromAdapter()
Convert a wallet adapter to Kit-compatible signers.
import { createKitSignersFromAdapter , getStandardWalletAdapters } from '@hermis/solana-headless-adapter-base' ;
import { Connection } from '@solana/web3.js' ;
// Auto-detect wallet-standard compatible wallets
const adapters = getStandardWalletAdapters ([]);
const adapter = adapters [ 0 ]; // Use first detected wallet
await adapter . connect ();
// Network auto-detected from connection endpoint
const connection = new Connection ( 'https://api.devnet.solana.com' );
const { address , addressString , messageSigner , transactionSigner } =
createKitSignersFromAdapter ( adapter , connection );
Parameters
adapter
WalletAdapter | null
required
The wallet adapter instance (must be connected)
Solana connection (supports both web3.js Connection and Kit Rpc). Network is auto-detected from the endpoint.
network
'mainnet' | 'devnet' | 'testnet'
Optional network override. Use this for custom RPC URLs where auto-detection might fail.
Returns
Object containing Kit-compatible signers Kit Address type (null if wallet not connected)
Plain address string (null if wallet not connected)
messageSigner
MessageModifyingSigner<string> | null
Kit message signer (null if wallet doesn’t support signing or not connected)
transactionSigner
TransactionSendingSigner<string> | null
Kit transaction sending signer (null if wallet doesn’t support or not connected)
Usage with Kit
import { createKitSignersFromAdapter , getStandardWalletAdapters } from '@hermis/solana-headless-adapter-base' ;
import { createSolanaRpc , devnet } from '@solana/kit' ;
import { getTransferSolInstruction } from '@solana-program/system' ;
import {
pipe ,
createTransactionMessage ,
setTransactionMessageFeePayerSigner ,
setTransactionMessageLifetimeUsingBlockhash ,
appendTransactionMessageInstruction
} from '@solana/kit' ;
// Auto-detect wallet-standard compatible wallets
const adapters = getStandardWalletAdapters ([]);
const adapter = adapters [ 0 ]; // Use first detected wallet
await adapter . connect ();
// Create RPC connection (Kit Rpc)
const rpc = createSolanaRpc ( devnet ( 'https://api.devnet.solana.com' ));
// Create Kit signers - works with both legacy Connection and Kit Rpc
// Network is auto-detected from RPC endpoint
const { address , transactionSigner } = createKitSignersFromAdapter ( adapter , rpc );
if ( ! address || ! transactionSigner ) {
throw new Error ( 'Wallet not ready' );
}
// Use with Kit RPC and instructions
const { value : latestBlockhash } = await rpc . getLatestBlockhash (). send ();
const message = pipe (
createTransactionMessage ({ version: 0 }),
m => setTransactionMessageFeePayerSigner ( transactionSigner , m ),
m => setTransactionMessageLifetimeUsingBlockhash ( latestBlockhash , m ),
m => appendTransactionMessageInstruction (
getTransferSolInstruction ({
source: address ,
destination: recipientAddress ,
amount: lamports ( 1000000 n )
}),
m
)
);
Helper Functions
adapterSupportsMessageSigning()
Check if a wallet adapter supports message signing.
import { adapterSupportsMessageSigning } from '@hermis/solana-headless-adapter-base' ;
if ( adapterSupportsMessageSigning ( adapter )) {
const signature = await adapter . signMessage ( message );
}
adapter
WalletAdapter | null
required
The wallet adapter to check
true if the adapter supports message signing, false otherwise
adapterSupportsTransactionSending()
Check if a wallet adapter supports transaction sending.
import { adapterSupportsTransactionSending } from '@hermis/solana-headless-adapter-base' ;
if ( adapterSupportsTransactionSending ( adapter )) {
const signature = await adapter . sendTransaction ( transaction , connection );
}
adapter
WalletAdapter | null
required
The wallet adapter to check
true if the adapter supports transaction sending, false otherwise
Chain Utilities
SOLANA_CHAINS
Constants for Solana chain identifiers following the Wallet Standard format.
import { SOLANA_CHAINS } from '@hermis/solana-headless-adapter-base' ;
console . log ( SOLANA_CHAINS . mainnet ); // 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp'
console . log ( SOLANA_CHAINS . devnet ); // 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1'
console . log ( SOLANA_CHAINS . testnet ); // 'solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z'
getChainId()
Get the Wallet Standard chain identifier for a network.
import { getChainId } from '@hermis/solana-headless-adapter-base' ;
const chainId = getChainId ( 'devnet' );
// Returns: 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1'
network
'mainnet' | 'devnet' | 'testnet'
required
The Solana network name
The Wallet Standard chain identifier
getNetworkFromChainId()
Get the network name from a Wallet Standard chain identifier.
import { getNetworkFromChainId } from '@hermis/solana-headless-adapter-base' ;
const network = getNetworkFromChainId ( 'solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1' );
// Returns: 'devnet'
const unknown = getNetworkFromChainId ( 'solana:unknown' );
// Returns: null
The Wallet Standard chain identifier
return
'mainnet' | 'devnet' | 'testnet' | null
The network name, or null if unknown
isSolanaChain()
Check if a chain identifier is a Solana chain.
import { isSolanaChain } from '@hermis/solana-headless-adapter-base' ;
if ( isSolanaChain ( chainId )) {
// TypeScript knows chainId is `solana:${string}`
console . log ( 'This is a Solana chain' );
}
The chain identifier to check
true if the chain is a Solana chain, false otherwise
Transaction Helpers
createKitTransaction()
Create a Kit transaction message with automatic blockhash handling. Simplifies the process of building @solana/kit transactions.
import { createKitTransaction } from '@hermis/solana-headless-adapter-base' ;
import { createSolanaRpc , devnet } from '@solana/kit' ;
import { getTransferSolInstruction } from '@solana-program/system' ;
import { lamports } from '@solana/kit' ;
// Works with both Connection and Kit Rpc
const rpc = createSolanaRpc ( devnet ( 'https://api.devnet.solana.com' ));
// Create transaction with instructions
const transaction = await createKitTransaction (
rpc ,
senderAddress ,
[
getTransferSolInstruction ({
source: senderAddress ,
destination: recipientAddress ,
amount: lamports ( 1000000 n )
})
]
);
Solana connection for fetching latest blockhash (supports both web3.js Connection and Kit Rpc)
Address of the transaction fee payer
Array of Kit instructions to include in the transaction. Defaults to empty array.
return
Promise<TransactionMessage>
A Kit TransactionMessage ready for signing, with blockhash and lifetime automatically set
Usage with Legacy Connection
import { Connection } from '@solana/web3.js' ;
import { createKitTransaction } from '@hermis/solana-headless-adapter-base' ;
const connection = new Connection ( 'https://api.devnet.solana.com' );
const transaction = await createKitTransaction (
connection ,
feePayerAddress ,
instructions
);
Usage with Kit Rpc
import { createSolanaRpc , devnet } from '@solana/kit' ;
import { createKitTransaction } from '@hermis/solana-headless-adapter-base' ;
const rpc = createSolanaRpc ( devnet ( 'https://api.devnet.solana.com' ));
const transaction = await createKitTransaction (
rpc ,
feePayerAddress ,
instructions
);
Complete Example
import {
createKitSignersFromAdapter ,
createKitTransaction ,
adapterSupportsMessageSigning ,
adapterSupportsTransactionSending ,
getStandardWalletAdapters
} from '@hermis/solana-headless-adapter-base' ;
import { createSolanaRpc , devnet } from '@solana/kit' ;
import { getTransferSolInstruction } from '@solana-program/system' ;
import { lamports } from '@solana/kit' ;
// Auto-detect wallet-standard compatible wallets
const adapters = getStandardWalletAdapters ([]);
const adapter = adapters [ 0 ]; // Use first detected wallet
await adapter . connect ();
// Check capabilities
console . log ( 'Supports message signing:' , adapterSupportsMessageSigning ( adapter ));
console . log ( 'Supports transaction sending:' , adapterSupportsTransactionSending ( adapter ));
// Create RPC connection (network auto-detected from endpoint)
const rpc = createSolanaRpc ( devnet ( 'https://api.devnet.solana.com' ));
// Create Kit signers
const { address , addressString , messageSigner , transactionSigner } =
createKitSignersFromAdapter ( adapter , rpc );
if ( ! address || ! transactionSigner ) {
throw new Error ( 'Wallet not ready' );
}
console . log ( 'Connected address:' , addressString );
// Create transaction using helper
const transaction = await createKitTransaction (
rpc ,
address ,
[
getTransferSolInstruction ({
source: address ,
destination: recipientAddress ,
amount: lamports ( 1000000 n )
})
]
);
Type Definitions
interface KitSigners {
/** Kit Address type (null if wallet not connected) */
address : Address < string > | null ;
/** Plain address string (null if wallet not connected) */
addressString : string | null ;
/** Message signer (null if wallet doesn't support signing or not connected) */
messageSigner : MessageModifyingSigner < string > | null ;
/** Transaction sending signer (null if wallet doesn't support or not connected) */
transactionSigner : TransactionSendingSigner < string > | null ;
}
type SolanaNetwork = 'mainnet' | 'devnet' | 'testnet' ;