Skip to main content

klend_interface/
pda.rs

1use solana_pubkey::Pubkey;
2
3pub const LENDING_MARKET_AUTH: &[u8] = b"lma";
4pub const RESERVE_LIQ_SUPPLY: &[u8] = b"reserve_liq_supply";
5pub const FEE_RECEIVER: &[u8] = b"fee_receiver";
6pub const RESERVE_COLL_MINT: &[u8] = b"reserve_coll_mint";
7pub const RESERVE_COLL_SUPPLY: &[u8] = b"reserve_coll_supply";
8pub const BASE_SEED_REFERRER_TOKEN_STATE: &[u8] = b"referrer_acc";
9pub const BASE_SEED_USER_METADATA: &[u8] = b"user_meta";
10pub const BASE_SEED_REFERRER_STATE: &[u8] = b"ref_state";
11pub const BASE_SEED_SHORT_URL: &[u8] = b"short_url";
12pub const GLOBAL_CONFIG_STATE: &[u8] = b"global_config";
13pub const WITHDRAW_TICKET: &[u8] = b"withdraw_ticket";
14pub const OWNER_QUEUED_COLLATERAL_VAULT: &[u8] = b"owner_queued_collateral_vault";
15pub const EVENT_AUTHORITY: &[u8] = b"__event_authority";
16
17/// All 4 reserve-related PDAs.
18pub struct ReservePdas {
19    pub liquidity_supply_vault: Pubkey,
20    pub fee_vault: Pubkey,
21    pub collateral_mint: Pubkey,
22    pub collateral_supply_vault: Pubkey,
23}
24
25impl ReservePdas {
26    pub fn derive(program_id: &Pubkey, reserve: &Pubkey) -> Self {
27        Self {
28            liquidity_supply_vault: reserve_liquidity_supply(program_id, reserve).0,
29            fee_vault: reserve_fee_receiver(program_id, reserve).0,
30            collateral_mint: reserve_collateral_mint(program_id, reserve).0,
31            collateral_supply_vault: reserve_collateral_supply(program_id, reserve).0,
32        }
33    }
34}
35
36pub fn lending_market_authority(program_id: &Pubkey, lending_market: &Pubkey) -> (Pubkey, u8) {
37    Pubkey::find_program_address(&[LENDING_MARKET_AUTH, lending_market.as_ref()], program_id)
38}
39
40pub fn obligation(
41    program_id: &Pubkey,
42    tag: u8,
43    id: u8,
44    owner: &Pubkey,
45    lending_market: &Pubkey,
46    seed1: &Pubkey,
47    seed2: &Pubkey,
48) -> (Pubkey, u8) {
49    Pubkey::find_program_address(
50        &[
51            &[tag],
52            &[id],
53            owner.as_ref(),
54            lending_market.as_ref(),
55            seed1.as_ref(),
56            seed2.as_ref(),
57        ],
58        program_id,
59    )
60}
61
62pub fn reserve_liquidity_supply(program_id: &Pubkey, reserve: &Pubkey) -> (Pubkey, u8) {
63    Pubkey::find_program_address(&[RESERVE_LIQ_SUPPLY, reserve.as_ref()], program_id)
64}
65
66pub fn reserve_fee_receiver(program_id: &Pubkey, reserve: &Pubkey) -> (Pubkey, u8) {
67    Pubkey::find_program_address(&[FEE_RECEIVER, reserve.as_ref()], program_id)
68}
69
70pub fn reserve_collateral_mint(program_id: &Pubkey, reserve: &Pubkey) -> (Pubkey, u8) {
71    Pubkey::find_program_address(&[RESERVE_COLL_MINT, reserve.as_ref()], program_id)
72}
73
74pub fn reserve_collateral_supply(program_id: &Pubkey, reserve: &Pubkey) -> (Pubkey, u8) {
75    Pubkey::find_program_address(&[RESERVE_COLL_SUPPLY, reserve.as_ref()], program_id)
76}
77
78pub fn referrer_token_state(
79    program_id: &Pubkey,
80    referrer: &Pubkey,
81    reserve: &Pubkey,
82) -> (Pubkey, u8) {
83    Pubkey::find_program_address(
84        &[
85            BASE_SEED_REFERRER_TOKEN_STATE,
86            referrer.as_ref(),
87            reserve.as_ref(),
88        ],
89        program_id,
90    )
91}
92
93pub fn user_metadata(program_id: &Pubkey, owner: &Pubkey) -> (Pubkey, u8) {
94    Pubkey::find_program_address(&[BASE_SEED_USER_METADATA, owner.as_ref()], program_id)
95}
96
97pub fn referrer_state(program_id: &Pubkey, referrer: &Pubkey) -> (Pubkey, u8) {
98    Pubkey::find_program_address(&[BASE_SEED_REFERRER_STATE, referrer.as_ref()], program_id)
99}
100
101pub fn short_url(program_id: &Pubkey, url: &str) -> (Pubkey, u8) {
102    Pubkey::find_program_address(&[BASE_SEED_SHORT_URL, url.as_bytes()], program_id)
103}
104
105pub fn global_config(program_id: &Pubkey) -> (Pubkey, u8) {
106    Pubkey::find_program_address(&[GLOBAL_CONFIG_STATE], program_id)
107}
108
109pub fn withdraw_ticket(
110    program_id: &Pubkey,
111    reserve: &Pubkey,
112    sequence_number: u64,
113) -> (Pubkey, u8) {
114    Pubkey::find_program_address(
115        &[
116            WITHDRAW_TICKET,
117            reserve.as_ref(),
118            &sequence_number.to_le_bytes(),
119        ],
120        program_id,
121    )
122}
123
124pub fn owner_queued_collateral_vault(
125    program_id: &Pubkey,
126    reserve: &Pubkey,
127    owner: &Pubkey,
128) -> (Pubkey, u8) {
129    Pubkey::find_program_address(
130        &[
131            OWNER_QUEUED_COLLATERAL_VAULT,
132            reserve.as_ref(),
133            owner.as_ref(),
134        ],
135        program_id,
136    )
137}
138
139pub fn event_authority(program_id: &Pubkey) -> (Pubkey, u8) {
140    Pubkey::find_program_address(&[EVENT_AUTHORITY], program_id)
141}
142
143/// Farms user state PDA for an obligation on a specific farm.
144///
145/// Seeds: `[b"user", farm_state, obligation]` on [`crate::FARMS_PROGRAM_ID`].
146pub fn farms_user_state(farm_state: &Pubkey, obligation: &Pubkey) -> (Pubkey, u8) {
147    Pubkey::find_program_address(
148        &[b"user", farm_state.as_ref(), obligation.as_ref()],
149        &crate::FARMS_PROGRAM_ID,
150    )
151}