From dc7f89715a8ecbc325dd3e0c810337119311d7b7 Mon Sep 17 00:00:00 2001 From: Trent Nelson Date: Thu, 19 Nov 2020 12:53:05 -0700 Subject: [PATCH] stake: De-replicode mergable info extraction --- programs/stake/src/stake_state.rs | 42 +++++++++++++++---------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/programs/stake/src/stake_state.rs b/programs/stake/src/stake_state.rs index cf80b452c8..a8a208a140 100644 --- a/programs/stake/src/stake_state.rs +++ b/programs/stake/src/stake_state.rs @@ -1055,31 +1055,12 @@ impl<'a> StakeAccount for KeyedAccount<'a> { return Err(InstructionError::IncorrectProgramId); } - let meta = match self.state()? { - StakeState::Stake(meta, stake) => { - // stake must be fully de-activated - if stake.stake(clock.epoch, Some(stake_history), true) != 0 { - return Err(StakeError::MergeActivatedStake.into()); - } - meta - } - StakeState::Initialized(meta) => meta, - _ => return Err(InstructionError::InvalidAccountData), - }; + let meta = get_info_if_mergable(self, clock, stake_history)?; + // Authorized staker is allowed to split/merge accounts meta.authorized.check(signers, StakeAuthorize::Staker)?; - let source_meta = match source_stake.state()? { - StakeState::Stake(meta, stake) => { - // stake must be fully de-activated - if stake.stake(clock.epoch, Some(stake_history), true) != 0 { - return Err(StakeError::MergeActivatedStake.into()); - } - meta - } - StakeState::Initialized(meta) => meta, - _ => return Err(InstructionError::InvalidAccountData), - }; + let source_meta = get_info_if_mergable(source_stake, clock, stake_history)?; // Meta must match for both accounts if meta != source_meta { @@ -1168,6 +1149,23 @@ impl<'a> StakeAccount for KeyedAccount<'a> { } } +fn get_info_if_mergable( + stake_keyed_account: &KeyedAccount, + clock: &Clock, + stake_history: &StakeHistory, +) -> Result { + match stake_keyed_account.state()? { + StakeState::Stake(meta, stake) => { + // stake must be fully de-activated + if stake.stake(clock.epoch, Some(stake_history), true) != 0 { + return Err(StakeError::MergeActivatedStake.into()); + } + Ok(meta) + } + StakeState::Initialized(meta) => Ok(meta), + _ => Err(InstructionError::InvalidAccountData), + } +} // utility function, used by runtime // returns a tuple of (stakers_reward,voters_reward) pub fn redeem_rewards(