2020-06-19 16:15:13 -06:00
|
|
|
use solana_sdk::message::Message;
|
|
|
|
|
2020-08-05 00:58:58 -06:00
|
|
|
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
2020-06-19 16:15:13 -06:00
|
|
|
#[serde(rename_all = "camelCase")]
|
2020-08-05 00:58:58 -06:00
|
|
|
pub struct ParsedAccount {
|
|
|
|
pub pubkey: String,
|
|
|
|
pub writable: bool,
|
|
|
|
pub signer: bool,
|
2020-06-19 16:15:13 -06:00
|
|
|
}
|
|
|
|
|
2020-08-05 00:58:58 -06:00
|
|
|
pub fn parse_accounts(message: &Message) -> Vec<ParsedAccount> {
|
|
|
|
let mut accounts: Vec<ParsedAccount> = vec![];
|
2020-06-19 16:15:13 -06:00
|
|
|
for (i, account_key) in message.account_keys.iter().enumerate() {
|
2020-08-05 00:58:58 -06:00
|
|
|
accounts.push(ParsedAccount {
|
|
|
|
pubkey: account_key.to_string(),
|
2021-03-30 10:05:09 -07:00
|
|
|
writable: message.is_writable(i, /*demote_sysvar_write_locks=*/ true),
|
2020-08-05 00:58:58 -06:00
|
|
|
signer: message.is_signer(i),
|
|
|
|
});
|
2020-06-19 16:15:13 -06:00
|
|
|
}
|
2020-08-05 00:58:58 -06:00
|
|
|
accounts
|
2020-06-19 16:15:13 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
mod test {
|
|
|
|
use super::*;
|
2020-10-19 12:23:14 -07:00
|
|
|
use solana_sdk::message::MessageHeader;
|
2020-06-19 16:15:13 -06:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_parse_accounts() {
|
2020-10-19 12:12:08 -07:00
|
|
|
let pubkey0 = solana_sdk::pubkey::new_rand();
|
|
|
|
let pubkey1 = solana_sdk::pubkey::new_rand();
|
|
|
|
let pubkey2 = solana_sdk::pubkey::new_rand();
|
|
|
|
let pubkey3 = solana_sdk::pubkey::new_rand();
|
2020-12-13 17:26:34 -08:00
|
|
|
let message = Message {
|
|
|
|
header: MessageHeader {
|
|
|
|
num_required_signatures: 2,
|
|
|
|
num_readonly_signed_accounts: 1,
|
|
|
|
num_readonly_unsigned_accounts: 1,
|
|
|
|
},
|
|
|
|
account_keys: vec![pubkey0, pubkey1, pubkey2, pubkey3],
|
|
|
|
..Message::default()
|
2020-06-19 16:15:13 -06:00
|
|
|
};
|
|
|
|
|
2020-08-05 00:58:58 -06:00
|
|
|
assert_eq!(
|
|
|
|
parse_accounts(&message),
|
|
|
|
vec![
|
|
|
|
ParsedAccount {
|
|
|
|
pubkey: pubkey0.to_string(),
|
|
|
|
writable: true,
|
|
|
|
signer: true,
|
|
|
|
},
|
|
|
|
ParsedAccount {
|
|
|
|
pubkey: pubkey1.to_string(),
|
|
|
|
writable: false,
|
|
|
|
signer: true,
|
|
|
|
},
|
|
|
|
ParsedAccount {
|
|
|
|
pubkey: pubkey2.to_string(),
|
|
|
|
writable: true,
|
|
|
|
signer: false,
|
|
|
|
},
|
|
|
|
ParsedAccount {
|
|
|
|
pubkey: pubkey3.to_string(),
|
|
|
|
writable: false,
|
|
|
|
signer: false,
|
|
|
|
},
|
|
|
|
]
|
|
|
|
);
|
2020-06-19 16:15:13 -06:00
|
|
|
}
|
|
|
|
}
|