Skip to main content

klend_interface/state/
referral.rs

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