solana_block_decoder/address/
address_table_lookup.rs

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