1use serde::{Deserialize, Serialize};
2use solana_pubkey::Pubkey;
3
4pub const KAMINO_FRACTION_SCALE: u128 = 1 << 60;
8
9#[derive(Serialize, Deserialize, Clone, Debug)]
14pub struct KaminoReserve {
15 pub lending_market: Pubkey,
16 pub liquidity: KaminoReserveLiquidity,
17 pub collateral: KaminoReserveCollateral,
18 pub config: KaminoReserveConfig,
19 pub last_update: KaminoLastUpdate,
20}
21
22#[derive(Serialize, Deserialize, Clone, Debug)]
24pub struct KaminoReserveLiquidity {
25 pub mint_pubkey: Pubkey,
26 pub supply_vault: Pubkey,
27 pub fee_vault: Pubkey,
28 pub total_available_amount: u64,
29 pub borrowed_amount_sf: u128,
30 pub cumulative_borrow_rate_bsf: KaminoBigFractionBytes,
31 #[serde(default)]
32 pub accumulated_protocol_fees_sf: u128,
33 #[serde(default)]
34 pub accumulated_referrer_fees_sf: u128,
35 #[serde(default)]
36 pub pending_referrer_fees_sf: u128,
37 pub mint_decimals: u64,
38 pub market_price_sf: u128,
39 #[serde(default)]
41 pub token_program: Pubkey,
42}
43
44#[derive(Serialize, Deserialize, Clone, Debug)]
46pub struct KaminoReserveCollateral {
47 pub mint_pubkey: Pubkey,
48 pub supply_vault: Pubkey,
49 pub mint_total_supply: u64,
50}
51
52#[derive(Serialize, Deserialize, Clone, Debug)]
54pub struct KaminoReserveConfig {
55 pub loan_to_value_pct: u8,
56 pub liquidation_threshold_pct: u8,
57 pub protocol_take_rate_pct: u8,
58 pub protocol_liquidation_fee_pct: u8,
59 pub borrow_factor_pct: u64,
60 pub deposit_limit: u64,
61 pub borrow_limit: u64,
62 pub fees: KaminoReserveFees,
63 pub borrow_rate_curve: KaminoBorrowRateCurve,
64 pub deposit_withdrawal_cap: KaminoWithdrawalCaps,
65 pub debt_withdrawal_cap: KaminoWithdrawalCaps,
66 pub elevation_groups: [u8; 20],
67 #[serde(default)]
68 pub token_info: KaminoTokenInfo,
69}
70
71#[derive(Serialize, Deserialize, Clone, Debug, Default)]
73pub struct KaminoTokenInfo {
74 #[serde(default)]
76 pub name: String,
77 #[serde(default)]
78 pub heuristic: KaminoPriceHeuristic,
79 #[serde(default)]
80 pub max_twap_divergence_bps: u64,
81 #[serde(default)]
82 pub max_age_price_seconds: u64,
83 #[serde(default)]
84 pub max_age_twap_seconds: u64,
85 #[serde(default)]
86 pub scope_configuration: KaminoScopeConfiguration,
87 #[serde(default)]
88 pub switchboard_configuration: KaminoSwitchboardConfiguration,
89 #[serde(default)]
90 pub pyth_configuration: KaminoPythConfiguration,
91 #[serde(default)]
92 pub block_price_usage: u8,
93}
94
95#[derive(Serialize, Deserialize, Clone, Debug, Default)]
97pub struct KaminoPriceHeuristic {
98 pub lower: u64,
99 pub upper: u64,
100 pub exp: u64,
101}
102
103#[derive(Serialize, Deserialize, Clone, Debug, Default)]
105pub struct KaminoScopeConfiguration {
106 #[serde(default)]
107 pub price_feed: Pubkey,
108 #[serde(default)]
109 pub price_chain: [u16; 4],
110 #[serde(default)]
111 pub twap_chain: [u16; 4],
112}
113
114#[derive(Serialize, Deserialize, Clone, Debug, Default)]
116pub struct KaminoSwitchboardConfiguration {
117 #[serde(default)]
118 pub price_aggregator: Pubkey,
119 #[serde(default)]
120 pub twap_aggregator: Pubkey,
121}
122
123#[derive(Serialize, Deserialize, Clone, Debug, Default)]
125pub struct KaminoPythConfiguration {
126 #[serde(default)]
127 pub price: Pubkey,
128}
129
130#[derive(Serialize, Deserialize, Clone, Debug)]
134pub struct KaminoObligation {
135 pub lending_market: Pubkey,
136 #[serde(default)]
137 pub owner: Pubkey,
138 pub deposits: Vec<KaminoObligationCollateral>,
139 pub borrows: Vec<KaminoObligationLiquidity>,
140 pub deposited_value_sf: u128,
141 pub borrowed_assets_market_value_sf: u128,
142 pub allowed_borrow_value_sf: u128,
143 pub unhealthy_borrow_value_sf: u128,
144 pub has_debt: u8,
145 pub elevation_group: u8,
146 pub last_update: KaminoLastUpdate,
147}
148
149#[derive(Serialize, Deserialize, Clone, Debug, Default)]
151pub struct KaminoObligationCollateral {
152 pub deposit_reserve: Pubkey,
153 pub deposited_amount: u64,
154 pub market_value_sf: u128,
155}
156
157#[derive(Serialize, Deserialize, Clone, Debug, Default)]
159pub struct KaminoObligationLiquidity {
160 pub borrow_reserve: Pubkey,
161 pub cumulative_borrow_rate_bsf: KaminoBigFractionBytes,
162 pub borrowed_amount_sf: u128,
163 pub market_value_sf: u128,
164 pub borrow_factor_adjusted_market_value_sf: u128,
165}
166
167#[derive(Serialize, Deserialize, Clone, Debug)]
169pub struct KaminoWithdrawTicket {
170 pub sequence_number: u64,
171 pub owner: Pubkey,
172 pub reserve: Pubkey,
173 pub user_destination_liquidity_ta: Pubkey,
174 pub queued_collateral_amount: u64,
175 pub created_at_timestamp: u64,
176 pub invalid: u8,
177}
178
179#[derive(Serialize, Deserialize, Clone, Debug, Default)]
181pub struct KaminoElevationGroup {
182 pub max_liquidation_bonus_bps: u16,
183 pub id: u8,
184 pub ltv_pct: u8,
185 pub liquidation_threshold_pct: u8,
186 pub allow_new_loans: u8,
187 pub max_reserves_as_collateral: u8,
188 pub debt_reserve: Pubkey,
189}
190
191#[derive(Serialize, Deserialize, Clone, Debug, Default)]
193pub struct KaminoLastUpdate {
194 pub slot: u64,
195 pub stale: u8,
196}
197
198#[derive(Serialize, Deserialize, Clone, Debug, Default)]
200pub struct KaminoBigFractionBytes {
201 pub value: [u64; 4],
202}
203
204#[derive(Serialize, Deserialize, Clone, Debug, Default)]
206pub struct KaminoReserveFees {
207 #[serde(default)]
208 pub origination_fee_sf: u64,
209 #[serde(default)]
210 pub flash_loan_fee_sf: u64,
211}
212
213#[derive(Serialize, Deserialize, Clone, Debug, Default)]
215pub struct KaminoBorrowRateCurve {
216 pub points: [KaminoCurvePoint; 11],
217}
218
219#[derive(Serialize, Deserialize, Clone, Debug, Default, Copy)]
221pub struct KaminoCurvePoint {
222 pub utilization_rate_bps: u32,
223 pub borrow_rate_bps: u32,
224}
225
226#[derive(Serialize, Deserialize, Clone, Debug, Default)]
228pub struct KaminoWithdrawalCaps {
229 pub config_capacity: i64,
230 pub current_total: i64,
231 pub last_interval_start_timestamp: u64,
232 pub config_interval_length_seconds: u64,
233}