ih_types/
account.rs

1use anchor_lang::prelude::*;
2use serde::{Deserialize, Serialize};
3
4/// Compressed user account stored as Merkle tree leaf
5/// Uses deterministic hashing (registration_timestamp=0) to prevent duplicates
6#[derive(
7    AnchorSerialize,
8    AnchorDeserialize,
9    Clone,
10    Debug,
11    Serialize,
12    Deserialize,
13)]
14pub struct CompressedUserAccount {
15    pub authority: Pubkey,           // 32 bytes - User's wallet address
16    pub registration_timestamp: i64, // 8 bytes
17
18    // Resume tracking (45-day restriction)
19    pub resume_hash: Option<[u8; 32]>,   // 33 bytes
20    pub last_resume_upload: Option<i64>, // 9 bytes
21
22    // Interview tracking (3-month restriction)
23    pub last_interview_attempt: Option<i64>, // 9 bytes
24    pub interview_count: u32,                // 4 bytes
25
26    // Reputation & moderation
27    pub reputation_score: i32,       // 4 bytes
28    pub ban_expires_at: Option<i64>, // 9 bytes - None = not banned, i64::MAX = permanent
29    pub violation_count: u8,         // 1 byte
30
31    // Total: ~109 bytes per user
32}