#[deprecated(
since = "1.8.0",
note = "Please use `solana_stake_interface::state` instead"
)]
pub use solana_stake_interface::state::*;
use {
solana_account::{state_traits::StateMut, AccountSharedData, ReadableAccount},
solana_clock::Epoch,
solana_pubkey::Pubkey,
solana_rent::Rent,
solana_sdk_ids::stake::id,
solana_stake_interface::stake_flags::StakeFlags,
solana_vote_interface::state::VoteStateV4,
};
pub fn from<T: ReadableAccount + StateMut<StakeStateV2>>(account: &T) -> Option<StakeStateV2> {
account.state().ok()
}
pub fn stake_from<T: ReadableAccount + StateMut<StakeStateV2>>(account: &T) -> Option<Stake> {
from(account).and_then(|state: StakeStateV2| state.stake())
}
pub fn delegation_from(account: &AccountSharedData) -> Option<Delegation> {
from(account).and_then(|state: StakeStateV2| state.delegation())
}
pub fn authorized_from(account: &AccountSharedData) -> Option<Authorized> {
from(account).and_then(|state: StakeStateV2| state.authorized())
}
pub fn lockup_from<T: ReadableAccount + StateMut<StakeStateV2>>(account: &T) -> Option<Lockup> {
from(account).and_then(|state: StakeStateV2| state.lockup())
}
pub fn meta_from(account: &AccountSharedData) -> Option<Meta> {
from(account).and_then(|state: StakeStateV2| state.meta())
}
fn new_stake(stake: u64, voter_pubkey: &Pubkey, credits: u64, activation_epoch: Epoch) -> Stake {
Stake {
delegation: Delegation::new(voter_pubkey, stake, activation_epoch),
credits_observed: credits,
}
}
pub fn create_lockup_stake_account(
authorized: &Authorized,
lockup: &Lockup,
rent: &Rent,
lamports: u64,
) -> AccountSharedData {
let mut stake_account = AccountSharedData::new(lamports, StakeStateV2::size_of(), &id());
let rent_exempt_reserve = rent.minimum_balance(stake_account.data().len());
assert!(
lamports >= rent_exempt_reserve,
"lamports: {lamports} is less than rent_exempt_reserve {rent_exempt_reserve}"
);
stake_account
.set_state(&StakeStateV2::Initialized(Meta {
authorized: *authorized,
lockup: *lockup,
rent_exempt_reserve,
}))
.expect("set_state");
stake_account
}
pub fn create_account(
authorized: &Pubkey,
voter_pubkey: &Pubkey,
vote_account: &AccountSharedData,
rent: &Rent,
lamports: u64,
) -> AccountSharedData {
do_create_account(
authorized,
voter_pubkey,
vote_account,
rent,
lamports,
Epoch::MAX,
)
}
fn do_create_account(
authorized: &Pubkey,
voter_pubkey: &Pubkey,
vote_account: &AccountSharedData,
rent: &Rent,
lamports: u64,
activation_epoch: Epoch,
) -> AccountSharedData {
let mut stake_account = AccountSharedData::new(lamports, StakeStateV2::size_of(), &id());
let vote_state = VoteStateV4::deserialize(vote_account.data(), voter_pubkey).unwrap();
let credits = vote_state.credits();
let rent_exempt_reserve = rent.minimum_balance(stake_account.data().len());
stake_account
.set_state(&StakeStateV2::Stake(
Meta {
authorized: Authorized::auto(authorized),
rent_exempt_reserve,
..Meta::default()
},
new_stake(
lamports - rent_exempt_reserve, voter_pubkey,
credits,
activation_epoch,
),
StakeFlags::empty(),
))
.expect("set_state");
stake_account
}