solana_block_decoder/
lib.rs

1use {
2    solana_storage_utils::compression::compress_best,
3    solana_transaction_status::{
4        BlockEncodingOptions,
5        VersionedConfirmedBlock as SolanaVersionedConfirmedBlock,
6    },
7    solana_transaction_status_client_types::{
8        UiTransactionEncoding,
9    },
10    block::{
11        confirmed_block::ConfirmedBlock,
12        encoded_block::EncodedConfirmedBlock,
13        ui_block::UiConfirmedBlock,
14        versioned_block::VersionedConfirmedBlock,
15    },
16};
17
18pub mod errors {
19    pub mod conversion_error;
20    pub mod decode_error;
21}
22
23pub mod block {
24    pub mod confirmed_block;
25    pub mod encoded_block;
26    pub mod versioned_block;
27    pub mod ui_block;
28}
29
30pub mod transaction {
31    pub mod transaction;
32    pub mod tx_status_meta;
33    pub mod tx_return_data;
34    pub mod tx_token_balance;
35    pub mod versioned_transaction;
36
37    pub use transaction::Transaction;
38}
39
40pub mod address {
41    pub mod address_table_lookup;
42    pub mod loaded_addresses;
43}
44
45pub mod instruction {
46    pub mod compiled_instruction;
47    pub mod inner_instruction;
48    pub use compiled_instruction::CompiledInstruction;
49    pub use inner_instruction::InnerInstruction;
50}
51
52pub mod message {
53    pub mod message;
54    pub mod message_v0;
55    pub mod versioned_message;
56}
57
58pub mod decodable;
59
60pub async fn encode_block<T>(
61    data: T,
62) -> Result<Vec<u8>, Box<dyn std::error::Error>>
63    where
64        T: prost::Message,
65{
66    let mut buf = Vec::with_capacity(data.encoded_len());
67    data.encode(&mut buf).unwrap();
68    let data = compress_best(&buf)?;
69
70    Ok(data)
71}
72
73pub fn convert_block(
74    encoded_block: EncodedConfirmedBlock,
75    encoding: UiTransactionEncoding,
76    options: BlockEncodingOptions,
77) -> Result<SolanaVersionedConfirmedBlock, Box<dyn std::error::Error>> {
78    // Step 1: Convert EncodedConfirmedBlock to UiConfirmedBlock
79    let ui_block: UiConfirmedBlock = encoded_block.into();
80
81    // Step 2: Decode UiConfirmedBlock to ConfirmedBlock
82    let confirmed_block = ConfirmedBlock::decode_with_options(ui_block, encoding, options)?;
83
84    // Step 3: Try to convert ConfirmedBlock to VersionedConfirmedBlock
85    let versioned_block = VersionedConfirmedBlock::try_from(confirmed_block)?;
86
87    // Ok(convert_versioned_confirmed_block(&versioned_block))
88    Ok(versioned_block.into())
89}
90
91pub async fn encode_transaction<T>(
92    data: T,
93) -> Result<Vec<u8>, Box<dyn std::error::Error>>
94    where
95        T: prost::Message,
96{
97    let mut buf = Vec::with_capacity(data.encoded_len());
98    data.encode(&mut buf).unwrap();
99    let data = compress_best(&buf)?;
100
101    Ok(data)
102}
103
104// pub fn convert_transaction(
105//     encoded_tx: EncodedTransactionWithStatusMeta,
106//     encoding: UiTransactionEncoding,
107//     // options: BlockEncodingOptions,
108// ) -> Result<TransactionWithStatusMeta, Box<dyn std::error::Error>> {
109//
110//     let confirmed_tx = TransactionWithStatusMeta::decode(encoded_tx, encoding)?;
111//
112//     // Try to convert ConfirmedBlock to VersionedConfirmedBlock
113//     // let versioned_block = VersionedConfirmedBlock::try_from(confirmed_tx)?;
114//
115//     Ok(confirmed_tx)
116// }