use crate::core::events::{EventMetadata, NonceAccountEvent};
use crate::DexEvent;
use super::token::AccountData;
const NONCE_ACCOUNT_SIZE: usize = 80;
const AUTHORITY_OFFSET: usize = 8;
const NONCE_OFFSET: usize = 40;
pub fn parse_nonce_account(account: &AccountData, metadata: EventMetadata) -> Option<DexEvent> {
let data = &account.data;
if data.len() != NONCE_ACCOUNT_SIZE {
return None;
}
let authority_bytes: [u8; 32] =
data[AUTHORITY_OFFSET..AUTHORITY_OFFSET + 32].try_into().ok()?;
let authority = bs58::encode(&authority_bytes).into_string();
let nonce_bytes: [u8; 32] = data[NONCE_OFFSET..NONCE_OFFSET + 32].try_into().ok()?;
let nonce = bs58::encode(&nonce_bytes).into_string();
let event = NonceAccountEvent {
metadata,
pubkey: account.pubkey,
executable: account.executable,
lamports: account.lamports,
owner: account.owner,
rent_epoch: account.rent_epoch,
nonce,
authority,
};
Some(DexEvent::NonceAccount(event))
}
pub fn is_nonce_account(data: &[u8]) -> bool {
data.len() >= 8 && &data[0..8] == &[1, 0, 0, 0, 1, 0, 0, 0]
}