feature flag cleanup: stake_split_uses_rent_sysvar (#32407)
This commit is contained in:
parent
c172dfd268
commit
b3d9c87612
|
@ -16,11 +16,11 @@ use {
|
||||||
clock::{Clock, Epoch},
|
clock::{Clock, Epoch},
|
||||||
feature_set::{
|
feature_set::{
|
||||||
self, clean_up_delegation_errors, stake_merge_with_unmatched_credits_observed,
|
self, clean_up_delegation_errors, stake_merge_with_unmatched_credits_observed,
|
||||||
stake_split_uses_rent_sysvar, FeatureSet,
|
FeatureSet,
|
||||||
},
|
},
|
||||||
instruction::{checked_add, InstructionError},
|
instruction::{checked_add, InstructionError},
|
||||||
pubkey::Pubkey,
|
pubkey::Pubkey,
|
||||||
rent::{Rent, ACCOUNT_STORAGE_OVERHEAD},
|
rent::Rent,
|
||||||
stake::{
|
stake::{
|
||||||
config::Config,
|
config::Config,
|
||||||
instruction::{LockupArgs, StakeError},
|
instruction::{LockupArgs, StakeError},
|
||||||
|
@ -1195,7 +1195,6 @@ fn validate_split_amount(
|
||||||
let source_account = instruction_context
|
let source_account = instruction_context
|
||||||
.try_borrow_instruction_account(transaction_context, source_account_index)?;
|
.try_borrow_instruction_account(transaction_context, source_account_index)?;
|
||||||
let source_lamports = source_account.get_lamports();
|
let source_lamports = source_account.get_lamports();
|
||||||
let source_data_len = source_account.get_data().len();
|
|
||||||
drop(source_account);
|
drop(source_account);
|
||||||
let destination_account = instruction_context
|
let destination_account = instruction_context
|
||||||
.try_borrow_instruction_account(transaction_context, destination_account_index)?;
|
.try_borrow_instruction_account(transaction_context, destination_account_index)?;
|
||||||
|
@ -1236,19 +1235,8 @@ fn validate_split_amount(
|
||||||
// This must handle:
|
// This must handle:
|
||||||
// 1. The destination account having a different rent exempt reserve due to data size changes
|
// 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
|
// 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()?;
|
let rent = invoke_context.get_sysvar_cache().get_rent()?;
|
||||||
rent.minimum_balance(destination_data_len)
|
let destination_rent_exempt_reserve = 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 destination_minimum_balance =
|
let destination_minimum_balance =
|
||||||
destination_rent_exempt_reserve.saturating_add(additional_required_lamports);
|
destination_rent_exempt_reserve.saturating_add(additional_required_lamports);
|
||||||
let destination_balance_deficit =
|
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));
|
pub type RewriteStakeStatus = (&'static str, (u64, u64), (u64, u64));
|
||||||
|
|
||||||
// utility function, used by runtime::Stakes, tests
|
// 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]
|
#[test]
|
||||||
fn test_things_can_merge() {
|
fn test_things_can_merge() {
|
||||||
with_mock_invoke_context!(invoke_context, transaction_context, Vec::new());
|
with_mock_invoke_context!(invoke_context, transaction_context, Vec::new());
|
||||||
|
|
|
@ -70,11 +70,6 @@ impl Rent {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Minimum balance due for rent-exemption of a given account data size.
|
/// 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 {
|
pub fn minimum_balance(&self, data_len: usize) -> u64 {
|
||||||
let bytes = data_len as u64;
|
let bytes = data_len as u64;
|
||||||
(((ACCOUNT_STORAGE_OVERHEAD + bytes) * self.lamports_per_byte_year) as f64
|
(((ACCOUNT_STORAGE_OVERHEAD + bytes) * self.lamports_per_byte_year) as f64
|
||||||
|
|
Loading…
Reference in New Issue