spl-token-cli: Add 'account-info' subcommand
This commit is contained in:
parent
7903e62a08
commit
ec9961cd7f
|
@ -239,7 +239,7 @@ dependencies = [
|
||||||
"quote 1.0.7",
|
"quote 1.0.7",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"syn 1.0.31",
|
"syn 1.0.41",
|
||||||
"tempfile",
|
"tempfile",
|
||||||
"toml",
|
"toml",
|
||||||
]
|
]
|
||||||
|
@ -454,7 +454,7 @@ checksum = "cb582b60359da160a9477ee80f15c8d784c477e69c217ef2cdd4169c24ea380f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.19",
|
"proc-macro2 1.0.19",
|
||||||
"quote 1.0.7",
|
"quote 1.0.7",
|
||||||
"syn 1.0.31",
|
"syn 1.0.41",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -565,7 +565,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36"
|
checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"atty",
|
"atty",
|
||||||
"humantime",
|
"humantime 1.3.0",
|
||||||
"log",
|
"log",
|
||||||
"regex",
|
"regex",
|
||||||
"termcolor",
|
"termcolor",
|
||||||
|
@ -589,7 +589,7 @@ checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.19",
|
"proc-macro2 1.0.19",
|
||||||
"quote 1.0.7",
|
"quote 1.0.7",
|
||||||
"syn 1.0.31",
|
"syn 1.0.41",
|
||||||
"synstructure",
|
"synstructure",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -678,7 +678,7 @@ dependencies = [
|
||||||
"proc-macro-hack",
|
"proc-macro-hack",
|
||||||
"proc-macro2 1.0.19",
|
"proc-macro2 1.0.19",
|
||||||
"quote 1.0.7",
|
"quote 1.0.7",
|
||||||
"syn 1.0.31",
|
"syn 1.0.41",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -881,6 +881,12 @@ dependencies = [
|
||||||
"quick-error",
|
"quick-error",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "humantime"
|
||||||
|
version = "2.0.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3c1ad908cc71012b7bea4d0c53ba96a8cba9962f048fa68d143376143d863b7a"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hyper"
|
name = "hyper"
|
||||||
version = "0.13.7"
|
version = "0.13.7"
|
||||||
|
@ -1249,7 +1255,7 @@ checksum = "6f09b9841adb6b5e1f89ef7087ea636e0fd94b2851f887c1e3eb5d5f8228fab3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.19",
|
"proc-macro2 1.0.19",
|
||||||
"quote 1.0.7",
|
"quote 1.0.7",
|
||||||
"syn 1.0.31",
|
"syn 1.0.41",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -1300,7 +1306,7 @@ dependencies = [
|
||||||
"proc-macro-crate",
|
"proc-macro-crate",
|
||||||
"proc-macro2 1.0.19",
|
"proc-macro2 1.0.19",
|
||||||
"quote 1.0.7",
|
"quote 1.0.7",
|
||||||
"syn 1.0.31",
|
"syn 1.0.41",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -1452,7 +1458,7 @@ checksum = "2c0e815c3ee9a031fdf5af21c10aa17c573c9c6a566328d99e3936c34e36461f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.19",
|
"proc-macro2 1.0.19",
|
||||||
"quote 1.0.7",
|
"quote 1.0.7",
|
||||||
"syn 1.0.31",
|
"syn 1.0.41",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -1768,7 +1774,7 @@ checksum = "b9bdc5e856e51e685846fb6c13a1f5e5432946c2c90501bdc76a1319f19e29da"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.19",
|
"proc-macro2 1.0.19",
|
||||||
"quote 1.0.7",
|
"quote 1.0.7",
|
||||||
"syn 1.0.31",
|
"syn 1.0.41",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -1843,9 +1849,9 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
version = "1.0.112"
|
version = "1.0.116"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "736aac72d1eafe8e5962d1d1c3d99b0df526015ba40915cb3c49d042e92ec243"
|
checksum = "96fe57af81d28386a513cbc6858332abc6117cfdb5999647c6444b8f43a370a5"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde_derive",
|
"serde_derive",
|
||||||
]
|
]
|
||||||
|
@ -1861,13 +1867,13 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_derive"
|
name = "serde_derive"
|
||||||
version = "1.0.112"
|
version = "1.0.116"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "bf0343ce212ac0d3d6afd9391ac8e9c9efe06b533c8d33f660f6390cc4093f57"
|
checksum = "f630a6370fd8e457873b4bd2ffdae75408bc291ba72be773772a4c2a065d9ae8"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.19",
|
"proc-macro2 1.0.19",
|
||||||
"quote 1.0.7",
|
"quote 1.0.7",
|
||||||
"syn 1.0.31",
|
"syn 1.0.41",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -2033,6 +2039,28 @@ dependencies = [
|
||||||
"url",
|
"url",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "solana-cli-output"
|
||||||
|
version = "1.3.13"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6ed68c386972c9765bd94b472672d83f1f61a8e35e4ead9f0a0bc0f52b1f8923"
|
||||||
|
dependencies = [
|
||||||
|
"Inflector",
|
||||||
|
"chrono",
|
||||||
|
"console 0.11.3",
|
||||||
|
"humantime 2.0.1",
|
||||||
|
"indicatif",
|
||||||
|
"serde",
|
||||||
|
"serde_derive",
|
||||||
|
"serde_json",
|
||||||
|
"solana-clap-utils",
|
||||||
|
"solana-client",
|
||||||
|
"solana-sdk",
|
||||||
|
"solana-stake-program",
|
||||||
|
"solana-transaction-status",
|
||||||
|
"solana-vote-program",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "solana-client"
|
name = "solana-client"
|
||||||
version = "1.3.13"
|
version = "1.3.13"
|
||||||
|
@ -2095,7 +2123,7 @@ dependencies = [
|
||||||
"reqwest",
|
"reqwest",
|
||||||
"serde",
|
"serde",
|
||||||
"syn 0.15.44",
|
"syn 0.15.44",
|
||||||
"syn 1.0.31",
|
"syn 1.0.41",
|
||||||
"tokio 0.1.22",
|
"tokio 0.1.22",
|
||||||
"winapi 0.3.9",
|
"winapi 0.3.9",
|
||||||
]
|
]
|
||||||
|
@ -2220,7 +2248,7 @@ dependencies = [
|
||||||
"proc-macro2 1.0.19",
|
"proc-macro2 1.0.19",
|
||||||
"quote 1.0.7",
|
"quote 1.0.7",
|
||||||
"rustversion",
|
"rustversion",
|
||||||
"syn 1.0.31",
|
"syn 1.0.41",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -2233,7 +2261,7 @@ dependencies = [
|
||||||
"proc-macro2 1.0.19",
|
"proc-macro2 1.0.19",
|
||||||
"quote 1.0.7",
|
"quote 1.0.7",
|
||||||
"rustc_version",
|
"rustc_version",
|
||||||
"syn 1.0.31",
|
"syn 1.0.41",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -2376,6 +2404,7 @@ dependencies = [
|
||||||
"solana-account-decoder",
|
"solana-account-decoder",
|
||||||
"solana-clap-utils",
|
"solana-clap-utils",
|
||||||
"solana-cli-config",
|
"solana-cli-config",
|
||||||
|
"solana-cli-output",
|
||||||
"solana-client",
|
"solana-client",
|
||||||
"solana-logger",
|
"solana-logger",
|
||||||
"solana-sdk",
|
"solana-sdk",
|
||||||
|
@ -2441,9 +2470,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "1.0.31"
|
version = "1.0.41"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b5304cfdf27365b7585c25d4af91b35016ed21ef88f17ced89c7093b43dba8b6"
|
checksum = "6690e3e9f692504b941dc6c3b188fd28df054f7fb8469ab40680df52fdcc842b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.19",
|
"proc-macro2 1.0.19",
|
||||||
"quote 1.0.7",
|
"quote 1.0.7",
|
||||||
|
@ -2458,7 +2487,7 @@ checksum = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.19",
|
"proc-macro2 1.0.19",
|
||||||
"quote 1.0.7",
|
"quote 1.0.7",
|
||||||
"syn 1.0.31",
|
"syn 1.0.41",
|
||||||
"unicode-xid 0.2.0",
|
"unicode-xid 0.2.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -2541,7 +2570,7 @@ checksum = "bd80fc12f73063ac132ac92aceea36734f04a1d93c1240c6944e23a3b8841793"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.19",
|
"proc-macro2 1.0.19",
|
||||||
"quote 1.0.7",
|
"quote 1.0.7",
|
||||||
"syn 1.0.31",
|
"syn 1.0.41",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -3015,7 +3044,7 @@ dependencies = [
|
||||||
"log",
|
"log",
|
||||||
"proc-macro2 1.0.19",
|
"proc-macro2 1.0.19",
|
||||||
"quote 1.0.7",
|
"quote 1.0.7",
|
||||||
"syn 1.0.31",
|
"syn 1.0.41",
|
||||||
"wasm-bindgen-shared",
|
"wasm-bindgen-shared",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -3049,7 +3078,7 @@ checksum = "841a6d1c35c6f596ccea1f82504a192a60378f64b3bb0261904ad8f2f5657556"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.19",
|
"proc-macro2 1.0.19",
|
||||||
"quote 1.0.7",
|
"quote 1.0.7",
|
||||||
"syn 1.0.31",
|
"syn 1.0.41",
|
||||||
"wasm-bindgen-backend",
|
"wasm-bindgen-backend",
|
||||||
"wasm-bindgen-shared",
|
"wasm-bindgen-shared",
|
||||||
]
|
]
|
||||||
|
@ -3177,6 +3206,6 @@ checksum = "de251eec69fc7c1bc3923403d18ececb929380e016afe103da75f396704f8ca2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2 1.0.19",
|
"proc-macro2 1.0.19",
|
||||||
"quote 1.0.7",
|
"quote 1.0.7",
|
||||||
"syn 1.0.31",
|
"syn 1.0.41",
|
||||||
"synstructure",
|
"synstructure",
|
||||||
]
|
]
|
||||||
|
|
|
@ -15,6 +15,7 @@ serde_json = "1.0.57"
|
||||||
solana-account-decoder = { version = "=1.3.13" }
|
solana-account-decoder = { version = "=1.3.13" }
|
||||||
solana-clap-utils = { version = "=1.3.13"}
|
solana-clap-utils = { version = "=1.3.13"}
|
||||||
solana-cli-config = { version = "=1.3.13" }
|
solana-cli-config = { version = "=1.3.13" }
|
||||||
|
solana-cli-output = { version = "=1.3.13" }
|
||||||
solana-client = { version = "=1.3.13" }
|
solana-client = { version = "=1.3.13" }
|
||||||
solana-logger = { version = "=1.3.13" }
|
solana-logger = { version = "=1.3.13" }
|
||||||
solana-sdk = { version = "=1.3.13" }
|
solana-sdk = { version = "=1.3.13" }
|
||||||
|
|
|
@ -4,7 +4,7 @@ use clap::{
|
||||||
};
|
};
|
||||||
use console::Emoji;
|
use console::Emoji;
|
||||||
use solana_account_decoder::{
|
use solana_account_decoder::{
|
||||||
parse_token::{TokenAccountType, UiAccountState},
|
parse_token::{TokenAccountType, UiAccountState, UiTokenAmount},
|
||||||
UiAccountData,
|
UiAccountData,
|
||||||
};
|
};
|
||||||
use solana_clap_utils::{
|
use solana_clap_utils::{
|
||||||
|
@ -12,6 +12,7 @@ use solana_clap_utils::{
|
||||||
input_validators::{is_amount, is_keypair, is_pubkey_or_keypair, is_url},
|
input_validators::{is_amount, is_keypair, is_pubkey_or_keypair, is_url},
|
||||||
keypair::signer_from_path,
|
keypair::signer_from_path,
|
||||||
};
|
};
|
||||||
|
use solana_cli_output::display::println_name_value;
|
||||||
use solana_client::{rpc_client::RpcClient, rpc_request::TokenAccountsFilter};
|
use solana_client::{rpc_client::RpcClient, rpc_request::TokenAccountsFilter};
|
||||||
use solana_sdk::{
|
use solana_sdk::{
|
||||||
commitment_config::CommitmentConfig,
|
commitment_config::CommitmentConfig,
|
||||||
|
@ -546,6 +547,67 @@ fn command_accounts(config: &Config, token: Option<Pubkey>) -> CommandResult {
|
||||||
Ok(None)
|
Ok(None)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn stringify_ui_token_amount(amount: &UiTokenAmount) -> String {
|
||||||
|
let decimals = amount.decimals as usize;
|
||||||
|
if decimals > 0 {
|
||||||
|
let amount = u64::from_str(&amount.amount).unwrap();
|
||||||
|
|
||||||
|
// Left-pad zeros to decimals + 1, so we at least have an integer zero
|
||||||
|
let mut s = format!("{:01$}", amount, decimals + 1);
|
||||||
|
|
||||||
|
// Add the decimal point (Sorry, "," locales!)
|
||||||
|
s.insert(s.len() - decimals, '.');
|
||||||
|
s
|
||||||
|
} else {
|
||||||
|
amount.amount.clone()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn stringify_ui_token_amount_trimmed(amount: &UiTokenAmount) -> String {
|
||||||
|
let s = stringify_ui_token_amount(amount);
|
||||||
|
let zeros_trimmed = s.trim_end_matches('0');
|
||||||
|
let decimal_trimmed = zeros_trimmed.trim_end_matches('.');
|
||||||
|
decimal_trimmed.to_string()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn command_account(config: &Config, address: Pubkey) -> CommandResult {
|
||||||
|
let account = config
|
||||||
|
.rpc_client
|
||||||
|
.get_token_account_with_commitment(&address, config.commitment_config)?
|
||||||
|
.value
|
||||||
|
.unwrap();
|
||||||
|
println!();
|
||||||
|
println_name_value("Address:", &address.to_string());
|
||||||
|
println_name_value(
|
||||||
|
"Balance:",
|
||||||
|
&stringify_ui_token_amount_trimmed(&account.token_amount),
|
||||||
|
);
|
||||||
|
let mint = format!(
|
||||||
|
"{}{}",
|
||||||
|
account.mint,
|
||||||
|
if account.is_native { " (native)" } else { "" }
|
||||||
|
);
|
||||||
|
println_name_value("Mint:", &mint);
|
||||||
|
println_name_value("Owner:", &account.owner);
|
||||||
|
println_name_value("State:", &format!("{:?}", account.state));
|
||||||
|
if let Some(delegate) = &account.delegate {
|
||||||
|
println!("Delegation:");
|
||||||
|
println_name_value(" Delegate:", delegate);
|
||||||
|
let allowance = account.delegated_amount.as_ref().unwrap();
|
||||||
|
println_name_value(
|
||||||
|
" Allowance:",
|
||||||
|
&stringify_ui_token_amount_trimmed(&allowance),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
println_name_value("Delegation:", "");
|
||||||
|
}
|
||||||
|
println_name_value(
|
||||||
|
"Close authority:",
|
||||||
|
&account.close_authority.as_ref().unwrap_or(&String::new()),
|
||||||
|
);
|
||||||
|
Ok(None)
|
||||||
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let default_decimals = &format!("{}", native_mint::DECIMALS);
|
let default_decimals = &format!("{}", native_mint::DECIMALS);
|
||||||
let matches = App::new(crate_name!())
|
let matches = App::new(crate_name!())
|
||||||
|
@ -864,6 +926,19 @@ fn main() {
|
||||||
.help("The address of the token account to unwrap"),
|
.help("The address of the token account to unwrap"),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
.subcommand(
|
||||||
|
SubCommand::with_name("account-info")
|
||||||
|
.about("Query details of an SPL Token account by address")
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("address")
|
||||||
|
.validator(is_pubkey_or_keypair)
|
||||||
|
.value_name("TOKEN_ACCOUNT_ADDRESS")
|
||||||
|
.takes_value(true)
|
||||||
|
.index(1)
|
||||||
|
.required(true)
|
||||||
|
.help("The address of the SPL Token account to query"),
|
||||||
|
),
|
||||||
|
)
|
||||||
.get_matches();
|
.get_matches();
|
||||||
|
|
||||||
let mut wallet_manager = None;
|
let mut wallet_manager = None;
|
||||||
|
@ -1010,6 +1085,10 @@ fn main() {
|
||||||
let token = pubkey_of(arg_matches, "token");
|
let token = pubkey_of(arg_matches, "token");
|
||||||
command_accounts(&config, token)
|
command_accounts(&config, token)
|
||||||
}
|
}
|
||||||
|
("account-info", Some(arg_matches)) => {
|
||||||
|
let address = pubkey_of(arg_matches, "address").unwrap();
|
||||||
|
command_account(&config, address)
|
||||||
|
}
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
}
|
}
|
||||||
.and_then(|transaction| {
|
.and_then(|transaction| {
|
||||||
|
|
Loading…
Reference in New Issue