solana_block_decoder/address/
address_table_lookup.rs1
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 pub account_key: Pubkey,
26 #[serde(with = "short_vec")]
28 pub writable_indexes: Vec<u8>,
29 #[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}