relax stake split destination check (#162)

* relax stake split destination check

* change stake_account error handling logic

* fmt

* modify logic

* change error message when account is neither owned by stake program or system program

* add a comment explaining nested ifs in stake_account error handling

* fix typos in comments

* update comment
This commit is contained in:
Nagaprasad V R 2024-03-14 23:13:34 +05:30 committed by GitHub
parent 75ef68ffe8
commit 6bcb77dcfa
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 20 additions and 8 deletions

View File

@ -56,6 +56,7 @@ use {
},
stake_history::{Epoch, StakeHistory},
system_instruction::{self, SystemError},
system_program,
sysvar::{clock, stake_history},
transaction::Transaction,
},
@ -1980,15 +1981,26 @@ pub fn process_split_stake(
let rent_exempt_reserve = if !sign_only {
if let Ok(stake_account) = rpc_client.get_account(&split_stake_account_address) {
let err_msg = if stake_account.owner == stake::program::id() {
format!("Stake account {split_stake_account_address} already exists")
if stake_account.owner == stake::program::id() {
return Err(CliError::BadParameter(format!(
"Stake account {split_stake_account_address} already exists"
))
.into());
} else if stake_account.owner == system_program::id() {
if !stake_account.data.is_empty() {
return Err(CliError::BadParameter(format!(
"Account {split_stake_account_address} has data and cannot be used to split stake"
))
.into());
}
// if `stake_account`'s owner is the system_program and its data is
// empty, `stake_account` is allowed to receive the stake split
} else {
format!(
"Account {split_stake_account_address} already exists and is not a stake \
account"
)
};
return Err(CliError::BadParameter(err_msg).into());
return Err(CliError::BadParameter(format!(
"Account {split_stake_account_address} already exists and cannot be used to split stake"
))
.into());
}
}
let minimum_balance =