solana_transaction_status/
parse_accounts.rs1use 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}