Skip to content
Merged
Show file tree
Hide file tree
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
3,794 changes: 1,635 additions & 2,159 deletions Cargo.lock

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
RUST_TOOLCHAIN_NIGHTLY = nightly-2025-02-16
SOLANA_CLI_VERSION = 2.3.4
SOLANA_CLI_VERSION = 3.0.0

nightly = +${RUST_TOOLCHAIN_NIGHTLY}

Expand Down
40 changes: 21 additions & 19 deletions clients/cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,33 +21,35 @@ futures = "0.3"
serde = "1.0.219"
serde_derive = "1.0.103"
serde_json = "1.0.142"
solana-account-decoder = "2.3.4"
solana-clap-v3-utils = "2.3.4"
solana-cli-config = "2.3.4"
solana-cli-output = "2.3.4"
solana-client = "2.3.4"
solana-account-decoder = "3.0.0"
solana-clap-v3-utils = "3.0.0"
solana-cli-config = "3.0.0"
solana-cli-output = "3.0.0"
solana-client = "3.0.0"
solana-commitment-config = "3.0.0"
solana-logger = "3.0.0"
solana-remote-wallet = "2.3.4"
solana-sdk = "2.2.1"
solana-system-interface = "1"
solana-transaction-status = "2.3.4"
spl-associated-token-account-client = { version = "2.0.0" }
spl-pod = { version = "0.5.1" }
spl-token = { version = "8.0", features = ["no-entrypoint"] }
spl-token-2022-interface = { version = "1.0.0" }
solana-remote-wallet = "3.0.0"
solana-sdk = "3.0.0"
solana-system-interface = "2"
solana-transaction-status = "3.0.0"
spl-associated-token-account-interface = { version = "2.0.0" }
spl-pod = { version = "0.7.1" }
spl-token-interface = "2.0.0"
spl-token-2022-interface = { version = "2.0.0", path = "../../interface" }
spl-token-2022 = { version = "9.0.0", path = "../../program", features = ["no-entrypoint"] }
spl-token-client = { version = "0.17.0", path = "../rust-legacy" }
spl-token-confidential-transfer-proof-generation = { version = "0.4.1" }
spl-token-metadata-interface = { version = "0.7.0" }
spl-token-group-interface = { version = "0.6.0" }
spl-memo = { version = "6.0", features = ["no-entrypoint"] }
spl-token-confidential-transfer-proof-generation = { version = "0.5.0", path = "../../confidential/proof-generation" }
spl-token-metadata-interface = { version = "0.8.0" }
spl-token-group-interface = { version = "0.7.0" }
spl-memo-interface = "2.0.0"
strum = "0.27"
strum_macros = "0.27"
tokio = "1.47"

