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
17pub 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
143pub 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}