Fix get_parsed_token_accounts (#11907)

This commit is contained in:
Tyera Eulberg 2020-08-29 12:38:27 -06:00 committed by GitHub
parent 5e017dc0f2
commit 60c7ac6f95
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 40 additions and 21 deletions

View File

@ -14,7 +14,7 @@ use solana_account_decoder::{
get_token_account_mint, spl_token_id_v2_0, spl_token_v2_0_native_mint, get_token_account_mint, spl_token_id_v2_0, spl_token_v2_0_native_mint,
token_amount_to_ui_amount, UiTokenAmount, token_amount_to_ui_amount, UiTokenAmount,
}, },
UiAccount, UiAccountEncoding, UiAccount, UiAccountData, UiAccountEncoding,
}; };
use solana_client::{ use solana_client::{
rpc_config::*, rpc_config::*,
@ -1315,28 +1315,30 @@ where
{ {
let mut mint_decimals: HashMap<Pubkey, u8> = HashMap::new(); let mut mint_decimals: HashMap<Pubkey, u8> = HashMap::new();
keyed_accounts.filter_map(move |(pubkey, account)| { keyed_accounts.filter_map(move |(pubkey, account)| {
let additional_data = get_token_account_mint(&account.data) let additional_data = get_token_account_mint(&account.data).map(|mint_pubkey| {
.and_then(|mint_pubkey| { let spl_token_decimals = mint_decimals.get(&mint_pubkey).cloned().or_else(|| {
mint_decimals.get(&mint_pubkey).cloned().or_else(|| { let (_, decimals) = get_mint_owner_and_decimals(&bank, &mint_pubkey).ok()?;
let (_, decimals) = get_mint_owner_and_decimals(&bank, &mint_pubkey).ok()?; mint_decimals.insert(mint_pubkey, decimals);
mint_decimals.insert(mint_pubkey, decimals); Some(decimals)
Some(decimals)
})
})
.map(|spl_token_decimals| AccountAdditionalData {
spl_token_decimals: Some(spl_token_decimals),
}); });
AccountAdditionalData { spl_token_decimals }
});
additional_data.map(|additional_data| RpcKeyedAccount { let maybe_encoded_account = UiAccount::encode(
pubkey: pubkey.to_string(), &pubkey,
account: UiAccount::encode( account,
&pubkey, UiAccountEncoding::JsonParsed,
account, additional_data,
UiAccountEncoding::JsonParsed, None,
Some(additional_data), );
None, if let UiAccountData::Json(_) = &maybe_encoded_account.data {
), Some(RpcKeyedAccount {
}) pubkey: pubkey.to_string(),
account: maybe_encoded_account,
})
} else {
None
}
}) })
} }
@ -4889,6 +4891,23 @@ pub mod tests {
serde_json::from_value(result["result"]["value"].clone()).unwrap(); serde_json::from_value(result["result"]["value"].clone()).unwrap();
assert_eq!(accounts.len(), 2); assert_eq!(accounts.len(), 2);
// Test getProgramAccounts with jsonParsed encoding returns mints, but doesn't return accounts with invalid mints
let req = format!(
r#"{{
"jsonrpc":"2.0",
"id":1,
"method":"getProgramAccounts",
"params":["{}", {{"encoding": "jsonParsed"}}]
}}"#,
spl_token_id_v2_0(),
);
let res = io.handle_request_sync(&req, meta.clone());
let result: Value = serde_json::from_str(&res.expect("actual response"))
.expect("actual response deserialization");
let accounts: Vec<RpcKeyedAccount> =
serde_json::from_value(result["result"].clone()).unwrap();
assert_eq!(accounts.len(), 3);
// Test returns only mint accounts // Test returns only mint accounts
let req = format!( let req = format!(
r#"{{ r#"{{