Skip to content
This repository was archived by the owner on Mar 11, 2025. It is now read-only.
Merged
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
208 changes: 77 additions & 131 deletions token/cli/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,7 @@ use solana_clap_utils::{
};
use solana_cli_output::{display::println_name_value, return_signers, OutputFormat};
use solana_client::{
blockhash_query::BlockhashQuery, rpc_client::RpcClient, rpc_config::RpcSendTransactionConfig,
rpc_request::TokenAccountsFilter,
blockhash_query::BlockhashQuery, rpc_client::RpcClient, rpc_request::TokenAccountsFilter,
};
use solana_remote_wallet::remote_wallet::RemoteWalletManager;
use solana_sdk::{
Expand Down Expand Up @@ -146,7 +145,6 @@ struct Config<'a> {
verbose: bool,
owner: Pubkey,
fee_payer: Pubkey,
commitment_config: CommitmentConfig,
default_signer: DefaultSigner,
nonce_account: Option<Pubkey>,
nonce_authority: Option<Pubkey>,
Expand All @@ -165,10 +163,7 @@ fn new_throwaway_signer() -> (Option<Box<dyn Signer>>, Option<Pubkey>) {
}

fn check_fee_payer_balance(config: &Config, required_balance: u64) -> Result<(), Error> {
let balance = config
.rpc_client
.get_balance_with_commitment(&config.fee_payer, config.commitment_config)?
.value;
let balance = config.rpc_client.get_balance(&config.fee_payer)?;
if balance < required_balance {
Err(format!(
"Fee payer, {}, has insufficient balance: {} required, {} available",
Expand All @@ -183,10 +178,7 @@ fn check_fee_payer_balance(config: &Config, required_balance: u64) -> Result<(),
}

fn check_owner_balance(config: &Config, required_balance: u64) -> Result<(), Error> {
let balance = config
.rpc_client
.get_balance_with_commitment(&config.owner, config.commitment_config)?
.value;
let balance = config.rpc_client.get_balance(&config.owner)?;
if balance < required_balance {
Err(format!(
"Owner, {}, has insufficient balance: {} required, {} available",
Expand Down Expand Up @@ -306,14 +298,9 @@ fn command_create_account(
)
};

if let Some(account_data) = config
.rpc_client
.get_account_with_commitment(&account, config.commitment_config)?
.value
{
if !(account_data.owner == system_program::id() && system_account_ok) {
return Err(format!("Error: Account already exists: {}", account).into());
}
let account_data = config.rpc_client.get_account(&account)?;
if !(account_data.owner == system_program::id() && system_account_ok) {
return Err(format!("Error: Account already exists: {}", account).into());
}

Ok(Some((
Expand Down Expand Up @@ -407,8 +394,7 @@ fn resolve_mint_info(
if !config.sign_only {
let source_account = config
.rpc_client
.get_token_account_with_commitment(&token_account, config.commitment_config)?
.value
.get_token_account(&token_account)?
.ok_or_else(|| format!("Could not find token account {}", token_account))?;
Ok((
Pubkey::from_str(&source_account.mint)?,
Expand Down Expand Up @@ -462,64 +448,55 @@ fn command_transfer(
let mut recipient_token_account = recipient;
let mut minimum_balance_for_rent_exemption = 0;

if let Some(account_data) = config
.rpc_client
.get_account_with_commitment(&recipient, config.commitment_config)?
.value
{
if account_data.owner == system_program::id() {
recipient_token_account = get_associated_token_address(&recipient, &mint_pubkey);
println!(
" Recipient associated token account: {}",
recipient_token_account
);
let account_data = config.rpc_client.get_account(&recipient)?;
if account_data.owner == system_program::id() {
recipient_token_account = get_associated_token_address(&recipient, &mint_pubkey);
println!(
" Recipient associated token account: {}",
recipient_token_account
);

let needs_funding = if let Some(recipient_token_account_data) = config
.rpc_client
.get_account_with_commitment(&recipient_token_account, config.commitment_config)?
.value
{
if recipient_token_account_data.owner == system_program::id() {
true
} else if recipient_token_account_data.owner == spl_token::id() {
false
} else {
return Err(
format!("Error: Unsupported recipient address: {}", recipient).into(),
);
}
} else {
let needs_funding = if let Some(recipient_token_account_data) = config
.rpc_client
.get_account_with_commitment(&recipient_token_account, config.rpc_client.commitment())?
.value
{
if recipient_token_account_data.owner == system_program::id() {
true
};
} else if recipient_token_account_data.owner == spl_token::id() {
false
} else {
return Err(format!("Error: Unsupported recipient address: {}", recipient).into());
}
} else {
true
};

if needs_funding {
if fund_recipient {
minimum_balance_for_rent_exemption += config
.rpc_client
.get_minimum_balance_for_rent_exemption(Account::LEN)?;
println!(
" Funding recipient: {} ({} SOL)",
recipient_token_account,
lamports_to_sol(minimum_balance_for_rent_exemption)
);
instructions.push(create_associated_token_account(
&config.fee_payer,
&recipient,
&mint_pubkey,
));
} else {
return Err(
"Error: Recipient's associated token account does not exist. \
if needs_funding {
if fund_recipient {
minimum_balance_for_rent_exemption += config
.rpc_client
.get_minimum_balance_for_rent_exemption(Account::LEN)?;
println!(
" Funding recipient: {} ({} SOL)",
recipient_token_account,
lamports_to_sol(minimum_balance_for_rent_exemption)
);
instructions.push(create_associated_token_account(
&config.fee_payer,
&recipient,
&mint_pubkey,
));
} else {
return Err(
"Error: Recipient's associated token account does not exist. \
Add `--fund-recipient` to fund their account"
.into(),
);
}
.into(),
);
}
} else if account_data.owner != spl_token::id() {
return Err(format!("Error: Unsupported recipient address: {}", recipient).into());
}
} else {
return Err(format!("Error: Recipient does not exist: {}", recipient).into());
} else if account_data.owner != spl_token::id() {
return Err(format!("Error: Unsupported recipient address: {}", recipient).into());
}

instructions.push(transfer_checked(
Expand Down Expand Up @@ -649,12 +626,7 @@ fn command_unwrap(config: &Config, address: Pubkey) -> CommandResult {
if !config.sign_only {
println!(
" Amount: {} SOL",
lamports_to_sol(
config
.rpc_client
.get_balance_with_commitment(&address, config.commitment_config)?
.value
),
lamports_to_sol(config.rpc_client.get_balance(&address)?),
);
}
println!(" Recipient: {}", &config.owner);
Expand Down Expand Up @@ -702,8 +674,7 @@ fn command_revoke(config: &Config, account: Pubkey, delegate: Option<Pubkey>) ->
let delegate = if !config.sign_only {
let source_account = config
.rpc_client
.get_token_account_with_commitment(&account, config.commitment_config)?
.value
.get_token_account(&account)?
.ok_or_else(|| format!("Could not find token account {}", account))?;
if let Some(string) = source_account.delegate {
Some(Pubkey::from_str(&string)?)
Expand Down Expand Up @@ -736,8 +707,7 @@ fn command_close(config: &Config, account: Pubkey, destination: Pubkey) -> Comma
if !config.sign_only {
let source_account = config
.rpc_client
.get_token_account_with_commitment(&account, config.commitment_config)?
.value
.get_token_account(&account)?
.ok_or_else(|| format!("Could not find token account {}", account))?;

if !source_account.is_native && source_account.token_amount.ui_amount > 0.0 {
Expand All @@ -760,10 +730,7 @@ fn command_close(config: &Config, account: Pubkey, destination: Pubkey) -> Comma
}

fn command_balance(config: &Config, address: Pubkey) -> CommandResult {
let balance = config
.rpc_client
.get_token_account_balance_with_commitment(&address, config.commitment_config)?
.value;
let balance = config.rpc_client.get_token_account_balance(&address)?;

if config.verbose {
println!("ui amount: {}", balance.ui_amount);
Expand All @@ -776,27 +743,20 @@ fn command_balance(config: &Config, address: Pubkey) -> CommandResult {
}

fn command_supply(config: &Config, address: Pubkey) -> CommandResult {
let supply = config
.rpc_client
.get_token_supply_with_commitment(&address, config.commitment_config)?
.value;
let supply = config.rpc_client.get_token_supply(&address)?;

println!("{}", supply.ui_amount);
Ok(None)
}

fn command_accounts(config: &Config, token: Option<Pubkey>) -> CommandResult {
let accounts = config
.rpc_client
.get_token_accounts_by_owner_with_commitment(
&config.owner,
match token {
Some(token) => TokenAccountsFilter::Mint(token),
None => TokenAccountsFilter::ProgramId(spl_token::id()),
},
config.commitment_config,
)?
.value;
let accounts = config.rpc_client.get_token_accounts_by_owner(
&config.owner,
match token {
Some(token) => TokenAccountsFilter::Mint(token),
None => TokenAccountsFilter::ProgramId(spl_token::id()),
},
)?;
if accounts.is_empty() {
println!("None");
}
Expand Down Expand Up @@ -853,14 +813,10 @@ fn command_accounts(config: &Config, token: Option<Pubkey>) -> CommandResult {

fn command_gc(config: &Config) -> CommandResult {
println!("Fetching token accounts");
let accounts = config
.rpc_client
.get_token_accounts_by_owner_with_commitment(
&config.owner,
TokenAccountsFilter::ProgramId(spl_token::id()),
config.commitment_config,
)?
.value;
let accounts = config.rpc_client.get_token_accounts_by_owner(
&config.owner,
TokenAccountsFilter::ProgramId(spl_token::id()),
)?;
if accounts.is_empty() {
println!("Nothing to do");
return Ok(None);
Expand Down Expand Up @@ -1005,11 +961,7 @@ fn stringify_ui_token_amount_trimmed(amount: &UiTokenAmount) -> String {
}

fn command_account_info(config: &Config, address: Pubkey) -> CommandResult {
let account = config
.rpc_client
.get_token_account_with_commitment(&address, config.commitment_config)?
.value
.unwrap();
let account = config.rpc_client.get_token_account(&address)?.unwrap();
println!();
println_name_value("Address:", &address.to_string());
println_name_value(
Expand Down Expand Up @@ -1043,11 +995,7 @@ fn command_account_info(config: &Config, address: Pubkey) -> CommandResult {
}

fn get_multisig(config: &Config, address: &Pubkey) -> Result<Multisig, Error> {
let account = config
.rpc_client
.get_account_with_commitment(&address, config.commitment_config)?
.value
.ok_or(format!("account does not exist: {}", address))?;
let account = config.rpc_client.get_account(&address)?;
Multisig::unpack(&account.data).map_err(|e| e.into())
}

Expand Down Expand Up @@ -1709,11 +1657,13 @@ fn main() {
let multisigner_pubkeys = multisigner_ids.iter().collect::<Vec<_>>();

Config {
rpc_client: RpcClient::new(json_rpc_url),
rpc_client: RpcClient::new_with_commitment(
json_rpc_url,
CommitmentConfig::single_gossip(),
),
verbose,
owner,
fee_payer,
commitment_config: CommitmentConfig::single_gossip(),
default_signer,
nonce_account,
nonce_authority,
Expand Down Expand Up @@ -1990,7 +1940,10 @@ fn main() {
};
let (recent_blockhash, fee_calculator) = config
.blockhash_query
.get_blockhash_and_fee_calculator(&config.rpc_client, config.commitment_config)
.get_blockhash_and_fee_calculator(
&config.rpc_client,
config.rpc_client.commitment(),
)
.unwrap_or_else(|e| {
eprintln!("error: {}", e);
exit(1);
Expand All @@ -2012,14 +1965,7 @@ fn main() {
transaction.try_sign(&signer_info.signers, recent_blockhash)?;
let signature = config
.rpc_client
.send_and_confirm_transaction_with_spinner_and_config(
&transaction,
config.commitment_config,
RpcSendTransactionConfig {
preflight_commitment: Some(config.commitment_config.commitment),
..RpcSendTransactionConfig::default()
},
)?;
.send_and_confirm_transaction_with_spinner(&transaction)?;
println!("Signature: {}", signature);
}
}
Expand Down