use super::types::*;
use crate::client::Client;
use crate::error::Result;
pub struct TokenApi<'a> {
client: &'a Client,
}
impl<'a> TokenApi<'a> {
pub(crate) fn new(client: &'a Client) -> Self {
Self { client }
}
pub async fn get_token_balances(&self, address: &str) -> Result<RpcTokenBalancesResponse> {
self.get_token_balances_with_spec(address, TokenSpec::Erc20, None)
.await
}
pub async fn get_token_balances_with_spec(
&self,
address: &str,
token_spec: TokenSpec,
options: Option<RpcTokenBalancesOptions>,
) -> Result<RpcTokenBalancesResponse> {
let mut params = vec![
serde_json::json!(address),
serde_json::to_value(&token_spec)?,
];
if let Some(opts) = options {
params.push(serde_json::to_value(&opts)?);
}
self.client.rpc("alchemy_getTokenBalances", params).await
}
pub async fn get_token_balances_for_tokens(
&self,
address: &str,
token_addresses: &[&str],
) -> Result<RpcTokenBalancesResponse> {
let token_spec =
TokenSpec::Addresses(token_addresses.iter().map(|a| a.to_string()).collect());
self.get_token_balances_with_spec(address, token_spec, None)
.await
}
pub async fn get_token_metadata(&self, contract_address: &str) -> Result<RpcTokenMetadata> {
self.client
.rpc("alchemy_getTokenMetadata", vec![contract_address])
.await
}
pub async fn get_token_allowance(
&self,
contract_address: &str,
owner: &str,
spender: &str,
) -> Result<String> {
let params = serde_json::json!({
"contract": contract_address,
"owner": owner,
"spender": spender
});
self.client
.rpc("alchemy_getTokenAllowance", vec![params])
.await
}
}