use crate::api::api;
use crate::error::BittensorError;
use crate::AccountId;
use std::time::Duration;
use subxt::OnlineClient;
use subxt::PolkadotConfig;
pub type Metagraph =
crate::api::api::runtime_types::pallet_subtensor::rpc_info::metagraph::Metagraph<AccountId>;
pub type SelectiveMetagraph =
crate::api::api::runtime_types::pallet_subtensor::rpc_info::metagraph::SelectiveMetagraph<
AccountId,
>;
pub async fn get_metagraph(
client: &OnlineClient<PolkadotConfig>,
netuid: u16,
) -> Result<Metagraph, BittensorError> {
let runtime_api =
client
.runtime_api()
.at_latest()
.await
.map_err(|e| BittensorError::RpcError {
message: format!("Failed to get runtime API: {}", e),
})?;
let metagraph = runtime_api
.call(
api::runtime_apis::subnet_info_runtime_api::SubnetInfoRuntimeApi.get_metagraph(netuid),
)
.await
.map_err(|e| {
let err_msg = e.to_string();
if err_msg.to_lowercase().contains("timeout") {
BittensorError::RpcTimeoutError {
message: format!("get_metagraph call timeout: {err_msg}"),
timeout: Duration::from_secs(30),
}
} else {
BittensorError::RpcMethodError {
method: "get_metagraph".to_string(),
message: err_msg,
}
}
})?
.ok_or(BittensorError::SubnetNotFound { netuid })?;
Ok(metagraph)
}
pub mod fields {
pub const HOTKEYS: u64 = 1 << 0;
pub const COLDKEYS: u64 = 1 << 1;
pub const STAKE: u64 = 1 << 2;
pub const TRUST: u64 = 1 << 3;
pub const CONSENSUS: u64 = 1 << 4;
pub const INCENTIVE: u64 = 1 << 5;
pub const DIVIDENDS: u64 = 1 << 6;
pub const EMISSION: u64 = 1 << 7;
pub const AXONS: u64 = 1 << 8;
pub const ALL: u64 = u64::MAX;
}
#[cfg(test)]
mod tests {
use super::fields::*;
#[test]
fn test_field_constants() {
assert_eq!(HOTKEYS, 1);
assert_eq!(COLDKEYS, 2);
assert_eq!(STAKE, 4);
assert_ne!(HOTKEYS | COLDKEYS, STAKE);
}
}