sol_parser_sdk/accounts/
utils.rs1use solana_sdk::pubkey::Pubkey;
6use spl_token::solana_program::program_pack::Pack;
7use spl_token::state::Account as SplTokenStateAccount;
8
9const SYSTEM_PROGRAM_ID: Pubkey = solana_sdk::pubkey!("11111111111111111111111111111111");
10
11#[inline]
13pub fn read_pubkey(data: &[u8], offset: usize) -> Option<Pubkey> {
14 if data.len() < offset + 32 {
15 return None;
16 }
17 let bytes: [u8; 32] = data[offset..offset + 32].try_into().ok()?;
18 Some(Pubkey::new_from_array(bytes))
19}
20
21#[inline]
23pub fn read_u64_le(data: &[u8], offset: usize) -> Option<u64> {
24 if data.len() < offset + 8 {
25 return None;
26 }
27 Some(u64::from_le_bytes(data[offset..offset + 8].try_into().ok()?))
28}
29
30#[inline]
32pub fn read_u16_le(data: &[u8], offset: usize) -> Option<u16> {
33 if data.len() < offset + 2 {
34 return None;
35 }
36 Some(u16::from_le_bytes(data[offset..offset + 2].try_into().ok()?))
37}
38
39#[inline]
41pub fn read_u8(data: &[u8], offset: usize) -> Option<u8> {
42 data.get(offset).copied()
43}
44
45#[inline]
49pub fn is_nonce_account(data: &[u8]) -> bool {
50 data.len() >= 8 && data[0..8] == [1, 0, 0, 0, 1, 0, 0, 0]
51}
52
53#[inline]
55pub fn is_token_program_account(owner: &Pubkey) -> bool {
56 owner.to_bytes() == spl_token::ID.to_bytes()
57 || owner.to_bytes() == spl_token_2022::ID.to_bytes()
58}
59
60#[inline]
66pub fn user_wallet_pubkey_for_onchain_account(
67 address: &Pubkey,
68 owner: &Pubkey,
69 data: &[u8],
70 executable: bool,
71) -> Option<Pubkey> {
72 if executable {
73 return None;
74 }
75 if owner == &SYSTEM_PROGRAM_ID {
76 return if data.is_empty() { Some(*address) } else { None };
77 }
78 if is_token_program_account(owner) && data.len() == SplTokenStateAccount::LEN {
79 let ta = SplTokenStateAccount::unpack(data).ok()?;
80 return Some(Pubkey::new_from_array(ta.owner.to_bytes()));
81 }
82 None
83}
84
85#[inline]
87pub fn has_discriminator(data: &[u8], discriminator: &[u8]) -> bool {
88 if data.len() < discriminator.len() {
89 return false;
90 }
91 &data[0..discriminator.len()] == discriminator
92}