Skip to content
This repository was archived by the owner on Mar 11, 2025. It is now read-only.

stake-pool: Remove lamport minimum for validator removal by staker #3999

Merged
merged 2 commits into from
Jan 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 1 addition & 25 deletions stake-pool/program/src/processor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1167,7 +1167,7 @@ impl Processor {
return Err(StakePoolError::InvalidState.into());
}

let (meta, stake) = get_stake_state(stake_account_info)?;
let (_, stake) = get_stake_state(stake_account_info)?;
let vote_account_address = stake.delegation.voter_pubkey;
let maybe_validator_stake_info = validator_list.find_mut::<ValidatorStakeInfo, _>(|x| {
ValidatorStakeInfo::memcmp_pubkey(x, &vote_account_address)
Expand All @@ -1193,30 +1193,6 @@ impl Processor {
return Err(StakePoolError::ValidatorNotFound.into());
}

let stake_lamports = **stake_account_info.lamports.borrow();
let stake_minimum_delegation = stake::tools::get_minimum_delegation()?;
let required_lamports = minimum_stake_lamports(&meta, stake_minimum_delegation);
if stake_lamports > required_lamports {
msg!(
"Attempting to remove validator account with {} lamports, must have no more than {} lamports; \
reduce using DecreaseValidatorStake first",
stake_lamports,
required_lamports
);
return Err(StakePoolError::StakeLamportsNotEqualToMinimum.into());
}

let current_minimum_delegation = minimum_delegation(stake_minimum_delegation);
if stake.delegation.stake > current_minimum_delegation {
msg!(
"Error: attempting to remove stake with delegation of {} lamports, must have no more than {} lamports; \
reduce using DecreaseValidatorStake first",
stake.delegation.stake,
current_minimum_delegation
);
return Err(StakePoolError::StakeLamportsNotEqualToMinimum.into());
}

let new_status = if validator_stake_info.transient_stake_lamports > 0 {
check_transient_stake_address(
program_id,
Expand Down
30 changes: 16 additions & 14 deletions stake-pool/program/tests/vsa_remove.rs
Original file line number Diff line number Diff line change
Expand Up @@ -212,18 +212,28 @@ async fn fail_with_wrong_validator_list_account() {
}

#[tokio::test]
async fn fail_not_at_minimum() {
async fn success_at_large_value() {
let (mut context, stake_pool_accounts, validator_stake) = setup().await;

transfer(
let current_minimum_delegation = stake_pool_get_minimum_delegation(
&mut context.banks_client,
&context.payer,
&context.last_blockhash,
&validator_stake.stake_account,
1_000_001,
)
.await;

let threshold_amount = current_minimum_delegation * 1_000;
let _ = simple_deposit_stake(
&mut context.banks_client,
&context.payer,
&context.last_blockhash,
&stake_pool_accounts,
&validator_stake,
threshold_amount,
)
.await
.unwrap();

let error = stake_pool_accounts
.remove_validator_from_pool(
&mut context.banks_client,
Expand All @@ -232,16 +242,8 @@ async fn fail_not_at_minimum() {
&validator_stake.stake_account,
&validator_stake.transient_stake_account,
)
.await
.unwrap()
.unwrap();
assert_eq!(
error,
TransactionError::InstructionError(
0,
InstructionError::Custom(StakePoolError::StakeLamportsNotEqualToMinimum as u32)
),
);
.await;
assert!(error.is_none());
}

#[tokio::test]
Expand Down