sui_analytics_indexer/handlers/tables/
package_bcs.rs1use 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}