solana_system_program/
lib.rs

1#![allow(clippy::arithmetic_side_effects)]
2pub mod system_instruction;
3pub mod system_processor;
4
5use solana_sdk::{
6    account::{AccountSharedData, ReadableAccount},
7    account_utils::StateMut,
8    nonce, system_program,
9};
10pub use system_program::id;
11
12#[derive(Copy, Clone, Debug, Eq, PartialEq)]
13pub enum SystemAccountKind {
14    System,
15    Nonce,
16}
17
18pub fn get_system_account_kind(account: &AccountSharedData) -> Option<SystemAccountKind> {
19    if system_program::check_id(account.owner()) {
20        if account.data().is_empty() {
21            Some(SystemAccountKind::System)
22        } else if account.data().len() == nonce::State::size() {
23            let nonce_versions: nonce::state::Versions = account.state().ok()?;
24            match nonce_versions.state() {
25                nonce::State::Uninitialized => None,
26                nonce::State::Initialized(_) => Some(SystemAccountKind::Nonce),
27            }
28        } else {
29            None
30        }
31    } else {
32        None
33    }
34}