solana_block_decoder/address/
loaded_addresses.rs

1use {
2    solana_sdk::{
3        pubkey::{Pubkey, ParsePubkeyError},
4    },
5    solana_transaction_status::{
6        UiLoadedAddresses,
7    },
8    serde::{
9        Deserialize, Serialize,
10    },
11    std::{
12        str::FromStr,
13    },
14};
15
16/// Collection of addresses loaded from on-chain lookup tables, split
17/// by readonly and writable.
18#[derive(Clone, Default, Debug, PartialEq, Eq, Serialize, Deserialize)]
19pub struct LoadedAddresses {
20    /// List of addresses for writable loaded accounts
21    pub writable: Vec<Pubkey>,
22    /// List of addresses for read-only loaded accounts
23    pub readonly: Vec<Pubkey>,
24}
25
26impl TryFrom<&UiLoadedAddresses> for LoadedAddresses {
27    type Error = ParsePubkeyError;
28
29    fn try_from(ui_loaded_addresses: &UiLoadedAddresses) -> Result<Self, Self::Error> {
30        let writable: Result<Vec<Pubkey>, _> = ui_loaded_addresses
31            .writable
32            .iter()
33            .map(|s| Pubkey::from_str(s))
34            .collect();
35
36        let readonly: Result<Vec<Pubkey>, _> = ui_loaded_addresses
37            .readonly
38            .iter()
39            .map(|s| Pubkey::from_str(s))
40            .collect();
41
42        Ok(Self {
43            writable: writable?,
44            readonly: readonly?,
45        })
46    }
47}
48
49impl From<LoadedAddresses> for solana_sdk::message::v0::LoadedAddresses {
50    fn from(addresses: LoadedAddresses) -> Self {
51        Self {
52            writable: addresses.writable,
53            readonly: addresses.readonly,
54        }
55    }
56}