Signers are the bridge between transaction intent and cryptographic authorization.
In Solana Kit, the signer model is intentionally more expressive than “just a key pair” because real applications often need to distinguish:
- a fee payer
- a partial signer
- a signer that can modify a transaction before signing
- a signer that can also send a transaction
Start with a key-pair signer#
import 'package:solana_kit/solana_kit.dart';
final signer = await generateKeyPair();
print('Signer address: ${signer.address}');
A generated key pair is useful for:
- local testing
- backend automation
- server-side services
- examples and fixtures
Sign a message#
import 'package:solana_kit/solana_kit.dart';
final signer = await generateKeyPair();
final message = createSignableMessage('hello from Solana Kit');
final signatures = await signer.signMessages([message]);
print('Produced ${signatures.length} signature map(s)');
Attach a signer to a transaction message#
import 'package:solana_kit/solana_kit.dart';
final signer = await generateKeyPair();
final message = createTransactionMessage()
.pipe(setTransactionMessageFeePayerSigner(signer));
This is the most common starting point for building a signable transaction.
Understand signer roles#
solana_kit_signers separates roles so transaction pipelines stay explicit.
KeyPairSigner— local Ed25519 key pair plus signing methodsMessagePartialSigner— can sign signable off-chain messagesTransactionPartialSigner— can sign a compiled transactionTransactionModifyingSigner— can mutate a transaction before signing-
TransactionSendingSigner— can sign and immediately submit a transaction -
FeePayerSigner— indicates the signer is also the transaction fee payer
This modeling matters when integrating wallets, mobile adapters, remote signers, or multi-party signing flows.