Skip to main content

sui_indexer_alt_reader/
governance.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use std::collections::HashMap;
5
6use async_graphql::dataloader::Loader;
7use mysten_common::ZipDebugEqIteratorExt;
8use sui_sdk_types::Address;
9
10use crate::error::Error;
11use crate::fullnode_client::FullnodeClient;
12
13#[derive(Debug, Clone, PartialEq, Eq, Hash)]
14pub struct RewardsKey(pub Address);
15
16#[derive(Debug, Clone, PartialEq, Eq, Hash)]
17pub struct ValidatorAddressKey(pub Address);
18
19#[async_trait::async_trait]
20impl Loader<RewardsKey> for FullnodeClient {
21    type Value = u64;
22    type Error = Error;
23
24    async fn load(&self, keys: &[RewardsKey]) -> Result<HashMap<RewardsKey, u64>, Self::Error> {
25        let ids: Vec<Address> = keys.iter().map(|k| k.0).collect();
26        let results = self.calculate_rewards(&ids).await?;
27        Ok(keys
28            .iter()
29            .zip_debug_eq(results)
30            .map(|(k, reward)| (k.clone(), reward))
31            .collect())
32    }
33}
34
35#[async_trait::async_trait]
36impl Loader<ValidatorAddressKey> for FullnodeClient {
37    type Value = Address;
38    type Error = Error;
39
40    async fn load(
41        &self,
42        keys: &[ValidatorAddressKey],
43    ) -> Result<HashMap<ValidatorAddressKey, Address>, Self::Error> {
44        let ids: Vec<Address> = keys.iter().map(|k| k.0).collect();
45        let results = self.get_validator_address_by_pool_id(&ids).await?;
46        Ok(keys
47            .iter()
48            .zip_debug_eq(results)
49            .map(|(k, addr)| (k.clone(), addr))
50            .collect())
51    }
52}