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}