Return delegated amount as UiTokenAmount (#11475)

* Return delegated amount as UiTokenAmount

* Omit delegate and delegatedAmount when none
This commit is contained in:
Tyera Eulberg 2020-08-08 13:12:09 -06:00 committed by GitHub
parent 921529426d
commit 88d8d3d02a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 20 additions and 5 deletions

View File

@ -35,18 +35,17 @@ pub fn parse_token(
"no mint_decimals provided to parse spl-token account".to_string(), "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 { Ok(TokenAccountType::Account(UiTokenAccount {
mint: account.mint.to_string(), mint: account.mint.to_string(),
owner: account.owner.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 { delegate: match account.delegate {
COption::Some(pubkey) => Some(pubkey.to_string()), COption::Some(pubkey) => Some(pubkey.to_string()),
COption::None => None, COption::None => None,
}, },
is_initialized: account.is_initialized, is_initialized: account.is_initialized,
is_native: account.is_native, 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::<Mint>() { } else if data.len() == size_of::<Mint>() {
let mint: Mint = *unpack(&mut data) let mint: Mint = *unpack(&mut data)
@ -99,10 +98,12 @@ pub struct UiTokenAccount {
pub mint: String, pub mint: String,
pub owner: String, pub owner: String,
pub token_amount: UiTokenAmount, pub token_amount: UiTokenAmount,
#[serde(skip_serializing_if = "Option::is_none")]
pub delegate: Option<String>, pub delegate: Option<String>,
pub is_initialized: bool, pub is_initialized: bool,
pub is_native: bool, pub is_native: bool,
pub delegated_amount: u64, #[serde(skip_serializing_if = "UiTokenAmount::is_zero")]
pub delegated_amount: UiTokenAmount,
} }
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)] #[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
@ -113,6 +114,16 @@ pub struct UiTokenAmount {
pub amount: StringAmount, pub amount: StringAmount,
} }
impl UiTokenAmount {
fn is_zero(&self) -> bool {
if let Ok(amount) = self.amount.parse::<u64>() {
amount == 0
} else {
false
}
}
}
pub fn token_amount_to_ui_amount(amount: u64, decimals: u8) -> UiTokenAmount { 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 // 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; let amount_decimals = amount as f64 / 10_usize.pow(decimals as u32) as f64;
@ -177,7 +188,11 @@ mod test {
delegate: None, delegate: None,
is_initialized: true, is_initialized: true,
is_native: false, is_native: false,
delegated_amount: 0, delegated_amount: UiTokenAmount {
ui_amount: 0.0,
decimals: 2,
amount: "0".to_string()
},
}), }),
); );