sui_analytics_indexer/handlers/tables/
package_bcs.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use std::sync::Arc;
5
6use anyhow::Result;
7use async_trait::async_trait;
8use fastcrypto::encoding::Base64;
9use fastcrypto::encoding::Encoding;
10use sui_indexer_alt_framework::pipeline::Processor;
11use sui_types::base_types::EpochId;
12use sui_types::full_checkpoint_content::Checkpoint;
13
14use crate::Row;
15use crate::pipeline::Pipeline;
16use crate::tables::PackageBCSRow;
17
18pub struct PackageBCSProcessor;
19
20impl Row for PackageBCSRow {
21    fn get_epoch(&self) -> EpochId {
22        self.epoch
23    }
24
25    fn get_checkpoint(&self) -> u64 {
26        self.checkpoint
27    }
28}
29
30#[async_trait]
31impl Processor for PackageBCSProcessor {
32    const NAME: &'static str = Pipeline::MovePackageBCS.name();
33    type Value = PackageBCSRow;
34
35    async fn process(&self, checkpoint: &Arc<Checkpoint>) -> Result<Vec<Self::Value>> {
36        let epoch = checkpoint.summary.data().epoch;
37        let checkpoint_seq = checkpoint.summary.data().sequence_number;
38        let timestamp_ms = checkpoint.summary.data().timestamp_ms;
39
40        let mut packages = Vec::new();
41        for transaction in &checkpoint.transactions {
42            for object in transaction.output_objects(&checkpoint.object_set) {
43                if let sui_types::object::Data::Package(_p) = &object.data {
44                    let package_id = object.id();
45                    let row = PackageBCSRow {
46                        package_id: package_id.to_string(),
47                        checkpoint: checkpoint_seq,
48                        epoch,
49                        timestamp_ms,
50                        bcs: Base64::encode(bcs::to_bytes(object).unwrap()),
51                    };
52                    packages.push(row);
53                }
54            }
55        }
56
57        Ok(packages)
58    }
59}