From df43967d0a3f87aa84fcd43f8eb018172a280cb4 Mon Sep 17 00:00:00 2001 From: Tyera Eulberg Date: Sat, 8 Aug 2020 11:18:33 -0600 Subject: [PATCH 1/2] Return delegated amount as UiTokenAmount --- account-decoder/src/parse_token.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/account-decoder/src/parse_token.rs b/account-decoder/src/parse_token.rs index 04201c9d9e6..9bd58fca757 100644 --- a/account-decoder/src/parse_token.rs +++ b/account-decoder/src/parse_token.rs @@ -35,18 +35,17 @@ pub fn parse_token( "no mint_decimals provided to parse spl-token account".to_string(), ) })?; - let ui_token_amount = token_amount_to_ui_amount(account.amount, decimals); Ok(TokenAccountType::Account(UiTokenAccount { mint: account.mint.to_string(), owner: account.owner.to_string(), - token_amount: ui_token_amount, + token_amount: token_amount_to_ui_amount(account.amount, decimals), delegate: match account.delegate { COption::Some(pubkey) => Some(pubkey.to_string()), COption::None => None, }, is_initialized: account.is_initialized, is_native: account.is_native, - delegated_amount: account.delegated_amount, + delegated_amount: token_amount_to_ui_amount(account.delegated_amount, decimals), })) } else if data.len() == size_of::() { let mint: Mint = *unpack(&mut data) @@ -102,7 +101,7 @@ pub struct UiTokenAccount { pub delegate: Option, pub is_initialized: bool, pub is_native: bool, - pub delegated_amount: u64, + pub delegated_amount: UiTokenAmount, } #[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] @@ -177,7 +176,11 @@ mod test { delegate: None, is_initialized: true, is_native: false, - delegated_amount: 0, + delegated_amount: UiTokenAmount { + ui_amount: 0.0, + decimals: 2, + amount: "0".to_string() + }, }), ); From 5d13dd06362613020e9ab7fd94d677ce8eab7e21 Mon Sep 17 00:00:00 2001 From: Tyera Eulberg Date: Sat, 8 Aug 2020 11:51:02 -0600 Subject: [PATCH 2/2] Omit delegate and delegatedAmount when none --- account-decoder/src/parse_token.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/account-decoder/src/parse_token.rs b/account-decoder/src/parse_token.rs index 9bd58fca757..92419b155ed 100644 --- a/account-decoder/src/parse_token.rs +++ b/account-decoder/src/parse_token.rs @@ -98,9 +98,11 @@ pub struct UiTokenAccount { pub mint: String, pub owner: String, pub token_amount: UiTokenAmount, + #[serde(skip_serializing_if = "Option::is_none")] pub delegate: Option, pub is_initialized: bool, pub is_native: bool, + #[serde(skip_serializing_if = "UiTokenAmount::is_zero")] pub delegated_amount: UiTokenAmount, } @@ -112,6 +114,16 @@ pub struct UiTokenAmount { pub amount: StringAmount, } +impl UiTokenAmount { + fn is_zero(&self) -> bool { + if let Ok(amount) = self.amount.parse::() { + amount == 0 + } else { + false + } + } +} + pub fn token_amount_to_ui_amount(amount: u64, decimals: u8) -> UiTokenAmount { // Use `amount_to_ui_amount()` once spl_token is bumped to a version that supports it: https://github.com/solana-labs/solana-program-library/pull/211 let amount_decimals = amount as f64 / 10_usize.pow(decimals as u32) as f64;