sui_indexer_alt/handlers/
kv_protocol_configs.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// Copyright (c) Mysten Labs, Inc.
// SPDX-License-Identifier: Apache-2.0

use std::sync::Arc;

use anyhow::{Context, Result};
use diesel_async::RunQueryDsl;
use sui_indexer_alt_framework::{
    db::{Connection, Db},
    pipeline::{concurrent::Handler, Processor},
    types::full_checkpoint_content::CheckpointData,
};
use sui_indexer_alt_schema::{
    checkpoints::StoredGenesis, epochs::StoredProtocolConfig, schema::kv_protocol_configs,
};
use sui_protocol_config::ProtocolConfig;

pub(crate) struct KvProtocolConfigs(pub(crate) StoredGenesis);

impl Processor for KvProtocolConfigs {
    const NAME: &'static str = "kv_protocol_configs";
    type Value = StoredProtocolConfig;

    fn process(&self, checkpoint: &Arc<CheckpointData>) -> Result<Vec<Self::Value>> {
        let CheckpointData {
            checkpoint_summary, ..
        } = checkpoint.as_ref();

        let protocol_version = if checkpoint_summary.sequence_number == 0 {
            self.0.initial_protocol_version()
        } else if let Some(end_of_epoch) = checkpoint_summary.end_of_epoch_data.as_ref() {
            end_of_epoch.next_epoch_protocol_version
        } else {
            return Ok(vec![]);
        };

        let protocol_config = ProtocolConfig::get_for_version(
            protocol_version,
            self.0.chain().context("Failed to identify chain")?,
        );

        let protocol_version = protocol_version.as_u64() as i64;
        Ok(protocol_config
            .attr_map()
            .into_iter()
            .map(|(config_name, value)| StoredProtocolConfig {
                protocol_version,
                config_name,
                config_value: value.map(|v| v.to_string()),
            })
            .collect())
    }
}

#[async_trait::async_trait]
impl Handler for KvProtocolConfigs {
    type Store = Db;

    const MIN_EAGER_ROWS: usize = 1;
    const MAX_PENDING_ROWS: usize = 10000;

    async fn commit<'a>(values: &[Self::Value], conn: &mut Connection<'a>) -> Result<usize> {
        Ok(diesel::insert_into(kv_protocol_configs::table)
            .values(values)
            .on_conflict_do_nothing()
            .execute(conn)
            .await?)
    }
}