@@ -5,7 +5,7 @@ use solana_account_decoder::{
5
5
parse_token:: { UiAccountState , UiMint , UiMultisig , UiTokenAccount , UiTokenAmount } ,
6
6
parse_token_extension:: {
7
7
UiDefaultAccountState , UiExtension , UiInterestBearingConfig , UiMemoTransfer ,
8
- UiMintCloseAuthority , UiTransferFee , UiTransferFeeAmount , UiTransferFeeConfig ,
8
+ UiMintCloseAuthority , UiTransferFeeAmount , UiTransferFeeConfig ,
9
9
} ,
10
10
} ;
11
11
use solana_cli_output:: { display:: writeln_name_value, OutputFormat , QuietDisplay , VerboseDisplay } ;
@@ -188,7 +188,6 @@ impl fmt::Display for CliMultisig {
188
188
pub ( crate ) struct CliTokenAccount {
189
189
pub ( crate ) address : String ,
190
190
pub ( crate ) program_id : String ,
191
- pub ( crate ) epoch : u64 ,
192
191
pub ( crate ) decimals : Option < u8 > ,
193
192
pub ( crate ) is_associated : bool ,
194
193
#[ serde( flatten) ]
@@ -255,7 +254,7 @@ impl fmt::Display for CliTokenAccount {
255
254
if !self . account . extensions . is_empty ( ) {
256
255
writeln ! ( f, "{}" , style( "Extensions:" ) . bold( ) ) ?;
257
256
for extension in & self . account . extensions {
258
- display_ui_extension ( f, self . epoch , extension) ?;
257
+ display_ui_extension ( f, 0 , extension) ?;
259
258
}
260
259
}
261
260
@@ -273,6 +272,7 @@ impl fmt::Display for CliTokenAccount {
273
272
pub ( crate ) struct CliMint {
274
273
pub ( crate ) address : String ,
275
274
pub ( crate ) program_id : String ,
275
+ #[ serde( skip_serializing) ]
276
276
pub ( crate ) epoch : u64 ,
277
277
#[ serde( flatten) ]
278
278
pub ( crate ) mint : UiMint ,
@@ -493,26 +493,53 @@ fn display_ui_extension(
493
493
withheld_amount,
494
494
older_transfer_fee,
495
495
newer_transfer_fee,
496
- ..
497
496
} ) => {
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
+ ) ?;
504
511
} 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
+ }
507
542
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 ( ) ) ?;
516
543
writeln_name_value (
517
544
f,
518
545
" Config authority:" ,
@@ -539,8 +566,8 @@ fn display_ui_extension(
539
566
close_authority. as_ref ( ) . unwrap_or ( & String :: new ( ) ) ,
540
567
)
541
568
}
542
- UiExtension :: ConfidentialTransferMint ( _) => unimplemented ! ( ) , // very annoying
543
- UiExtension :: ConfidentialTransferAccount ( _) => unimplemented ! ( ) , //very annoying
569
+ UiExtension :: ConfidentialTransferMint ( _) => unimplemented ! ( ) ,
570
+ UiExtension :: ConfidentialTransferAccount ( _) => unimplemented ! ( ) ,
544
571
UiExtension :: DefaultAccountState ( UiDefaultAccountState { account_state } ) => {
545
572
writeln_name_value ( f, " Default state:" , & format ! ( "{:?}" , account_state) )
546
573
}
@@ -559,24 +586,36 @@ fn display_ui_extension(
559
586
UiExtension :: NonTransferable => writeln ! ( f, " {}" , style( "Non-transferable" ) . bold( ) ) ,
560
587
UiExtension :: InterestBearingConfig ( UiInterestBearingConfig {
561
588
rate_authority,
589
+ pre_update_average_rate,
562
590
current_rate,
563
591
..
564
592
} ) => {
565
593
writeln ! ( f, " {}" , style( "Interest-bearing:" ) . bold( ) ) ?;
566
594
writeln ! (
567
595
f,
568
596
" {} {}bps" ,
569
- style( "Interest rate:" ) . bold( ) ,
597
+ style( "Current rate:" ) . bold( ) ,
570
598
current_rate
571
599
) ?;
600
+ writeln ! (
601
+ f,
602
+ " {} {}bps" ,
603
+ style( "Average rate:" ) . bold( ) ,
604
+ pre_update_average_rate
605
+ ) ?;
572
606
writeln_name_value (
573
607
f,
574
608
" Rate authority:" ,
575
609
rate_authority. as_ref ( ) . unwrap_or ( & String :: new ( ) ) ,
576
610
)
577
611
}
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
+ ) ,
580
619
}
581
620
}
582
621
0 commit comments