sui_analytics_indexer/handlers/tables/
transaction_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::effects::TransactionEffectsAPI;
13use sui_types::full_checkpoint_content::Checkpoint;
14
15use crate::Row;
16use crate::pipeline::Pipeline;
17use crate::tables::TransactionBCSRow;
18
19pub struct TransactionBCSProcessor;
20
21impl Row for TransactionBCSRow {
22    fn get_epoch(&self) -> EpochId {
23        self.epoch
24    }
25
26    fn get_checkpoint(&self) -> u64 {
27        self.checkpoint
28    }
29}
30
31#[async_trait]
32impl Processor for TransactionBCSProcessor {
33    const NAME: &'static str = Pipeline::TransactionBCS.name();
34    type Value = TransactionBCSRow;
35
36    async fn process(&self, checkpoint: &Arc<Checkpoint>) -> Result<Vec<Self::Value>> {
37        let epoch = checkpoint.summary.data().epoch;
38        let checkpoint_seq = checkpoint.summary.data().sequence_number;
39        let timestamp_ms = checkpoint.summary.data().timestamp_ms;
40
41        let mut entries = Vec::with_capacity(checkpoint.transactions.len());
42
43        for checkpoint_transaction in &checkpoint.transactions {
44            let txn = &checkpoint_transaction.transaction;
45            let transaction_digest = checkpoint_transaction
46                .effects
47                .transaction_digest()
48                .base58_encode();
49
50            entries.push(TransactionBCSRow {
51                transaction_digest,
52                checkpoint: checkpoint_seq,
53                epoch,
54                timestamp_ms,
55                bcs: Base64::encode(bcs::to_bytes(txn)?),
56            });
57        }
58
59        Ok(entries)
60    }
61}