solana_transaction_status/
parse_accounts.rs

1use solana_sdk::{
2    message::{v0::LoadedMessage, Message},
3    reserved_account_keys::ReservedAccountKeys,
4};
5pub use solana_transaction_status_client_types::{ParsedAccount, ParsedAccountSource};
6
7pub fn parse_legacy_message_accounts(message: &Message) -> Vec<ParsedAccount> {
8    let reserved_account_keys = ReservedAccountKeys::new_all_activated().active;
9    let mut accounts: Vec<ParsedAccount> = vec![];
10    for (i, account_key) in message.account_keys.iter().enumerate() {
11        accounts.push(ParsedAccount {
12            pubkey: account_key.to_string(),
13            writable: message.is_maybe_writable(i, Some(&reserved_account_keys)),
14            signer: message.is_signer(i),
15            source: Some(ParsedAccountSource::Transaction),
16        });
17    }
18    accounts
19}
20
21pub fn parse_v0_message_accounts(message: &LoadedMessage) -> Vec<ParsedAccount> {
22    let mut accounts: Vec<ParsedAccount> = vec![];
23    for (i, account_key) in message.account_keys().iter().enumerate() {
24        let source = if i < message.static_account_keys().len() {
25            ParsedAccountSource::Transaction
26        } else {
27            ParsedAccountSource::LookupTable
28        };
29        accounts.push(ParsedAccount {
30            pubkey: account_key.to_string(),
31            writable: message.is_writable(i),
32            signer: message.is_signer(i),
33            source: Some(source),
34        });
35    }
36    accounts
37}
38
39#[cfg(test)]
40mod test {
41    use {
42        super::*,
43        solana_sdk::{
44            message::{v0, v0::LoadedAddresses, MessageHeader},
45            pubkey::Pubkey,
46            reserved_account_keys::ReservedAccountKeys,
47        },
48    };
49
50    #[test]
51    fn test_parse_legacy_message_accounts() {
52        let pubkey0 = Pubkey::new_unique();
53        let pubkey1 = Pubkey::new_unique();
54        let pubkey2 = Pubkey::new_unique();
55        let pubkey3 = Pubkey::new_unique();
56        let message = Message {
57            header: MessageHeader {
58                num_required_signatures: 2,
59                num_readonly_signed_accounts: 1,
60                num_readonly_unsigned_accounts: 1,
61            },
62            account_keys: vec![pubkey0, pubkey1, pubkey2, pubkey3],
63            ..Message::default()
64        };
65
66        assert_eq!(
67            parse_legacy_message_accounts(&message),
68            vec![
69                ParsedAccount {
70                    pubkey: pubkey0.to_string(),
71                    writable: true,
72                    signer: true,
73                    source: Some(ParsedAccountSource::Transaction),
74                },
75                ParsedAccount {
76                    pubkey: pubkey1.to_string(),
77                    writable: false,
78                    signer: true,
79                    source: Some(ParsedAccountSource::Transaction),
80                },
81                ParsedAccount {
82                    pubkey: pubkey2.to_string(),
83                    writable: true,
84                    signer: false,
85                    source: Some(ParsedAccountSource::Transaction),
86                },
87                ParsedAccount {
88                    pubkey: pubkey3.to_string(),
89                    writable: false,
90                    signer: false,
91                    source: Some(ParsedAccountSource::Transaction),
92                },
93            ]
94        );
95    }
96
97    #[test]
98    fn test_parse_v0_message_accounts() {
99        let pubkey0 = Pubkey::new_unique();
100        let pubkey1 = Pubkey::new_unique();
101        let pubkey2 = Pubkey::new_unique();
102        let pubkey3 = Pubkey::new_unique();
103        let pubkey4 = Pubkey::new_unique();
104        let pubkey5 = Pubkey::new_unique();
105        let message = LoadedMessage::new(
106            v0::Message {
107                header: MessageHeader {
108                    num_required_signatures: 2,
109                    num_readonly_signed_accounts: 1,
110                    num_readonly_unsigned_accounts: 1,
111                },
112                account_keys: vec![pubkey0, pubkey1, pubkey2, pubkey3],
113                ..v0::Message::default()
114            },
115            LoadedAddresses {
116                writable: vec![pubkey4],
117                readonly: vec![pubkey5],
118            },
119            &ReservedAccountKeys::empty_key_set(),
120        );
121
122        assert_eq!(
123            parse_v0_message_accounts(&message),
124            vec![
125                ParsedAccount {
126                    pubkey: pubkey0.to_string(),
127                    writable: true,
128                    signer: true,
129                    source: Some(ParsedAccountSource::Transaction),
130                },
131                ParsedAccount {
132                    pubkey: pubkey1.to_string(),
133                    writable: false,
134                    signer: true,
135                    source: Some(ParsedAccountSource::Transaction),
136                },
137                ParsedAccount {
138                    pubkey: pubkey2.to_string(),
139                    writable: true,
140                    signer: false,
141                    source: Some(ParsedAccountSource::Transaction),
142                },
143                ParsedAccount {
144                    pubkey: pubkey3.to_string(),
145                    writable: false,
146                    signer: false,
147                    source: Some(ParsedAccountSource::Transaction),
148                },
149                ParsedAccount {
150                    pubkey: pubkey4.to_string(),
151                    writable: true,
152                    signer: false,
153                    source: Some(ParsedAccountSource::LookupTable),
154                },
155                ParsedAccount {
156                    pubkey: pubkey5.to_string(),
157                    writable: false,
158                    signer: false,
159                    source: Some(ParsedAccountSource::LookupTable),
160                },
161            ]
162        );
163    }
164}