solana_binary_encoder/
parse_accounts.rs1
2use {
3 solana_sdk::message::{v0::LoadedMessage, Message},
8 serde_derive::{Serialize,Deserialize},
9};
10
11#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
12#[serde(rename_all = "camelCase")]
13pub struct ParsedAccount {
14 pub pubkey: String,
15 pub writable: bool,
16 pub signer: bool,
17 pub source: Option<ParsedAccountSource>,
18}
19
20#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
21#[serde(rename_all = "camelCase")]
22pub enum ParsedAccountSource {
23 Transaction,
24 LookupTable,
25}
26
27pub fn parse_legacy_message_accounts(message: &Message) -> Vec<ParsedAccount> {
28 let mut accounts: Vec<ParsedAccount> = vec![];
29 for (i, account_key) in message.account_keys.iter().enumerate() {
30 accounts.push(ParsedAccount {
31 pubkey: account_key.to_string(),
32 writable: message.is_writable(i),
33 signer: message.is_signer(i),
34 source: Some(ParsedAccountSource::Transaction),
35 });
36 }
37 accounts
38}
39
40pub fn parse_v0_message_accounts(message: &LoadedMessage) -> Vec<ParsedAccount> {
41 let mut accounts: Vec<ParsedAccount> = vec![];
42 for (i, account_key) in message.account_keys().iter().enumerate() {
43 let source = if i < message.static_account_keys().len() {
44 ParsedAccountSource::Transaction
45 } else {
46 ParsedAccountSource::LookupTable
47 };
48 accounts.push(ParsedAccount {
49 pubkey: account_key.to_string(),
50 writable: message.is_writable(i),
51 signer: message.is_signer(i),
52 source: Some(source),
53 });
54 }
55 accounts
56}