solana_block_decoder/
lib.rs

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