From bcd072c5e8bac58f0c086393f68055c58c610785 Mon Sep 17 00:00:00 2001 From: Justin Starry Date: Fri, 10 Jan 2020 12:25:07 +0800 Subject: [PATCH] Clarify account creation error messages in CLI (#7719) * Clarify account creation error messages in CLI * feedback * Fix rebase --- cli/src/nonce.rs | 18 ++++++++++++------ cli/src/stake.rs | 16 ++++++++++------ cli/src/storage.rs | 13 +++++++++++++ cli/src/vote.rs | 18 +++++++++++------- 4 files changed, 46 insertions(+), 19 deletions(-) diff --git a/cli/src/nonce.rs b/cli/src/nonce.rs index 6bd1a91472..df170c91f4 100644 --- a/cli/src/nonce.rs +++ b/cli/src/nonce.rs @@ -379,12 +379,18 @@ pub fn process_create_nonce_account( (&nonce_account_address, "nonce_account".to_string()), )?; - if rpc_client.get_account(&nonce_account_address).is_ok() { - return Err(CliError::BadParameter(format!( - "Unable to create nonce account. Nonce account already exists: {}", - nonce_account_pubkey, - )) - .into()); + if let Ok(nonce_account) = rpc_client.get_account(&nonce_account_address) { + let err_msg = if nonce_account.owner == system_program::id() + && State::::state(&nonce_account).is_ok() + { + format!("Nonce account {} already exists", nonce_account_address) + } else { + format!( + "Account {} already exists and is not a nonce account", + nonce_account_address + ) + }; + return Err(CliError::BadParameter(err_msg).into()); } let minimum_balance = rpc_client.get_minimum_balance_for_rent_exemption(NonceState::size())?; diff --git a/cli/src/stake.rs b/cli/src/stake.rs index f49b9f3840..c63fb73765 100644 --- a/cli/src/stake.rs +++ b/cli/src/stake.rs @@ -542,12 +542,16 @@ pub fn process_create_stake_account( (&stake_account_address, "stake_account".to_string()), )?; - if rpc_client.get_account(&stake_account_address).is_ok() { - return Err(CliError::BadParameter(format!( - "Unable to create stake account. Stake account already exists: {}", - stake_account_address - )) - .into()); + if let Ok(stake_account) = rpc_client.get_account(&stake_account_address) { + let err_msg = if stake_account.owner == solana_stake_program::id() { + format!("Stake account {} already exists", stake_account_address) + } else { + format!( + "Account {} already exists and is not a stake account", + stake_account_address + ) + }; + return Err(CliError::BadParameter(err_msg).into()); } let minimum_balance = diff --git a/cli/src/storage.rs b/cli/src/storage.rs index 93f7981001..56657e078b 100644 --- a/cli/src/storage.rs +++ b/cli/src/storage.rs @@ -163,6 +163,19 @@ pub fn process_create_storage_account( "storage_account_pubkey".to_string(), ), )?; + + if let Ok(storage_account) = rpc_client.get_account(&storage_account_pubkey) { + let err_msg = if storage_account.owner == solana_storage_program::id() { + format!("Storage account {} already exists", storage_account_pubkey) + } else { + format!( + "Account {} already exists and is not a storage account", + storage_account_pubkey + ) + }; + return Err(CliError::BadParameter(err_msg).into()); + } + use solana_storage_program::storage_contract::STORAGE_ACCOUNT_SPACE; let required_balance = rpc_client .get_minimum_balance_for_rent_exemption(STORAGE_ACCOUNT_SPACE as usize)? diff --git a/cli/src/vote.rs b/cli/src/vote.rs index ca49fe5311..e81ad7b0e9 100644 --- a/cli/src/vote.rs +++ b/cli/src/vote.rs @@ -9,10 +9,10 @@ use crate::{ use clap::{value_t_or_exit, App, Arg, ArgMatches, SubCommand}; use solana_clap_utils::{input_parsers::*, input_validators::*}; use solana_client::rpc_client::RpcClient; -use solana_sdk::signature::Keypair; use solana_sdk::{ account::Account, pubkey::Pubkey, + signature::Keypair, signature::KeypairUtil, system_instruction::{create_address_with_seed, SystemError}, transaction::Transaction, @@ -314,12 +314,16 @@ pub fn process_create_vote_account( (&identity_pubkey, "identity_pubkey".to_string()), )?; - if rpc_client.get_account(&vote_account_address).is_ok() { - return Err(CliError::BadParameter(format!( - "Unable to create vote account. Vote account already exists: {}", - vote_account_address - )) - .into()); + if let Ok(vote_account) = rpc_client.get_account(&vote_account_address) { + let err_msg = if vote_account.owner == solana_vote_program::id() { + format!("Vote account {} already exists", vote_account_address) + } else { + format!( + "Account {} already exists and is not a vote account", + vote_account_address + ) + }; + return Err(CliError::BadParameter(err_msg).into()); } let required_balance = rpc_client