(cherry picked from commit 28f2c15597
)
Co-authored-by: Tyera Eulberg <teulberg@gmail.com>
This commit is contained in:
@ -15,7 +15,10 @@ use bincode::serialize;
|
|||||||
use indicatif::{ProgressBar, ProgressStyle};
|
use indicatif::{ProgressBar, ProgressStyle};
|
||||||
use log::*;
|
use log::*;
|
||||||
use serde_json::{json, Value};
|
use serde_json::{json, Value};
|
||||||
use solana_account_decoder::{parse_token::UiTokenAmount, UiAccount, UiAccountEncoding};
|
use solana_account_decoder::{
|
||||||
|
parse_token::{TokenAccountType, UiTokenAccount, UiTokenAmount},
|
||||||
|
UiAccount, UiAccountData, UiAccountEncoding,
|
||||||
|
};
|
||||||
use solana_sdk::{
|
use solana_sdk::{
|
||||||
account::Account,
|
account::Account,
|
||||||
clock::{
|
clock::{
|
||||||
@ -722,6 +725,67 @@ impl RpcClient {
|
|||||||
Ok(hash)
|
Ok(hash)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_token_account(&self, pubkey: &Pubkey) -> ClientResult<Option<UiTokenAccount>> {
|
||||||
|
Ok(self
|
||||||
|
.get_token_account_with_commitment(pubkey, CommitmentConfig::default())?
|
||||||
|
.value)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_token_account_with_commitment(
|
||||||
|
&self,
|
||||||
|
pubkey: &Pubkey,
|
||||||
|
commitment_config: CommitmentConfig,
|
||||||
|
) -> RpcResult<Option<UiTokenAccount>> {
|
||||||
|
let config = RpcAccountInfoConfig {
|
||||||
|
encoding: Some(UiAccountEncoding::JsonParsed),
|
||||||
|
commitment: Some(commitment_config),
|
||||||
|
data_slice: None,
|
||||||
|
};
|
||||||
|
let response = self.sender.send(
|
||||||
|
RpcRequest::GetAccountInfo,
|
||||||
|
json!([pubkey.to_string(), config]),
|
||||||
|
);
|
||||||
|
|
||||||
|
response
|
||||||
|
.map(|result_json| {
|
||||||
|
if result_json.is_null() {
|
||||||
|
return Err(
|
||||||
|
RpcError::ForUser(format!("AccountNotFound: pubkey={}", pubkey)).into(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
let Response {
|
||||||
|
context,
|
||||||
|
value: rpc_account,
|
||||||
|
} = serde_json::from_value::<Response<Option<UiAccount>>>(result_json)?;
|
||||||
|
trace!("Response account {:?} {:?}", pubkey, rpc_account);
|
||||||
|
let response = {
|
||||||
|
if let Some(rpc_account) = rpc_account {
|
||||||
|
if let UiAccountData::Json(account_data) = rpc_account.data {
|
||||||
|
let token_account_type: TokenAccountType =
|
||||||
|
serde_json::from_value(account_data.parsed)?;
|
||||||
|
if let TokenAccountType::Account(token_account) = token_account_type {
|
||||||
|
return Ok(Response {
|
||||||
|
context,
|
||||||
|
value: Some(token_account),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(Into::<ClientError>::into(RpcError::ForUser(format!(
|
||||||
|
"Account could not be parsed as token account: pubkey={}",
|
||||||
|
pubkey
|
||||||
|
))))
|
||||||
|
};
|
||||||
|
response?
|
||||||
|
})
|
||||||
|
.map_err(|err| {
|
||||||
|
Into::<ClientError>::into(RpcError::ForUser(format!(
|
||||||
|
"AccountNotFound: pubkey={}: {}",
|
||||||
|
pubkey, err
|
||||||
|
)))
|
||||||
|
})?
|
||||||
|
}
|
||||||
|
|
||||||
pub fn get_token_account_balance(&self, pubkey: &Pubkey) -> ClientResult<UiTokenAmount> {
|
pub fn get_token_account_balance(&self, pubkey: &Pubkey) -> ClientResult<UiTokenAmount> {
|
||||||
Ok(self
|
Ok(self
|
||||||
.get_token_account_balance_with_commitment(pubkey, CommitmentConfig::default())?
|
.get_token_account_balance_with_commitment(pubkey, CommitmentConfig::default())?
|
||||||
|
Reference in New Issue
Block a user