circles_rpc/methods/
token.rs1use crate::client::RpcClient;
2use crate::error::Result;
3use alloy_primitives::U256;
4use circles_types::{Address, TokenBalanceResponse, TokenHolder};
5use std::str::FromStr;
6
7#[derive(Clone, Debug)]
12pub struct TokenMethods {
13 client: RpcClient,
14}
15
16#[derive(Debug, Clone, PartialEq, Eq)]
18pub struct TokenHolderNormalized {
19 pub account: Address,
21 pub token_address: Address,
23 pub balance: U256,
25}
26
27impl From<TokenHolder> for TokenHolderNormalized {
28 fn from(holder: TokenHolder) -> Self {
29 let balance = U256::from_str(&holder.demurraged_total_balance).unwrap_or_default();
30 Self {
31 account: holder.account,
32 token_address: holder.token_address,
33 balance,
34 }
35 }
36}
37
38impl TokenMethods {
39 pub fn new(client: RpcClient) -> Self {
41 Self { client }
42 }
43
44 pub async fn get_token_balances(
46 &self,
47 address: Address,
48 as_time_circles: bool,
49 use_v2: bool,
50 ) -> Result<Vec<TokenBalanceResponse>> {
51 let method = if use_v2 {
52 "circlesV2_getTokenBalances"
53 } else {
54 "circles_getTokenBalances"
55 };
56 self.client.call(method, (address, as_time_circles)).await
57 }
58
59 pub async fn get_token_holders(&self, token: Address) -> Result<Vec<TokenHolderNormalized>> {
61 let holders: Vec<TokenHolder> = self
62 .client
63 .call("circles_getTokenHolders", (token,))
64 .await?;
65 Ok(holders
66 .into_iter()
67 .map(TokenHolderNormalized::from)
68 .collect())
69 }
70
71 pub async fn get_token_holders_raw(&self, token: Address) -> Result<Vec<TokenHolder>> {
73 self.client.call("circles_getTokenHolders", (token,)).await
74 }
75}