solana: Raise stake minimum delegation
Problem
Stake accounts have a very low minimum delegation requirement (just 1 lamport, on top of being rent exempt). This may cause the number of stake accounts to be higher than necessary, which affects both #20384 and #21604.
Proposed Solution
Raise the minimum delegation for stake accounts. Right now the minimum delegation is 1 lamport. I feel the minimum delegation should be much higher (i.e. >= 1 SOL).
Details
Minimum Balance and Rent
Currently, stake accounts must be rent exempt. At the moment, this amount cannot be staked, so an additional 1 lamport is required for new accounts. For the sake of this proposal, the rent exempt reserve concept shall not be changed, just the additional balance. This means that the minimum delegation is currently 1 lamport, and I’m proposing increasing that to 1 SOL.
Creating Accounts
No changes needed.
Delegating
The minimum delegation amount will increase from 1 lamport. A new error StakeError::InsufficientDelegation will indicate if the requested delegation amount is below the minimum.
Split/Withdraw
Stake accounts’ balance shall stay at-or-above the minimum balance, similar to creating stake accounts. With the one exception of withdrawing all lamports/closing the account.
If the stake account is already delegated, then both the source and destination accounts must retain a delegation amount at least the minimum delegation.
Querying the Minimum Delegation Amount
As to not change the stake account’s data structure, new functions/instructions will be added to query the minimum delegation for stake accounts.
Governance/Voting
Voting/approving this proposal will use the feature proposal program to handle the governance.
Related
- Reducing the minimum delegation for the stake pool program
Other Protocols
Ethereum
Eth 2 requires 32 ETH to stake to be a validator. Smaller amounts of eth can be staked in stake pools. link
Avalanche
The minimum amount required to stake to a delegator is 25 AVAX (not counting pools), and 2000 AVAX to be a validator. link
Polkadot
From what I can tell, nominating has a minimum of 80 DOT (about to be 120 DOT), which I believe is like staking to a delegator. link
Fantom
Staking on Fantom has a 1 FTM minimum. link
Tasks
- #23259
- #23303
- #23456
- #23442
- #22663
- #23426
- #24019
- #24690
- #25202
- #26564
- #24603
- Carry out the feature proposal
- Testnet
- Devnet
- Mainnet-Beta
- Remove old feature gate code after sufficient time has passed
- #25336
- #26695
Features
About this issue
- Original URL
- State: open
- Created 2 years ago
- Reactions: 2
- Comments: 40 (40 by maintainers)
From my data
total stake accounts are 587,000
Setting a stake delegation of 0.1 SOL or even 0.01 SOL would also achieve a significant reduction with less of a burden on small users and be more future compatible for changes in the SOL price affecting people’s ability to create accounts meeting the min delegation.
1 SOL is arbitrary, as are all numbers, but sub-1 SOL accounts account for 38.3% of stakes, while sub 0.1 SOL accounts account for 23.5% of stakes, while being a 10x reduction in min delegation amount.
At the same time the underlying issue of rewards computation shouldn’t depend on us having to continuously artificially reduce the number of stake accounts somehow.
My vote is for 0.1 SOL = 100m lamports.
(Edited to add more data:
Everstake has 51k stakes with active stake <1 SOL, might be worth reaching out to Exodus about how they prompt users on stake creation.
Chorus and and stake.systems have 45k accounts between them which have an average active stake of < 0.05 SOL in aggregate. For Chorus the avg stake of these accounts is incredibly low at 0.029 SOL.
The top 4 validators by delegated stakes <1 SOL account for 113,500 stake accounts, or over 50% of all stakes below 1 SOL.
Top 50 validators sorted by no of accounts delegated with active stake < 1 SOL attached.
All numbers are on active (delegated) stake, and exclude rent exempt reserve and deactivated stake accounts.
For anyone wishing to parse the data themselves,
solana stakesmostly times out due to inefficient encoding, this gPA call returns in ~15 seconds all accounts with parsed data:/end more data)
Running some queries with Geyser:
Number of stake accounts with lamports < 1 SOL = 537,899 Number of all stake accounts: 587,209 Percentage of stake accounts with lamports < 1 SOL is about 91.6%
I know you’re already taken the sysvar approach but what about making use of the new return value feature instead to get the minimum value? The stake program could have a
get_minimum_delegationinstruction which returns the value. I prefer this approach because it requires less work than setting up a new syscall to get the sysvar value.It’s valuable because it gives validators a way to limit the amount of epoch boundary calculations they need to do to deliver rewards to stakers (https://github.com/solana-labs/solana/issues/20384). I’m less worried about the account data size because rent fee adjustments can be made if account data gets too large. We just don’t have any knobs to turn if the number of stake delegations grows large at the moment.
Valuable because it’s up to the network to decide how staking economics change. Why do you bring this up? Implementation can make use of the feature proposal program as you’ve already outlined in the issue tasks.
In my opinion, not too valuable. I’d prefer we move quicker to add the ability for the cluster to counteract excessive stake delegations without blocking on new runtime functionality like account-less sysvars.
Sysvar make sense, and one that is not supported by account passing, just
.get()A sysvar would be useful for programs (like stake pool programs) so they can read the current minimum balance from the cluster instead of hard coding it
Sorry the CLI isn’t very clear on this in its help text – if a split-stake operation is done, does it have to be to a new stake account? Or can it be into a stake account in the same state (active/not active) and delegation (either both not delegated, or both delegated to the same validator)?
If it must be a new stake account, then a minimum of 1 SOL in a stake account would mean that it’s not possible to split-stake off less than 1 SOL. I think this would be a big issue, because users who want to profit-take on their own schedule would be unable to do so.
a question that came up from a wallet team regarding what happens to existing stake accounts that are below the minimum stake threshold, recording here for posterity:
from @brooksprumo:
Yeah, I would implement
getviaimpl_sysvar_getand not theSysvartrait. This would be the first to do it so you might run into funnyness.Nonce and vote accounts are both versioned https://github.com/solana-labs/solana/blob/ae76fe2bd74ab0b7ef579486f8034380ccdc7df2/sdk/program/src/nonce/state/mod.rs https://github.com/solana-labs/solana/blob/ae76fe2bd74ab0b7ef579486f8034380ccdc7df2/programs/vote/src/vote_state/vote_state_versions.rs
sysvar sgtm. i’d suggest that we avoid some of the pains of the past and think forward. assume we’ll extend it in the future, so wrap it in a versioned
StakeProgramConfigstruct.It’s certainly possible but that’s not great. The stake program can check whether the feature is enabled itself actually, the bank doesn’t need to tell it. Such a feature could be enabled by the workflow that the feature-proposal program provides
Any limit can be reduced as code is improved to safely support more stake accounts
Probably with this: https://spl.solana.com/feature-proposal
Instead of a core contributor holding the private key for a feature activation, we can use a PDA from the feature proposal program.