solana_block_decoder/address/
address_table_lookup.rs

1
2use {
3    crate::{
4        errors::{
5            decode_error::DecodeError,
6        }
7    },
8    solana_short_vec as short_vec,
9    solana_pubkey::{Pubkey, ParsePubkeyError},
10    solana_transaction_status_client_types::{
11        UiAddressTableLookup,
12    },
13    serde::{
14        Deserialize, Serialize,
15    },
16    std::{
17        str::FromStr,
18    },
19};
20
21#[derive(Serialize, Deserialize, Default, Debug, PartialEq, Eq, Clone)]
22#[serde(rename_all = "camelCase")]
23pub struct MessageAddressTableLookup {
24    /// Address lookup table account key
25    pub account_key: Pubkey,
26    /// List of indexes used to load writable account addresses
27    #[serde(with = "short_vec")]
28    pub writable_indexes: Vec<u8>,
29    /// List of indexes used to load readonly account addresses
30    #[serde(with = "short_vec")]
31    pub readonly_indexes: Vec<u8>,
32}
33
34impl TryFrom<&UiAddressTableLookup> for MessageAddressTableLookup {
35    type Error = DecodeError;
36
37    fn try_from(lookup: &UiAddressTableLookup) -> Result<Self, Self::Error> {
38        let account_key = Pubkey::from_str(&lookup.account_key)
39            .map_err(|_| DecodeError::ParsePubkeyFailed(ParsePubkeyError::Invalid))?;
40        Ok(Self {
41            account_key,
42            writable_indexes: lookup.writable_indexes.clone(),
43            readonly_indexes: lookup.readonly_indexes.clone(),
44        })
45    }
46}
47
48impl From<MessageAddressTableLookup> for solana_message::v0::MessageAddressTableLookup {
49    fn from(lookup: MessageAddressTableLookup) -> Self {
50        Self {
51            account_key: lookup.account_key,
52            writable_indexes: lookup.writable_indexes,
53            readonly_indexes: lookup.readonly_indexes,
54        }
55    }
56}