multiple deactivation (#6354)
This commit is contained in:
parent
dfca2b510b
commit
41067de5e4
|
@ -20,6 +20,7 @@ use solana_sdk::{
|
||||||
pub enum StakeError {
|
pub enum StakeError {
|
||||||
NoCreditsToRedeem,
|
NoCreditsToRedeem,
|
||||||
LockupInForce,
|
LockupInForce,
|
||||||
|
AlreadyDeactivated,
|
||||||
}
|
}
|
||||||
impl<E> DecodeError<E> for StakeError {
|
impl<E> DecodeError<E> for StakeError {
|
||||||
fn type_of() -> &'static str {
|
fn type_of() -> &'static str {
|
||||||
|
@ -31,6 +32,7 @@ impl std::fmt::Display for StakeError {
|
||||||
match self {
|
match self {
|
||||||
StakeError::NoCreditsToRedeem => write!(f, "not enough credits to redeem"),
|
StakeError::NoCreditsToRedeem => write!(f, "not enough credits to redeem"),
|
||||||
StakeError::LockupInForce => write!(f, "lockup has not yet expired"),
|
StakeError::LockupInForce => write!(f, "lockup has not yet expired"),
|
||||||
|
StakeError::AlreadyDeactivated => write!(f, "stake already deactivated"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -396,8 +396,13 @@ impl Stake {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn deactivate(&mut self, epoch: u64) {
|
fn deactivate(&mut self, epoch: u64) -> Result<(), StakeError> {
|
||||||
|
if self.deactivation_epoch != std::u64::MAX {
|
||||||
|
Err(StakeError::AlreadyDeactivated)
|
||||||
|
} else {
|
||||||
self.deactivation_epoch = epoch;
|
self.deactivation_epoch = epoch;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -512,7 +517,7 @@ impl<'a> StakeAccount for KeyedAccount<'a> {
|
||||||
) -> Result<(), InstructionError> {
|
) -> Result<(), InstructionError> {
|
||||||
if let StakeState::Stake(authorized, lockup, mut stake) = self.state()? {
|
if let StakeState::Stake(authorized, lockup, mut stake) = self.state()? {
|
||||||
authorized.check(signers, StakeAuthorize::Staker)?;
|
authorized.check(signers, StakeAuthorize::Staker)?;
|
||||||
stake.deactivate(clock.epoch);
|
stake.deactivate(clock.epoch)?;
|
||||||
|
|
||||||
self.set_state(&StakeState::Stake(authorized, lockup, stake))
|
self.set_state(&StakeState::Stake(authorized, lockup, stake))
|
||||||
} else {
|
} else {
|
||||||
|
@ -1250,6 +1255,12 @@ mod tests {
|
||||||
stake_keyed_account.deactivate_stake(&clock, &signers),
|
stake_keyed_account.deactivate_stake(&clock, &signers),
|
||||||
Ok(())
|
Ok(())
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// verify that deactivate() only works once
|
||||||
|
assert_eq!(
|
||||||
|
stake_keyed_account.deactivate_stake(&clock, &signers),
|
||||||
|
Err(StakeError::AlreadyDeactivated.into())
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
Loading…
Reference in New Issue