From ec441fef54fc9e4df15ab65ab0634b049daf8505 Mon Sep 17 00:00:00 2001 From: Hardhat Chad Date: Fri, 5 Jul 2024 15:26:06 +0000 Subject: [PATCH] Disallow crowning if last stake was less than one minute ago --- program/src/crown.rs | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/program/src/crown.rs b/program/src/crown.rs index 39e3d93..8849f9c 100644 --- a/program/src/crown.rs +++ b/program/src/crown.rs @@ -1,10 +1,12 @@ use ore_api::{ + consts::ONE_MINUTE, + error::OreError, loaders::*, state::{Config, Proof}, }; use solana_program::{ - account_info::AccountInfo, entrypoint::ProgramResult, program_error::ProgramError, - pubkey::Pubkey, + account_info::AccountInfo, clock::Clock, entrypoint::ProgramResult, + program_error::ProgramError, pubkey::Pubkey, sysvar::Sysvar, }; use crate::utils::AccountDeserialize; @@ -23,15 +25,23 @@ pub fn process_crown<'a, 'info>( load_config(config_info, true)?; load_any_proof(proof_new_info, false)?; - // Load config - let mut config_data = config_info.data.borrow_mut(); - let config = Config::try_from_bytes_mut(&mut config_data)?; - - // Load proposed new top staker + // Load the proof accounts. + let clock = Clock::get().unwrap(); let proof_new_data = proof_new_info.data.borrow(); let proof_new = Proof::try_from_bytes(&proof_new_data)?; + if proof_new + .last_stake_at + .saturating_add(ONE_MINUTE) + .gt(&clock.unix_timestamp) + { + return Err(OreError::CannotCrown.into()); + } - // If top staker is the defualt null balance, skip this. + // If top staker is the default null address, skip this. + let mut config_data = config_info.data.borrow_mut(); + let config = Config::try_from_bytes_mut(&mut config_data)?; + let proof_data = proof_info.data.borrow(); + let proof = Proof::try_from_bytes(&proof_data)?; if config.top_staker.ne(&Pubkey::new_from_array([0; 32])) { // Load current top staker load_any_proof(proof_info, false)?; @@ -40,14 +50,12 @@ pub fn process_crown<'a, 'info>( } // Compare balances - let proof_data = proof_info.data.borrow(); - let proof = Proof::try_from_bytes(&proof_data)?; if proof_new.balance.lt(&proof.balance) { return Ok(()); } } - // Crown the new top staker + // Crown the new top staker. config.max_stake = proof_new.balance; config.top_staker = *proof_new_info.key;