Skip to content
This repository was archived by the owner on Mar 11, 2025. It is now read-only.

Commit 2acc42f

Browse files
committed
token-cli: display all extensions except confidential
1 parent f3f9995 commit 2acc42f

File tree

3 files changed

+65
-28
lines changed

3 files changed

+65
-28
lines changed

token/cli/src/main.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1626,7 +1626,6 @@ async fn command_address(
16261626

16271627
async fn command_display(config: &Config<'_>, address: Pubkey) -> CommandResult {
16281628
let account_data = config.get_account_checked(&address).await?;
1629-
let epoch_info = config.rpc_client.get_epoch_info().await?;
16301629

16311630
let decimals = if let Some(mint_address) = get_token_account_mint(&account_data.data) {
16321631
Some(config.get_mint_info(&mint_address, None).await?.decimals)
@@ -1649,7 +1648,6 @@ async fn command_display(config: &Config<'_>, address: Pubkey) -> CommandResult
16491648
let cli_output = CliTokenAccount {
16501649
address: address.to_string(),
16511650
program_id: config.program_id.to_string(),
1652-
epoch: epoch_info.epoch,
16531651
decimals,
16541652
is_associated: associated_address == address,
16551653
account,
@@ -1658,6 +1656,7 @@ async fn command_display(config: &Config<'_>, address: Pubkey) -> CommandResult
16581656
Ok(config.output_format.formatted_string(&cli_output))
16591657
}
16601658
Ok(TokenAccountType::Mint(mint)) => {
1659+
let epoch_info = config.rpc_client.get_epoch_info().await?;
16611660
let cli_output = CliMint {
16621661
address: address.to_string(),
16631662
epoch: epoch_info.epoch,

token/cli/src/output.rs

Lines changed: 64 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use solana_account_decoder::{
55
parse_token::{UiAccountState, UiMint, UiMultisig, UiTokenAccount, UiTokenAmount},
66
parse_token_extension::{
77
UiDefaultAccountState, UiExtension, UiInterestBearingConfig, UiMemoTransfer,
8-
UiMintCloseAuthority, UiTransferFee, UiTransferFeeAmount, UiTransferFeeConfig,
8+
UiMintCloseAuthority, UiTransferFeeAmount, UiTransferFeeConfig,
99
},
1010
};
1111
use solana_cli_output::{display::writeln_name_value, OutputFormat, QuietDisplay, VerboseDisplay};
@@ -188,7 +188,6 @@ impl fmt::Display for CliMultisig {
188188
pub(crate) struct CliTokenAccount {
189189
pub(crate) address: String,
190190
pub(crate) program_id: String,
191-
pub(crate) epoch: u64,
192191
pub(crate) decimals: Option<u8>,
193192
pub(crate) is_associated: bool,
194193
#[serde(flatten)]
@@ -255,7 +254,7 @@ impl fmt::Display for CliTokenAccount {
255254
if !self.account.extensions.is_empty() {
256255
writeln!(f, "{}", style("Extensions:").bold())?;
257256
for extension in &self.account.extensions {
258-
display_ui_extension(f, self.epoch, extension)?;
257+
display_ui_extension(f, 0, extension)?;
259258
}
260259
}
261260

@@ -273,6 +272,7 @@ impl fmt::Display for CliTokenAccount {
273272
pub(crate) struct CliMint {
274273
pub(crate) address: String,
275274
pub(crate) program_id: String,
275+
#[serde(skip_serializing)]
276276
pub(crate) epoch: u64,
277277
#[serde(flatten)]
278278
pub(crate) mint: UiMint,
@@ -493,26 +493,53 @@ fn display_ui_extension(
493493
withheld_amount,
494494
older_transfer_fee,
495495
newer_transfer_fee,
496-
..
497496
}) => {
498-
let UiTransferFee {
499-
transfer_fee_basis_points,
500-
maximum_fee,
501-
..
502-
} = if newer_transfer_fee.epoch >= epoch {
503-
newer_transfer_fee
497+
writeln!(f, " {}", style("Transfer fees:").bold())?;
498+
499+
if newer_transfer_fee.epoch >= epoch {
500+
writeln!(
501+
f,
502+
" {} {}bps",
503+
style("Current fee:").bold(),
504+
newer_transfer_fee.transfer_fee_basis_points
505+
)?;
506+
writeln_name_value(
507+
f,
508+
" Current maximum:",
509+
&newer_transfer_fee.maximum_fee.to_string(),
510+
)?;
504511
} else {
505-
older_transfer_fee
506-
};
512+
writeln!(
513+
f,
514+
" {} {}bps",
515+
style("Current fee:").bold(),
516+
older_transfer_fee.transfer_fee_basis_points
517+
)?;
518+
writeln_name_value(
519+
f,
520+
" Current maximum:",
521+
&older_transfer_fee.maximum_fee.to_string(),
522+
)?;
523+
writeln!(
524+
f,
525+
" {} {}bps",
526+
style("Upcoming fee:").bold(),
527+
newer_transfer_fee.transfer_fee_basis_points
528+
)?;
529+
writeln_name_value(
530+
f,
531+
" Upcoming maximum:",
532+
&newer_transfer_fee.maximum_fee.to_string(),
533+
)?;
534+
writeln!(
535+
f,
536+
" {} Epoch {} ({} epochs)",
537+
style("Switchover at:").bold(),
538+
newer_transfer_fee.epoch,
539+
newer_transfer_fee.epoch - epoch
540+
)?;
541+
}
507542

508-
writeln!(f, " {}", style("Transfer fees:").bold())?;
509-
writeln!(
510-
f,
511-
" {} {}bps",
512-
style("Fee:").bold(),
513-
transfer_fee_basis_points
514-
)?;
515-
writeln_name_value(f, " Maximum fee:", &maximum_fee.to_string())?;
516543
writeln_name_value(
517544
f,
518545
" Config authority:",
@@ -539,8 +566,8 @@ fn display_ui_extension(
539566
close_authority.as_ref().unwrap_or(&String::new()),
540567
)
541568
}
542-
UiExtension::ConfidentialTransferMint(_) => unimplemented!(), // very annoying
543-
UiExtension::ConfidentialTransferAccount(_) => unimplemented!(), //very annoying
569+
UiExtension::ConfidentialTransferMint(_) => unimplemented!(),
570+
UiExtension::ConfidentialTransferAccount(_) => unimplemented!(),
544571
UiExtension::DefaultAccountState(UiDefaultAccountState { account_state }) => {
545572
writeln_name_value(f, " Default state:", &format!("{:?}", account_state))
546573
}
@@ -559,24 +586,36 @@ fn display_ui_extension(
559586
UiExtension::NonTransferable => writeln!(f, " {}", style("Non-transferable").bold()),
560587
UiExtension::InterestBearingConfig(UiInterestBearingConfig {
561588
rate_authority,
589+
pre_update_average_rate,
562590
current_rate,
563591
..
564592
}) => {
565593
writeln!(f, " {}", style("Interest-bearing:").bold())?;
566594
writeln!(
567595
f,
568596
" {} {}bps",
569-
style("Interest rate:").bold(),
597+
style("Current rate:").bold(),
570598
current_rate
571599
)?;
600+
writeln!(
601+
f,
602+
" {} {}bps",
603+
style("Average rate:").bold(),
604+
pre_update_average_rate
605+
)?;
572606
writeln_name_value(
573607
f,
574608
" Rate authority:",
575609
rate_authority.as_ref().unwrap_or(&String::new()),
576610
)
577611
}
578-
UiExtension::UnparseableExtension => panic!("err here"),
579-
UiExtension::Uninitialized => panic!("err here...?"),
612+
// ExtensionType::Uninitialized is a hack to ensure a mint/account is never the same length as a multisig
613+
UiExtension::Uninitialized => Ok(()),
614+
UiExtension::UnparseableExtension => writeln_name_value(
615+
f,
616+
" Unparseable extension:",
617+
"Consider upgrading to a newer version of spl-token",
618+
),
580619
}
581620
}
582621

token/cli/src/sort.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ pub(crate) fn sort_and_parse_token_accounts(
5656
let parsed_account = CliTokenAccount {
5757
address,
5858
program_id: program_id.to_string(),
59-
epoch: 0,
6059
decimals: None,
6160
account: ui_token_account,
6261
is_associated,

0 commit comments

Comments
 (0)