From b3d9c8761229dce1f90b5b6eb19f279a501a6ac4 Mon Sep 17 00:00:00 2001 From: Justin Starry Date: Fri, 7 Jul 2023 09:01:39 -0500 Subject: [PATCH] feature flag cleanup: stake_split_uses_rent_sysvar (#32407) --- programs/stake/src/stake_state.rs | 70 ++----------------------------- sdk/program/src/rent.rs | 5 --- 2 files changed, 4 insertions(+), 71 deletions(-) diff --git a/programs/stake/src/stake_state.rs b/programs/stake/src/stake_state.rs index fc3d075004..f1b8ebc7a3 100644 --- a/programs/stake/src/stake_state.rs +++ b/programs/stake/src/stake_state.rs @@ -16,11 +16,11 @@ use { clock::{Clock, Epoch}, feature_set::{ self, clean_up_delegation_errors, stake_merge_with_unmatched_credits_observed, - stake_split_uses_rent_sysvar, FeatureSet, + FeatureSet, }, instruction::{checked_add, InstructionError}, pubkey::Pubkey, - rent::{Rent, ACCOUNT_STORAGE_OVERHEAD}, + rent::Rent, stake::{ config::Config, instruction::{LockupArgs, StakeError}, @@ -1195,7 +1195,6 @@ fn validate_split_amount( let source_account = instruction_context .try_borrow_instruction_account(transaction_context, source_account_index)?; let source_lamports = source_account.get_lamports(); - let source_data_len = source_account.get_data().len(); drop(source_account); let destination_account = instruction_context .try_borrow_instruction_account(transaction_context, destination_account_index)?; @@ -1236,19 +1235,8 @@ fn validate_split_amount( // This must handle: // 1. The destination account having a different rent exempt reserve due to data size changes // 2. The destination account being prefunded, which would lower the minimum split amount - let destination_rent_exempt_reserve = if invoke_context - .feature_set - .is_active(&stake_split_uses_rent_sysvar::ID) - { - let rent = invoke_context.get_sysvar_cache().get_rent()?; - rent.minimum_balance(destination_data_len) - } else { - calculate_split_rent_exempt_reserve( - source_meta.rent_exempt_reserve, - source_data_len as u64, - destination_data_len as u64, - ) - }; + let rent = invoke_context.get_sysvar_cache().get_rent()?; + let destination_rent_exempt_reserve = rent.minimum_balance(destination_data_len); let destination_minimum_balance = destination_rent_exempt_reserve.saturating_add(additional_required_lamports); let destination_balance_deficit = @@ -1599,19 +1587,6 @@ pub fn calculate_points( } } -// utility function, used by Split -//This emulates current Rent math in order to preserve backward compatibility. In the future, and -//to support variable rent, the Split instruction should pass in the Rent sysvar instead. -fn calculate_split_rent_exempt_reserve( - source_rent_exempt_reserve: u64, - source_data_len: u64, - split_data_len: u64, -) -> u64 { - let lamports_per_byte_year = - source_rent_exempt_reserve / (source_data_len + ACCOUNT_STORAGE_OVERHEAD); - lamports_per_byte_year * (split_data_len + ACCOUNT_STORAGE_OVERHEAD) -} - pub type RewriteStakeStatus = (&'static str, (u64, u64), (u64, u64)); // utility function, used by runtime::Stakes, tests @@ -2939,43 +2914,6 @@ mod tests { ); } - #[test] - fn test_calculate_lamports_per_byte_year() { - let rent = Rent::default(); - let data_len = 200u64; - let rent_exempt_reserve = rent.minimum_balance(data_len as usize); - assert_eq!( - calculate_split_rent_exempt_reserve(rent_exempt_reserve, data_len, data_len), - rent_exempt_reserve - ); - - let larger_data = 4008u64; - let larger_rent_exempt_reserve = rent.minimum_balance(larger_data as usize); - assert_eq!( - calculate_split_rent_exempt_reserve(rent_exempt_reserve, data_len, larger_data), - larger_rent_exempt_reserve - ); - assert_eq!( - calculate_split_rent_exempt_reserve(larger_rent_exempt_reserve, larger_data, data_len), - rent_exempt_reserve - ); - - let even_larger_data = solana_sdk::system_instruction::MAX_PERMITTED_DATA_LENGTH; - let even_larger_rent_exempt_reserve = rent.minimum_balance(even_larger_data as usize); - assert_eq!( - calculate_split_rent_exempt_reserve(rent_exempt_reserve, data_len, even_larger_data), - even_larger_rent_exempt_reserve - ); - assert_eq!( - calculate_split_rent_exempt_reserve( - even_larger_rent_exempt_reserve, - even_larger_data, - data_len - ), - rent_exempt_reserve - ); - } - #[test] fn test_things_can_merge() { with_mock_invoke_context!(invoke_context, transaction_context, Vec::new()); diff --git a/sdk/program/src/rent.rs b/sdk/program/src/rent.rs index ed21fbd1d5..b000e68d77 100644 --- a/sdk/program/src/rent.rs +++ b/sdk/program/src/rent.rs @@ -70,11 +70,6 @@ impl Rent { } /// Minimum balance due for rent-exemption of a given account data size. - /// - /// Note: a stripped-down version of this calculation is used in - /// `calculate_split_rent_exempt_reserve` in the stake program. When this - /// function is updated, eg. when making rent variable, the stake program - /// will need to be refactored. pub fn minimum_balance(&self, data_len: usize) -> u64 { let bytes = data_len as u64; (((ACCOUNT_STORAGE_OVERHEAD + bytes) * self.lamports_per_byte_year) as f64