Skip to main content

ih_types/
account.rs

1use anchor_lang::prelude::*;
2
3/// User account stored as a PDA on-chain
4/// Seeds: [b"user", authority.as_ref()]
5#[derive(AnchorSerialize, AnchorDeserialize, Clone, Debug, InitSpace)]
6pub struct UserAccount {
7    pub authority: Pubkey,              // 32
8    pub bump: u8,                       // 1
9    pub created_at: i64,                // 8
10    pub resume_hash: Option<[u8; 32]>,  // 33
11    pub last_resume_upload: Option<i64>,// 9
12    pub interview_count: u32,           // 4
13    pub last_interview_at: Option<i64>, // 9
14    pub reputation_score: i32,          // 4
15    pub ban_expires_at: Option<i64>,    // 9
16    pub violation_count: u8,            // 1
17    pub referred_by: Option<Pubkey>,    // 33
18    pub referral_count: u16,            // 2
19    pub profession_id: u16,             // 2
20}
21
22impl UserAccount {
23    pub const LEN: usize = 8 + 147; // discriminator + fields = 155
24}
25
26/// Interview result stored as a PDA on-chain (only for passed interviews)
27/// Seeds: [b"interview", authority.as_ref(), interview_index.to_le_bytes()]
28#[derive(AnchorSerialize, AnchorDeserialize, Clone, Debug, InitSpace)]
29pub struct InterviewResult {
30    pub authority: Pubkey,                  // 32
31    pub bump: u8,                           // 1
32    pub interview_index: u32,               // 4
33    pub started_at: i64,                    // 8
34    pub completed_at: i64,                  // 8
35    pub job_role_hash: [u8; 32],            // 32
36    pub profession_id: u16,                 // 2
37    pub technical_score: u8,                // 1
38    pub communication_score: u8,            // 1
39    pub behavioral_score: u8,               // 1
40    pub claims_verification_score: u8,      // 1
41    pub overall_score: u8,                  // 1
42    pub reputation_delta: i16,              // 2
43    pub recommendation: u8,                 // 1 (0=MAYBE, 1=HIRE, 2=STRONG_HIRE)
44    pub red_flag_count: u8,                 // 1
45    pub yellow_flag_count: u8,              // 1
46    pub transcript_hash: [u8; 32],          // 32
47    pub evaluation_hash: [u8; 32],          // 32
48    pub evaluator_version: u16,             // 2
49}
50
51impl InterviewResult {
52    pub const LEN: usize = 8 + 163; // discriminator + fields = 171
53}