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

Commit 50b5597

Browse files
authored
stake-pool: Improve error when overdrawing on decrease (#2522)
1 parent 671590d commit 50b5597

File tree

2 files changed

+55
-6
lines changed

2 files changed

+55
-6
lines changed

stake-pool/program/src/processor.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1019,7 +1019,7 @@ impl Processor {
10191019
return Err(StakePoolError::InvalidState.into());
10201020
}
10211021

1022-
let (_meta, stake) = get_stake_state(validator_stake_account_info)?;
1022+
let (meta, stake) = get_stake_state(validator_stake_account_info)?;
10231023
let vote_account_address = stake.delegation.voter_pubkey;
10241024
check_validator_stake_address(
10251025
program_id,
@@ -1069,6 +1069,20 @@ impl Processor {
10691069
return Err(ProgramError::AccountNotRentExempt);
10701070
}
10711071

1072+
let remaining_lamports = validator_stake_account_info
1073+
.lamports()
1074+
.checked_sub(lamports)
1075+
.ok_or(ProgramError::InsufficientFunds)?;
1076+
let required_lamports = minimum_stake_lamports(&meta);
1077+
if remaining_lamports < required_lamports {
1078+
msg!("Need at least {} lamports in the stake account after decrease, {} requested, {} is the current possible maximum",
1079+
required_lamports,
1080+
lamports,
1081+
validator_stake_account_info.lamports().checked_sub(required_lamports).ok_or(StakePoolError::CalculationFailure)?
1082+
);
1083+
return Err(ProgramError::InsufficientFunds);
1084+
}
1085+
10721086
create_transient_stake_account(
10731087
transient_stake_account_info.clone(),
10741088
transient_stake_account_signer_seeds,

stake-pool/program/tests/decrease.rs

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ async fn fail_with_small_lamport_amount() {
367367
}
368368

369369
#[tokio::test]
370-
async fn fail_overdraw_validator() {
370+
async fn fail_big_overdraw() {
371371
let (
372372
mut banks_client,
373373
payer,
@@ -392,8 +392,43 @@ async fn fail_overdraw_validator() {
392392
.unwrap()
393393
.unwrap();
394394

395-
match error {
396-
TransactionError::InstructionError(_, InstructionError::InsufficientFunds) => {}
397-
_ => panic!("Wrong error occurs while overdrawing stake account on decrease"),
398-
}
395+
assert_eq!(
396+
error,
397+
TransactionError::InstructionError(0, InstructionError::InsufficientFunds)
398+
);
399+
}
400+
401+
#[tokio::test]
402+
async fn fail_overdraw() {
403+
let (
404+
mut banks_client,
405+
payer,
406+
recent_blockhash,
407+
stake_pool_accounts,
408+
validator_stake,
409+
deposit_info,
410+
_decrease_lamports,
411+
) = setup().await;
412+
413+
let rent = banks_client.get_rent().await.unwrap();
414+
let stake_rent = rent.minimum_balance(std::mem::size_of::<stake_program::StakeState>());
415+
416+
let error = stake_pool_accounts
417+
.decrease_validator_stake(
418+
&mut banks_client,
419+
&payer,
420+
&recent_blockhash,
421+
&validator_stake.stake_account,
422+
&validator_stake.transient_stake_account,
423+
deposit_info.stake_lamports + stake_rent + 1,
424+
validator_stake.transient_stake_seed,
425+
)
426+
.await
427+
.unwrap()
428+
.unwrap();
429+
430+
assert_eq!(
431+
error,
432+
TransactionError::InstructionError(0, InstructionError::InsufficientFunds)
433+
);
399434
}

0 commit comments

Comments
 (0)