stake-pool: Make activating / deactivating check stricter (#4002)

This commit is contained in:
Jon Cinque 2023-01-27 23:53:02 +01:00 committed by GitHub
parent ab67891480
commit cc3a56d1e4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 22 additions and 13 deletions

View File

@ -222,17 +222,19 @@ fn stake_is_inactive_without_history(stake: &stake::state::Stake, epoch: Epoch)
&& stake.delegation.deactivation_epoch == epoch) && stake.delegation.deactivation_epoch == epoch)
} }
/// Roughly checks if a stake account is deactivating or inactive /// Roughly checks if a stake account is deactivating
fn check_if_stake_is_deactivating_or_inactive( fn check_if_stake_deactivating(
account_info: &AccountInfo, account_info: &AccountInfo,
vote_account_address: &Pubkey, vote_account_address: &Pubkey,
epoch: Epoch,
) -> Result<(), ProgramError> { ) -> Result<(), ProgramError> {
let (_, stake) = get_stake_state(account_info)?; let (_, stake) = get_stake_state(account_info)?;
if stake.delegation.deactivation_epoch == Epoch::MAX { if stake.delegation.deactivation_epoch != epoch {
msg!( msg!(
"Existing stake {} delegated to {} is activating or active", "Existing stake {} delegated to {} not deactivated in epoch {}",
account_info.key, account_info.key,
vote_account_address vote_account_address,
epoch,
); );
Err(StakePoolError::WrongStakeState.into()) Err(StakePoolError::WrongStakeState.into())
} else { } else {
@ -240,17 +242,21 @@ fn check_if_stake_is_deactivating_or_inactive(
} }
} }
/// Roughly checks if a stake account is activating or active /// Roughly checks if a stake account is activating
fn check_if_stake_is_activating_or_active( fn check_if_stake_activating(
account_info: &AccountInfo, account_info: &AccountInfo,
vote_account_address: &Pubkey, vote_account_address: &Pubkey,
epoch: Epoch,
) -> Result<(), ProgramError> { ) -> Result<(), ProgramError> {
let (_, stake) = get_stake_state(account_info)?; let (_, stake) = get_stake_state(account_info)?;
if stake.delegation.deactivation_epoch != Epoch::MAX { if stake.delegation.deactivation_epoch != Epoch::MAX
|| stake.delegation.activation_epoch != epoch
{
msg!( msg!(
"Existing stake {} delegated to {} is deactivating or inactive", "Existing stake {} delegated to {} not activated in epoch {}",
account_info.key, account_info.key,
vote_account_address vote_account_address,
epoch,
); );
Err(StakePoolError::WrongStakeState.into()) Err(StakePoolError::WrongStakeState.into())
} else { } else {
@ -1349,9 +1355,10 @@ impl Processor {
); );
return Err(ProgramError::InvalidSeeds); return Err(ProgramError::InvalidSeeds);
} }
check_if_stake_is_deactivating_or_inactive( check_if_stake_deactivating(
transient_stake_account_info, transient_stake_account_info,
&vote_account_address, &vote_account_address,
clock.epoch,
)?; )?;
} }
@ -1600,9 +1607,10 @@ impl Processor {
); );
return Err(ProgramError::InvalidSeeds); return Err(ProgramError::InvalidSeeds);
} }
check_if_stake_is_activating_or_active( check_if_stake_activating(
transient_stake_account_info, transient_stake_account_info,
vote_account_address, vote_account_address,
clock.epoch,
)?; )?;
} }
@ -2053,9 +2061,10 @@ impl Processor {
destination_transient_stake_seed, destination_transient_stake_seed,
&stake_pool.lockup, &stake_pool.lockup,
)?; )?;
check_if_stake_is_activating_or_active( check_if_stake_activating(
destination_transient_stake_account_info, destination_transient_stake_account_info,
vote_account_address, vote_account_address,
clock.epoch,
)?; )?;
Self::stake_merge( Self::stake_merge(
stake_pool_info.key, stake_pool_info.key,