rpc: Parse largest token accounts after sorting & truncating (#35264)

This commit is contained in:
Brooks 2024-02-20 19:29:14 -05:00 committed by GitHub
parent b0134ab04d
commit 6d15487183
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 11 additions and 15 deletions

View File

@ -1861,29 +1861,18 @@ impl JsonRpcRequestProcessor {
"Invalid param: not a Token mint".to_string(), "Invalid param: not a Token mint".to_string(),
)); ));
} }
let mut token_balances: Vec<RpcTokenAccountBalance> = self let mut token_balances: Vec<_> = self
.get_filtered_spl_token_accounts_by_mint(&bank, &mint_owner, mint, vec![])? .get_filtered_spl_token_accounts_by_mint(&bank, &mint_owner, mint, vec![])?
.into_iter() .into_iter()
.map(|(address, account)| { .map(|(address, account)| {
let amount = StateWithExtensions::<TokenAccount>::unpack(account.data()) let amount = StateWithExtensions::<TokenAccount>::unpack(account.data())
.map(|account| account.base.amount) .map(|account| account.base.amount)
.unwrap_or(0); .unwrap_or(0);
let amount = token_amount_to_ui_amount(amount, decimals); (address, amount)
RpcTokenAccountBalance {
address: address.to_string(),
amount,
}
}) })
.collect(); .collect();
let sort_largest = |a: &RpcTokenAccountBalance, b: &RpcTokenAccountBalance| { let sort_largest = |a: &(_, u64), b: &(_, u64)| b.1.cmp(&a.1);
a.amount
.amount
.parse::<u64>()
.unwrap()
.cmp(&b.amount.amount.parse::<u64>().unwrap())
.reverse()
};
let largest_token_balances = if token_balances.len() > NUM_LARGEST_ACCOUNTS { let largest_token_balances = if token_balances.len() > NUM_LARGEST_ACCOUNTS {
token_balances token_balances
@ -1894,7 +1883,14 @@ impl JsonRpcRequestProcessor {
}; };
largest_token_balances.sort_unstable_by(sort_largest); largest_token_balances.sort_unstable_by(sort_largest);
Ok(new_response(&bank, largest_token_balances.to_vec())) let largest_token_balances = largest_token_balances
.iter()
.map(|(address, amount)| RpcTokenAccountBalance {
address: address.to_string(),
amount: token_amount_to_ui_amount(*amount, decimals),
})
.collect();
Ok(new_response(&bank, largest_token_balances))
} }
pub fn get_token_accounts_by_owner( pub fn get_token_accounts_by_owner(