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