rwa-kyc-hook-api 0.2.0

Token-2022 KYC Transfer Hook for RWA primary issuance on x402
Documentation
use super::{HookAccount, RecordKind};
use solana_program::program_error::ProgramError;
use static_assertions::const_assert_eq;
use steel::*;

#[repr(C)]
#[derive(Clone, Copy, Debug, PartialEq, Pod, Zeroable)]
pub struct KycRecord {
    pub user: Pubkey,
    pub issuer_id: [u8; 16],
    pub offering_id: [u8; 32],
    pub offering_id_len: u8,
    pub is_kyc_verified: u8,
    pub record_kind: u8,
    pub bump: u8,
    pub _padding: [u8; 4],
}

const_assert_eq!(core::mem::size_of::<KycRecord>() % 8, 0);

account!(HookAccount, KycRecord);

impl KycRecord {
    pub const VERIFIED: u8 = 1;
    pub const NOT_VERIFIED: u8 = 0;

    pub fn is_verified(&self) -> bool {
        self.is_kyc_verified == Self::VERIFIED
    }

    pub fn record_kind_enum(&self) -> Result<RecordKind, ProgramError> {
        RecordKind::try_from(self.record_kind).map_err(|_| ProgramError::InvalidAccountData)
    }

    pub fn issuer_id_matches(&self, expected: &[u8; 16]) -> bool {
        &self.issuer_id == expected
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn offering_id_offset_for_extra_account_meta() {
        let offset = core::mem::offset_of!(KycRecord, offering_id) as u8;
        assert_eq!(offset, 48);
    }
}