Overview
Stake accounts allow you to delegate SOL tokens to validators, helping secure the network and earning rewards. When you stake tokens, you give validators more influence in determining valid blocks, and in return, you earn newly generated SOL periodically as rewards.
Prerequisites
Create a Stake Account
Creating a stake account involves generating a keypair for the account address and transferring tokens into it.
Generate stake account keypair
Create a keypair for the new stake account:solana-keygen new --no-passphrase -o stake-account.json
Output:Generating a new keypair
For added security, enter a BIP39 passphrase
NOTE! This passphrase improves security of the recovery seed phrase NOT the
keypair file itself, which is stored as insecure plain text
BIP39 Passphrase (empty for none):
Wrote new keypair to stake-account.json
================================================================================
pubkey: GKvqsuNcnwWqPzzuhLmGi4rzzh55FhJtGizkhHaEJqiV
================================================================================
Save this seed phrase and your BIP39 passphrase to recover your new keypair:
[seed phrase displayed here]
================================================================================
Save the public key (pubkey) - you’ll need it to reference this stake account.
Create the stake account
Transfer SOL into a new stake account:solana create-stake-account --from <KEYPAIR> stake-account.json <AMOUNT> \
--stake-authority <KEYPAIR> --withdraw-authority <KEYPAIR> \
--fee-payer <KEYPAIR>
Example:solana create-stake-account --from ~/my-wallet.json stake-account.json 5 \
--stake-authority ~/my-wallet.json --withdraw-authority ~/my-wallet.json \
--fee-payer ~/my-wallet.json
This creates a stake account with 5 SOL. Discard keypair file
The stake-account.json file can now be safely deleted. All future operations use the stake account address (pubkey) and the authority keypairs.
View stake account
Check the new stake account:solana stake-account <STAKE_ACCOUNT_ADDRESS>
Output:Total Stake: 5000 SOL
Stake account is undelegated
Stake Authority: EXU95vqs93yPeCeAU7mPPu6HbRUmTFPEiGug9oCdvQ5F
Withdraw Authority: EXU95vqs93yPeCeAU7mPPu6HbRUmTFPEiGug9oCdvQ5F
Use ALL Keyword
Transfer all available SOL from the funding account:
solana create-stake-account --from <KEYPAIR> stake-account.json ALL \
--stake-authority <KEYPAIR> --withdraw-authority <KEYPAIR> \
--fee-payer <KEYPAIR>
Stake and Withdraw Authorities
Stake accounts have two types of authorities:
- Stake Authority - Can delegate stake, deactivate stake, and split stake accounts
- Withdraw Authority - Can withdraw tokens from the stake account
Set Authorities During Creation
Specify authorities when creating the account:
solana create-stake-account --from ~/funding.json stake-account.json 100 \
--stake-authority ~/stake-authority.json \
--withdraw-authority ~/withdraw-authority.json \
--fee-payer ~/funding.json
Change Stake Authority
Update the stake authority after creation:
solana stake-authorize <STAKE_ACCOUNT_ADDRESS> \
--stake-authority <KEYPAIR> --new-stake-authority <PUBKEY> \
--fee-payer <KEYPAIR>
Example:
solana stake-authorize GKvqsuNcnwWqPzzuhLmGi4rzzh55FhJtGizkhHaEJqiV \
--stake-authority ~/old-authority.json \
--new-stake-authority 8nP3jDvPwhTzv8VpE4pRi8pJGhhtC5T9kB8aU9Ltzfsg \
--fee-payer ~/fee-payer.json
Change Withdraw Authority
Update the withdraw authority:
solana stake-authorize <STAKE_ACCOUNT_ADDRESS> \
--withdraw-authority <KEYPAIR> --new-withdraw-authority <PUBKEY> \
--fee-payer <KEYPAIR>
Delegate Stake
Delegating stake assigns your tokens to a validator, giving them voting weight and earning you rewards.
Find a validator
List all validators and their vote accounts:Output:Identity | Vote Account | Commission | Last Vote | Stake
---------------------------------------------+----------------------------------------------+------------+--------------+-------------------
8nP3jDvPwhTzv8VpE4pRi8pJGhhtC5T9kB8aU9Ltzfsg | 9QU2QSxhb24FUX3Tu2FpczXjpK3VYrvRudywSZaM29mF | 10% | 98765432 | 1234567.890 SOL
The first column is the validator identity, the second is the vote account address. Choose a validator and copy its vote account address. Delegate to validator
Delegate your stake account to the chosen validator:solana delegate-stake --stake-authority <KEYPAIR> <STAKE_ACCOUNT_ADDRESS> <VOTE_ACCOUNT_ADDRESS> \
--fee-payer <KEYPAIR>
Example:solana delegate-stake --stake-authority ~/my-wallet.json \
GKvqsuNcnwWqPzzuhLmGi4rzzh55FhJtGizkhHaEJqiV \
9QU2QSxhb24FUX3Tu2FpczXjpK3VYrvRudywSZaM29mF \
--fee-payer ~/my-wallet.json
Verify delegation
Check the stake account to confirm delegation:solana stake-account <STAKE_ACCOUNT_ADDRESS>
Output:Total Stake: 5000 SOL
Credits Observed: 147462
Delegated Stake: 4999.99771712 SOL
Delegated Vote Account Address: 9QU2QSxhb24FUX3Tu2FpczXjpK3VYrvRudywSZaM29mF
Stake activates starting from epoch: 42
Stake Authority: EXU95vqs93yPeCeAU7mPPu6HbRUmTFPEiGug9oCdvQ5F
Withdraw Authority: EXU95vqs93yPeCeAU7mPPu6HbRUmTFPEiGug9oCdvQ5F
Note the “Delegated Vote Account Address” and “Stake activates starting from epoch” fields.
Stake activation is not immediate. It takes effect at the beginning of the next epoch. Epochs typically last 2-3 days.
Deactivate Stake
To undelegate stake (stop staking with a validator), deactivate the stake account.
solana deactivate-stake --stake-authority <KEYPAIR> <STAKE_ACCOUNT_ADDRESS> \
--fee-payer <KEYPAIR>
Example:
solana deactivate-stake --stake-authority ~/my-wallet.json \
GKvqsuNcnwWqPzzuhLmGi4rzzh55FhJtGizkhHaEJqiV \
--fee-payer ~/my-wallet.json
Deactivation with Derived Address
If the stake account was created at a derived address (see Derived Addresses), include the seed:
solana deactivate-stake --stake-authority <KEYPAIR> --seed <STRING> <STAKE_ACCOUNT_ADDRESS> \
--fee-payer <KEYPAIR>
Deactivate from Delinquent Validator
Force deactivation from a delinquent (non-voting) validator:
solana deactivate-stake --stake-authority <KEYPAIR> --delinquent <STAKE_ACCOUNT_ADDRESS> \
--fee-payer <KEYPAIR>
Stake takes several epochs to “cool down” after deactivation. You cannot redelegate or withdraw until the cool-down period completes.
Withdraw Stake
Withdraw tokens from a stake account to another account.
solana withdraw-stake --withdraw-authority <KEYPAIR> <STAKE_ACCOUNT_ADDRESS> <RECIPIENT_ADDRESS> <AMOUNT> \
--fee-payer <KEYPAIR>
Example:
solana withdraw-stake --withdraw-authority ~/my-wallet.json \
GKvqsuNcnwWqPzzuhLmGi4rzzh55FhJtGizkhHaEJqiV \
8nP3jDvPwhTzv8VpE4pRi8pJGhhtC5T9kB8aU9Ltzfsg \
100 \
--fee-payer ~/my-wallet.json
This withdraws 100 SOL to the recipient address.
Withdrawal Amount Keywords
ALL - Withdraw the maximum amount allowed:
solana withdraw-stake --withdraw-authority <KEYPAIR> <STAKE_ACCOUNT_ADDRESS> <RECIPIENT> ALL \
--fee-payer <KEYPAIR>
AVAILABLE - Withdraw only the currently withdrawable portion:
solana withdraw-stake --withdraw-authority <KEYPAIR> <STAKE_ACCOUNT_ADDRESS> <RECIPIENT> AVAILABLE \
--fee-payer <KEYPAIR>
The withdrawable amount depends on whether stake is active, cooling down, fully inactive, and any applicable lockups.
Split Stake
Transfer part of a stake account to a new stake account. Useful for delegating to multiple validators while stake is active or cooling down.
solana split-stake --stake-authority <KEYPAIR> <STAKE_ACCOUNT_ADDRESS> <NEW_STAKE_ACCOUNT_KEYPAIR> <AMOUNT> \
--fee-payer <KEYPAIR>
Example:
solana-keygen new --no-passphrase -o new-stake.json
solana split-stake --stake-authority ~/my-wallet.json \
GKvqsuNcnwWqPzzuhLmGi4rzzh55FhJtGizkhHaEJqiV \
new-stake.json \
1000 \
--fee-payer ~/my-wallet.json
This moves 1000 SOL from the existing stake account to a new stake account.
Split Requirements
- The split amount must be at least the cluster’s minimum delegation (typically 1 SOL)
- The new account must be rent-exempt
- Both accounts will have the same authorities and delegation state
Specify Rent-Exempt Reserve
When signing offline transactions, explicitly provide the rent-exempt amount:
solana split-stake --stake-authority <KEYPAIR> <STAKE_ACCOUNT_ADDRESS> <NEW_STAKE_ACCOUNT_KEYPAIR> <AMOUNT> \
--rent-exempt-reserve-sol <RENT_EXEMPT_AMOUNT> --fee-payer <KEYPAIR>
Derived Stake Account Addresses
For managing multiple stake accounts, derive addresses from a base keypair and seed instead of creating separate keypair files.
Create with Seed
solana create-stake-account --from <KEYPAIR> <STAKE_ACCOUNT_KEYPAIR> --seed <STRING> <AMOUNT> \
--stake-authority <PUBKEY> --withdraw-authority <PUBKEY> --fee-payer <KEYPAIR>
Example:
solana create-stake-account --from ~/my-wallet.json ~/base-keypair.json --seed "0" 100 \
--stake-authority ~/my-wallet.json --withdraw-authority ~/my-wallet.json \
--fee-payer ~/my-wallet.json
The <STRING> is an arbitrary string up to 32 bytes. Common practice is to use sequential numbers: “0”, “1”, “2”, etc.
Calculate Derived Address
Preview the derived address before creating:
solana create-address-with-seed --from <PUBKEY> <SEED_STRING> STAKE
Example:
solana create-address-with-seed --from EXU95vqs93yPeCeAU7mPPu6HbRUmTFPEiGug9oCdvQ5F "0" STAKE
Output:
3F2KkdLLXJHBvYJnqDWwHqVh3aEqrKDjHb7Ws4qNxcJh
Split to Derived Address
Split stake to a derived address:
solana split-stake --stake-authority <KEYPAIR> <STAKE_ACCOUNT_ADDRESS> \
<BASE_KEYPAIR> --seed <STRING> <AMOUNT> \
--fee-payer <KEYPAIR>
Check Stake Activation
Monitor stake activation status:
solana stake-account <STAKE_ACCOUNT_ADDRESS>
Look for:
- “Stake account is undelegated” - Not yet delegated
- “Stake activates starting from epoch: N” - Will activate at epoch N
- “Delegated Stake: X SOL” - Currently active stake amount
View All Stake Accounts
List all stake accounts owned by a wallet:
solana stakes <WALLET_ADDRESS>
Output:
Stake Account | Validator | State | Stake (SOL)
---------------------------------------------+----------------------------------------------+-----------+-------------
GKvqsuNcnwWqPzzuhLmGi4rzzh55FhJtGizkhHaEJqiV | 9QU2QSxhb24FUX3Tu2FpczXjpK3VYrvRudywSZaM29mF | active | 5000.000000
Stake Rewards
Rewards are automatically added to your stake account balance each epoch. View accumulated rewards by checking your stake account balance over time.
Calculate Expected Rewards
The reward rate depends on:
- Total network stake
- Inflation rate
- Validator commission
- Validator performance
Typical annual percentage yield (APY) on Solana ranges from 5-7%.
Claim Rewards
Rewards are automatically added to your stake account. No manual claiming required.
To access rewards:
- Deactivate stake
- Wait for cool-down period
- Withdraw funds
Stake Account Management Strategies
Single Validator
Simplest approach - delegate all stake to one validator:
# Create and delegate
solana create-stake-account --from wallet.json stake.json 1000 \
--stake-authority wallet.json --withdraw-authority wallet.json
solana delegate-stake --stake-authority wallet.json stake-address vote-address
Multiple Validators
Spread stake across multiple validators for diversification:
solana create-stake-account --from wallet.json base.json --seed "0" 500 \
--stake-authority wallet.json --withdraw-authority wallet.json
solana delegate-stake --stake-authority wallet.json stake-address-0 vote-address-1
Redelegate Without Downtime
Switch validators without unstaking:
Split stake account
solana split-stake --stake-authority wallet.json existing-stake new-stake.json 500
Delegate to new validator
solana delegate-stake --stake-authority wallet.json new-stake-address new-vote-address
Deactivate original (optional)
solana deactivate-stake --stake-authority wallet.json existing-stake
Common Operations
Check Balance
solana balance <STAKE_ACCOUNT_ADDRESS>
Merge Stake Accounts
Merge two stake accounts (must be delegated to same validator or both inactive):
solana stake-merge <STAKE_ACCOUNT_1> <STAKE_ACCOUNT_2> \
--stake-authority <KEYPAIR> \
--fee-payer <KEYPAIR>
Set Lockup
Lock stake until a specific time:
solana stake-set-lockup <STAKE_ACCOUNT_ADDRESS> \
--lockup-epoch <EPOCH> \
--lockup-date <UNIX_TIMESTAMP> \
--new-custodian <PUBKEY> \
--withdraw-authority <KEYPAIR>
Best Practices
- Separate Authorities: Use different keypairs for stake and withdraw authorities
- Hardware Wallets: Store withdraw authority on hardware wallet
- Diversify: Delegate to multiple validators to reduce risk
- Monitor Performance: Regularly check validator performance and commission
- Secure Backups: Maintain secure backups of authority keypairs
- Test on Devnet: Practice stake operations on Devnet before mainnet
- Track Rewards: Monitor stake account balance to track reward accrual
Troubleshooting
Insufficient Funds
Ensure the funding account has enough SOL for:
- Stake amount
- Rent-exempt minimum (~0.00228 SOL)
- Transaction fees (~0.000005 SOL per transaction)
Stake Not Activating
Stake activates at the beginning of the next epoch. Check:
- Current epoch:
solana epoch-info
- Activation epoch shown in
solana stake-account
Cannot Withdraw
Reasons withdrawal might fail:
- Stake is still active (must deactivate first)
- Still in cool-down period (wait for next epoch)
- Lockup period hasn’t expired
- Attempting to withdraw below minimum rent-exempt amount
Authority Errors
Verify you’re using the correct authority:
- Delegation operations require stake authority
- Withdrawals require withdraw authority
- Check current authorities:
solana stake-account <ADDRESS>
Next Steps