Skip to main content

sol_parser_sdk/accounts/
utils.rs

1//! 账户解析工具函数
2//!
3//! 提供账户数据解析的通用工具函数
4
5use solana_sdk::pubkey::Pubkey;
6
7/// 从字节数组中读取 Pubkey
8#[inline]
9pub fn read_pubkey(data: &[u8], offset: usize) -> Option<Pubkey> {
10    if data.len() < offset + 32 {
11        return None;
12    }
13    let bytes: [u8; 32] = data[offset..offset + 32].try_into().ok()?;
14    Some(Pubkey::new_from_array(bytes))
15}
16
17/// 从字节数组中读取 u64(小端序)
18#[inline]
19pub fn read_u64_le(data: &[u8], offset: usize) -> Option<u64> {
20    if data.len() < offset + 8 {
21        return None;
22    }
23    Some(u64::from_le_bytes(
24        data[offset..offset + 8].try_into().ok()?,
25    ))
26}
27
28/// 从字节数组中读取 u16(小端序)
29#[inline]
30pub fn read_u16_le(data: &[u8], offset: usize) -> Option<u16> {
31    if data.len() < offset + 2 {
32        return None;
33    }
34    Some(u16::from_le_bytes(
35        data[offset..offset + 2].try_into().ok()?,
36    ))
37}
38
39/// 从字节数组中读取 u8
40#[inline]
41pub fn read_u8(data: &[u8], offset: usize) -> Option<u8> {
42    data.get(offset).copied()
43}
44
45/// 检查账户是否是 Nonce Account
46///
47/// Nonce accounts 有一个 discriminator: [1, 0, 0, 0, 1, 0, 0, 0]
48#[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/// 检查账户所有者是否是 Token Program
54#[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/// 检查账户是否匹配指定的 discriminator
61#[inline]
62pub fn has_discriminator(data: &[u8], discriminator: &[u8]) -> bool {
63    if data.len() < discriminator.len() {
64        return false;
65    }
66    &data[0..discriminator.len()] == discriminator
67}