use crate::client::types::{TokenBalance, TokenTransfer};
use crate::client::BscScanClient;
use crate::error::Result;
pub trait TokenEndpoints {
#[allow(clippy::too_many_arguments)]
async fn get_token_transfers(
&self,
address: &str,
contract_address: Option<&str>,
start_block: u64,
end_block: u64,
page: u32,
offset: u32,
sort: &str,
) -> Result<Vec<TokenTransfer>>;
async fn get_token_balance(&self, address: &str, contract_address: &str) -> Result<TokenBalance>;
}
impl TokenEndpoints for BscScanClient {
#[allow(clippy::too_many_arguments)]
async fn get_token_transfers(
&self,
address: &str,
contract_address: Option<&str>,
start_block: u64,
end_block: u64,
page: u32,
offset: u32,
sort: &str,
) -> Result<Vec<TokenTransfer>> {
let mut params = vec![
("address", address.to_string()),
("startblock", start_block.to_string()),
("endblock", end_block.to_string()),
("page", page.to_string()),
("offset", offset.to_string()),
("sort", sort.to_string()),
];
if let Some(contract) = contract_address {
params.push(("contractaddress", contract.to_string()));
}
let params_ref: Vec<(&str, &str)> = params
.iter()
.map(|(k, v)| (*k, v.as_str()))
.collect();
self.request("account", "tokentx", ¶ms_ref).await
}
async fn get_token_balance(&self, address: &str, contract_address: &str) -> Result<TokenBalance> {
let params = [
("contractaddress", contract_address),
("address", address),
("tag", "latest"),
];
let balance_str: String = self
.request_simple("account", "tokenbalance", ¶ms)
.await?;
Ok(TokenBalance {
contract_address: contract_address.to_string(),
token_name: String::new(),
token_symbol: String::new(),
token_decimal: "18".to_string(), balance: balance_str,
})
}
}