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:
parent
75ef68ffe8
commit
6bcb77dcfa
|
@ -56,6 +56,7 @@ use {
|
||||||
},
|
},
|
||||||
stake_history::{Epoch, StakeHistory},
|
stake_history::{Epoch, StakeHistory},
|
||||||
system_instruction::{self, SystemError},
|
system_instruction::{self, SystemError},
|
||||||
|
system_program,
|
||||||
sysvar::{clock, stake_history},
|
sysvar::{clock, stake_history},
|
||||||
transaction::Transaction,
|
transaction::Transaction,
|
||||||
},
|
},
|
||||||
|
@ -1980,15 +1981,26 @@ pub fn process_split_stake(
|
||||||
|
|
||||||
let rent_exempt_reserve = if !sign_only {
|
let rent_exempt_reserve = if !sign_only {
|
||||||
if let Ok(stake_account) = rpc_client.get_account(&split_stake_account_address) {
|
if let Ok(stake_account) = rpc_client.get_account(&split_stake_account_address) {
|
||||||
let err_msg = if stake_account.owner == stake::program::id() {
|
if stake_account.owner == stake::program::id() {
|
||||||
format!("Stake account {split_stake_account_address} already exists")
|
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 {
|
} else {
|
||||||
format!(
|
return Err(CliError::BadParameter(format!(
|
||||||
"Account {split_stake_account_address} already exists and is not a stake \
|
"Account {split_stake_account_address} already exists and cannot be used to split stake"
|
||||||
account"
|
))
|
||||||
)
|
.into());
|
||||||
};
|
}
|
||||||
return Err(CliError::BadParameter(err_msg).into());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let minimum_balance =
|
let minimum_balance =
|
||||||
|
|
Loading…
Reference in New Issue