ic-query 0.93.4

Internet Computer query library for CloudEngine, NNS, SNS, ICRC, system canisters, and public network metadata
Documentation
use crate::{
    ic_registry::{
        MainnetRegistryFetchRequest, RegistryFetchError,
        transport::hex_bytes,
        wire::{GovernanceNodeProvider, ListNodeProvidersResponse},
    },
    nns::{
        MAINNET_GOVERNANCE_CANISTER_ID,
        node_provider::{
            NNS_NODE_PROVIDER_LIST_REPORT_SCHEMA_VERSION, NnsNodeProviderMetadata,
            NnsNodeProviderRow,
        },
    },
};

pub(in crate::ic_registry) fn node_provider_metadata_from_response(
    request: &MainnetRegistryFetchRequest,
    response: ListNodeProvidersResponse,
) -> Result<NnsNodeProviderMetadata, RegistryFetchError> {
    let mut node_providers = response
        .node_providers
        .into_iter()
        .map(node_provider_from_governance)
        .collect::<Result<Vec<_>, _>>()?;
    node_providers.sort_by(|left, right| {
        left.node_provider_principal
            .cmp(&right.node_provider_principal)
    });
    Ok(NnsNodeProviderMetadata {
        schema_version: NNS_NODE_PROVIDER_LIST_REPORT_SCHEMA_VERSION,
        source: crate::report::CollectionSourceRequest::new(
            crate::subnet_catalog::MAINNET_NETWORK,
            &request.endpoint,
            &request.fetched_at,
            &request.fetched_by,
        ),
        governance_canister_id: MAINNET_GOVERNANCE_CANISTER_ID.to_string(),
        node_providers,
    })
}

pub(in crate::ic_registry) fn node_provider_from_governance(
    node_provider: GovernanceNodeProvider,
) -> Result<NnsNodeProviderRow, RegistryFetchError> {
    let principal = node_provider
        .id
        .ok_or(RegistryFetchError::MissingField {
            field: "node_provider.id",
        })?
        .to_text();
    let reward_account_hex = node_provider
        .reward_account
        .map(|account| hex_bytes(&account.hash));
    Ok(NnsNodeProviderRow {
        node_provider_principal: principal,
        name: None,
        node_count: None,
        reward_account_hex,
    })
}