[dev-dependencies]
solana-sdk-ids = "2.2.1"
solana-test-validator = "2.3.4"
solana-nonce = "3.0.0"
solana-sdk-ids = "3.0.0"
solana-test-validator = "3.0.0"
assert_cmd = "2.0.17"
libtest-mimic = "0.8"
serial_test = "3.2.0"
Expand Down
14 changes: 8 additions & 6 deletions clients/cli/src/bench.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@ use {
crate::{clap_app::Error, command::CommandResult, config::Config},
clap::ArgMatches,
solana_clap_v3_utils::input_parsers::{pubkey_of_signer, Amount},
solana_cli_output::display::build_balance_message,
solana_client::{
nonblocking::rpc_client::RpcClient, rpc_client::RpcClient as BlockingRpcClient,
tpu_client::TpuClient, tpu_client::TpuClientConfig,
},
solana_remote_wallet::remote_wallet::RemoteWalletManager,
solana_sdk::{
message::Message, native_token::lamports_to_sol, native_token::Sol, program_pack::Pack,
pubkey::Pubkey, signature::Signer,
message::Message, native_token::Sol, program_pack::Pack, pubkey::Pubkey, signature::Signer,
},
solana_system_interface::instruction as system_instruction,
spl_associated_token_account_client::address::get_associated_token_address_with_program_id,
spl_associated_token_account_interface::address::get_associated_token_address_with_program_id,
spl_token_2022_interface::{
extension::StateWithExtensions,
instruction,
Expand Down Expand Up @@ -253,7 +253,9 @@ async fn command_deposit_into_or_withdraw_from(
config.check_account(&from_or_to, Some(*token)).await?;
let amount = match ui_amount {
Amount::Raw(ui_amount) => ui_amount,
Amount::Decimal(ui_amount) => spl_token::ui_amount_to_amount(ui_amount, mint_info.decimals),
Amount::Decimal(ui_amount) => {
spl_token_2022::ui_amount_to_amount(ui_amount, mint_info.decimals)
}
Amount::All => {
return Err(
"Use of ALL keyword currently not supported for the bench command"
Expand Down Expand Up @@ -372,8 +374,8 @@ async fn check_fee_payer_balance(config: &Config<'_>, required_balance: u64) ->
Err(format!(
"Fee payer, {}, has insufficient balance: {} required, {} available",
config.fee_payer()?.pubkey(),
lamports_to_sol(required_balance),
lamports_to_sol(balance)
build_balance_message(required_balance, false, false),
build_balance_message(balance, false, false)
)
.into())
} else {
Expand Down
3 changes: 2 additions & 1 deletion clients/cli/src/clap_app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,8 @@ impl OfflineArgs for clap::Command<'_> {
}
}

pub static VALID_TOKEN_PROGRAM_IDS: [Pubkey; 2] = [spl_token_2022_interface::ID, spl_token::ID];
pub static VALID_TOKEN_PROGRAM_IDS: [Pubkey; 2] =
[spl_token_2022_interface::ID, spl_token_interface::ID];

#[derive(AsRefStr, Debug, Clone, Copy, PartialEq, EnumString, IntoStaticStr)]
#[strum(serialize_all = "kebab-case")]
Expand Down
60 changes: 35 additions & 25 deletions clients/cli/src/command.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,20 +21,19 @@ use {
keypair::signer_from_path,
},
solana_cli_output::{
return_signers_data, CliSignOnlyData, CliSignature, OutputFormat, QuietDisplay,
ReturnSignersConfig, VerboseDisplay,
display::build_balance_message, return_signers_data, CliSignOnlyData, CliSignature,
OutputFormat, QuietDisplay, ReturnSignersConfig, VerboseDisplay,
},
solana_client::rpc_request::TokenAccountsFilter,
solana_remote_wallet::remote_wallet::RemoteWalletManager,
solana_sdk::{
instruction::AccountMeta,
native_token::*,
program_option::COption,
pubkey::Pubkey,
signature::{Keypair, Signer},
},
solana_system_interface::program as system_program,
spl_associated_token_account_client::address::get_associated_token_address_with_program_id,
spl_associated_token_account_interface::address::get_associated_token_address_with_program_id,
spl_pod::optional_keys::OptionalNonZeroPubkey,
spl_token_2022::extension::confidential_transfer::account_info::{
ApplyPendingBalanceAccountInfo, TransferAccountInfo, WithdrawAccountInfo,
Expand Down Expand Up @@ -95,7 +94,7 @@ fn print_error_and_exit<T, E: Display>(e: E) -> T {
fn amount_to_raw_amount(amount: Amount, decimals: u8, all_amount: Option<u64>, name: &str) -> u64 {
match amount {
Amount::Raw(ui_amount) => ui_amount,
Amount::Decimal(ui_amount) => spl_token::ui_amount_to_amount(ui_amount, decimals),
Amount::Decimal(ui_amount) => spl_token_2022::ui_amount_to_amount(ui_amount, decimals),
Amount::All => {
if let Some(raw_amount) = all_amount {
raw_amount
Expand Down Expand Up @@ -145,8 +144,8 @@ async fn check_wallet_balance(
Err(format!(
"Wallet {}, has insufficient balance: {} required, {} available",
wallet,
lamports_to_sol(required_balance),
lamports_to_sol(balance)
build_balance_message(required_balance, false, false),
build_balance_message(balance, false, false)
)
.into())
} else {
Expand Down Expand Up @@ -822,7 +821,7 @@ async fn command_set_transfer_fee(
"Setting transfer fee for {} to {} bps, {} maximum",
token_pubkey,
transfer_fee_basis_points,
spl_token::amount_to_ui_amount(maximum_fee, decimals)
spl_token_2022::amount_to_ui_amount(maximum_fee, decimals)
),
);

Expand Down Expand Up @@ -877,7 +876,7 @@ async fn command_create_account(
}

if immutable_owner {
if config.program_id == spl_token::id() {
if config.program_id == spl_token_interface::id() {
return Err(format!(
"Specified --immutable, but token program {} does not support the extension",
config.program_id
Expand Down Expand Up @@ -1331,7 +1330,9 @@ async fn command_transfer(
// the amount the user wants to transfer, as a u64
let transfer_balance = match ui_amount {
Amount::Raw(ui_amount) => ui_amount,
Amount::Decimal(ui_amount) => spl_token::ui_amount_to_amount(ui_amount, mint_info.decimals),
Amount::Decimal(ui_amount) => {
spl_token_2022::ui_amount_to_amount(ui_amount, mint_info.decimals)
}
Amount::All => {
if config.sign_only {
return Err("Use of ALL keyword to burn tokens requires online signing"
Expand All @@ -1351,7 +1352,7 @@ async fn command_transfer(
} else {
""
},
spl_token::amount_to_ui_amount(transfer_balance, mint_info.decimals),
spl_token_2022::amount_to_ui_amount(transfer_balance, mint_info.decimals),
sender,
recipient
),
Expand Down Expand Up @@ -1806,7 +1807,9 @@ async fn command_burn(

let amount = match ui_amount {
Amount::Raw(ui_amount) => ui_amount,
Amount::Decimal(ui_amount) => spl_token::ui_amount_to_amount(ui_amount, mint_info.decimals),
Amount::Decimal(ui_amount) => {
spl_token_2022::ui_amount_to_amount(ui_amount, mint_info.decimals)
}
Amount::All => {
if config.sign_only {
return Err("Use of ALL keyword to burn tokens requires online signing"
Expand All @@ -1821,7 +1824,7 @@ async fn command_burn(
config,
format!(
"Burn {} tokens\n Source: {}",
spl_token::amount_to_ui_amount(amount, mint_info.decimals),
spl_token_2022::amount_to_ui_amount(amount, mint_info.decimals),
account
),
);
Expand Down Expand Up @@ -1861,7 +1864,7 @@ async fn command_mint(
config,
format!(
"Minting {} tokens\n Token: {}\n Recipient: {}",
spl_token::amount_to_ui_amount(amount, mint_info.decimals),
spl_token_2022::amount_to_ui_amount(amount, mint_info.decimals),
token,
recipient
),
Expand Down Expand Up @@ -1973,12 +1976,14 @@ async fn command_wrap(
immutable_owner: bool,
bulk_signers: BulkSigners,
) -> CommandResult {
let lamports = match amount {
Amount::Raw(amount) => amount,
Amount::Decimal(amount) => sol_to_lamports(amount),
let lamports = match amount.sol_to_lamport() {
Amount::All => {
return Err("ALL keyword not supported for SOL amount".into());
}
Amount::Raw(amount) => amount,
Amount::Decimal(_) => {
unreachable!();
}
};
let token = native_token_client_from_config(config)?;

Expand All @@ -1989,7 +1994,7 @@ async fn command_wrap(
config,
format!(
"Wrapping {} SOL into {}",
lamports_to_sol(lamports),
build_balance_message(lamports, false, false),
account
),
);
Expand All @@ -2005,7 +2010,7 @@ async fn command_wrap(
}

let res = if immutable_owner {
if config.program_id == spl_token::id() {
if config.program_id == spl_token_interface::id() {
return Err(format!(
"Specified --immutable, but token program {} does not support the extension",
config.program_id
Expand Down Expand Up @@ -2070,7 +2075,10 @@ async fn command_unwrap(

println_display(
config,
format!(" Amount: {} SOL", lamports_to_sol(account_data.lamports)),
format!(
" Amount: {} SOL",
build_balance_message(account_data.lamports, false, false)
),
);
}

Expand Down Expand Up @@ -2116,7 +2124,7 @@ async fn command_approve(
config,
format!(
"Approve {} tokens\n Account: {}\n Delegate: {}",
spl_token::amount_to_ui_amount(amount, mint_info.decimals),
spl_token_2022::amount_to_ui_amount(amount, mint_info.decimals),
account,
delegate
),
Expand Down Expand Up @@ -2337,7 +2345,7 @@ async fn command_accounts(
vec![TokenAccountsFilter::ProgramId(config.program_id)]
} else {
vec![
TokenAccountsFilter::ProgramId(spl_token::id()),
TokenAccountsFilter::ProgramId(spl_token_interface::id()),
TokenAccountsFilter::ProgramId(spl_token_2022_interface::id()),
]
};
Expand Down Expand Up @@ -3366,7 +3374,9 @@ async fn command_deposit_withdraw_confidential_tokens(
// the amount the user wants to deposit or withdraw, as a u64
let amount = match ui_amount {
Amount::Raw(ui_amount) => ui_amount,
Amount::Decimal(ui_amount) => spl_token::ui_amount_to_amount(ui_amount, mint_info.decimals),
Amount::Decimal(ui_amount) => {
spl_token_2022::ui_amount_to_amount(ui_amount, mint_info.decimals)
}
Amount::All => {
if config.sign_only {
return Err("Use of ALL keyword to burn tokens requires online signing"
Expand All @@ -3388,7 +3398,7 @@ async fn command_deposit_withdraw_confidential_tokens(
config,
format!(
"Depositing {} confidential tokens",
spl_token::amount_to_ui_amount(amount, mint_info.decimals),
spl_token_2022::amount_to_ui_amount(amount, mint_info.decimals),
),
);
let current_balance = state_with_extension.base.amount;
Expand All @@ -3408,7 +3418,7 @@ async fn command_deposit_withdraw_confidential_tokens(
config,
format!(
"Withdrawing {} confidential tokens",
spl_token::amount_to_ui_amount(amount, mint_info.decimals)
spl_token_2022::amount_to_ui_amount(amount, mint_info.decimals)
),
);
}
Expand Down
9 changes: 5 additions & 4 deletions clients/cli/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,13 @@ use {
},
solana_cli_output::OutputFormat,
solana_client::nonblocking::rpc_client::RpcClient,
solana_commitment_config::CommitmentConfig,
solana_remote_wallet::remote_wallet::RemoteWalletManager,
solana_sdk::{
account::Account as RawAccount, commitment_config::CommitmentConfig, hash::Hash,
pubkey::Pubkey, signature::Signer, signer::null_signer::NullSigner,
account::Account as RawAccount, hash::Hash, pubkey::Pubkey, signature::Signer,
signer::null_signer::NullSigner,
},
spl_associated_token_account_client::address::get_associated_token_address_with_program_id,
spl_associated_token_account_interface::address::get_associated_token_address_with_program_id,
spl_token_2022_interface::{
extension::StateWithExtensionsOwned,
state::{Account, Mint},
Expand Down Expand Up @@ -280,7 +281,7 @@ impl<'a> Config<'a> {
.and_then(|pubkey| Pubkey::from_str(pubkey).ok())
};

let default_program_id = spl_token::id();
let default_program_id = spl_token_interface::id();
let (program_id, restrict_to_program_id) = if matches.is_present("program_2022") {
(spl_token_2022_interface::id(), true)
} else if let Some(program_id) = pubkey_from_matches("program_id") {
Expand Down
2 changes: 1 addition & 1 deletion clients/cli/src/sort.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use {
solana_account_decoder::{parse_token::TokenAccountType, UiAccountData},
solana_client::rpc_response::RpcKeyedAccount,
solana_sdk::pubkey::Pubkey,
spl_associated_token_account_client::address::get_associated_token_address_with_program_id,
spl_associated_token_account_interface::address::get_associated_token_address_with_program_id,
std::{
collections::{btree_map::Entry, BTreeMap},
str::FromStr,
Expand Down
Loading
Loading