solana_binary_encoder/
parse_accounts.rs

1
2use {
3    // crate::{
4    //     loaded_message::LoadedMessage,
5    //     message::Message,
6    // },
7    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}