Skip to main content

klend_interface/state/
referral.rs

1use bytemuck::{Pod, Zeroable};
2use solana_pubkey::Pubkey;
3use spl_discriminator::SplDiscriminate;
4
5use super::pod::PodU128;
6
7/// Per-referrer, per-reserve fee tracking account.
8#[derive(Debug, Clone, Copy, Pod, Zeroable, SplDiscriminate)]
9#[discriminator_hash_input("account:ReferrerTokenState")]
10#[repr(C)]
11pub struct ReferrerTokenState {
12    pub referrer: Pubkey,
13    pub mint: Pubkey,
14    /// Unclaimed fees (scaled fraction).
15    pub amount_unclaimed_sf: PodU128,
16    /// Total accumulated fees (scaled fraction).
17    pub amount_cumulative_sf: PodU128,
18    pub bump: u64,
19    pub padding: [u64; 31],
20}
21
22const _: () = assert!(core::mem::size_of::<ReferrerTokenState>() == 352);
23
24impl ReferrerTokenState {
25    /// Unclaimed referrer fees as a raw u128 scaled fraction.
26    pub fn amount_unclaimed(&self) -> u128 {
27        u128::from(self.amount_unclaimed_sf)
28    }
29
30    /// Total accumulated referrer fees as a raw u128 scaled fraction.
31    pub fn amount_cumulative(&self) -> u128 {
32        u128::from(self.amount_cumulative_sf)
33    }
34}
35
36/// User metadata — links a wallet to its referrer.
37#[derive(Debug, Clone, Copy, Zeroable, Pod, SplDiscriminate)]
38#[discriminator_hash_input("account:UserMetadata")]
39#[repr(C)]
40pub struct UserMetadata {
41    /// Referrer address (`Pubkey::default()` = no referrer).
42    pub referrer: Pubkey,
43    pub bump: u64,
44    pub user_lookup_table: Pubkey,
45    pub owner: Pubkey,
46    pub padding_1: [u64; 51],
47    pub padding_2: [u64; 64],
48}
49
50const _: () = assert!(core::mem::size_of::<UserMetadata>() == 1024);
51
52impl UserMetadata {
53    /// Returns the referrer, or `None` if no referrer is set.
54    pub fn referrer(&self) -> Option<Pubkey> {
55        if self.referrer == Pubkey::default() {
56            None
57        } else {
58            Some(self.referrer)
59        }
60    }
61}
62
63/// Referrer state — maps a referrer to their short URL.
64#[derive(Debug, Clone, Copy, Zeroable, Pod, SplDiscriminate)]
65#[discriminator_hash_input("account:ReferrerState")]
66#[repr(C)]
67pub struct ReferrerState {
68    pub short_url: Pubkey,
69    pub owner: Pubkey,
70}
71
72const _: () = assert!(core::mem::size_of::<ReferrerState>() == 64);