Skip to main content

pyra_types/
kamino.rs

1use serde::{Deserialize, Serialize};
2use solana_pubkey::Pubkey;
3
4/// Kamino Fraction scale factor: U68F60 = 2^60.
5///
6/// All `_sf` fields in Kamino types are scaled by this value.
7pub const KAMINO_FRACTION_SCALE: u128 = 1 << 60;
8
9// ============================================================
10// Reserve
11// ============================================================
12
13/// Kamino Reserve account — exact match of the on-chain IDL (padding omitted).
14#[derive(Serialize, Deserialize, Clone, Debug, Default)]
15pub struct KaminoReserve {
16    pub version: u64,
17    pub last_update: KaminoLastUpdate,
18    pub lending_market: Pubkey,
19    pub farm_collateral: Pubkey,
20    pub farm_debt: Pubkey,
21    pub liquidity: KaminoReserveLiquidity,
22    pub collateral: KaminoReserveCollateral,
23    pub config: KaminoReserveConfig,
24    pub borrowed_amount_outside_elevation_group: u64,
25    pub borrowed_amounts_against_this_reserve_in_elevation_groups: [u64; 32],
26    pub withdraw_queue: KaminoWithdrawQueue,
27}
28
29#[derive(Serialize, Deserialize, Clone, Debug, Default)]
30pub struct KaminoReserveLiquidity {
31    pub mint_pubkey: Pubkey,
32    pub supply_vault: Pubkey,
33    pub fee_vault: Pubkey,
34    pub total_available_amount: u64,
35    pub borrowed_amount_sf: u128,
36    pub market_price_sf: u128,
37    pub market_price_last_updated_ts: u64,
38    pub mint_decimals: u64,
39    pub deposit_limit_crossed_timestamp: u64,
40    pub borrow_limit_crossed_timestamp: u64,
41    pub cumulative_borrow_rate_bsf: KaminoBigFractionBytes,
42    pub accumulated_protocol_fees_sf: u128,
43    pub accumulated_referrer_fees_sf: u128,
44    pub pending_referrer_fees_sf: u128,
45    pub absolute_referral_rate_sf: u128,
46    pub token_program: Pubkey,
47}
48
49#[derive(Serialize, Deserialize, Clone, Debug, Default)]
50pub struct KaminoReserveCollateral {
51    pub mint_pubkey: Pubkey,
52    pub mint_total_supply: u64,
53    pub supply_vault: Pubkey,
54}
55
56#[derive(Serialize, Deserialize, Clone, Debug, Default)]
57pub struct KaminoReserveConfig {
58    pub status: u8,
59    pub host_fixed_interest_rate_bps: u16,
60    pub min_deleveraging_bonus_bps: u16,
61    pub block_ctoken_usage: u8,
62    pub protocol_order_execution_fee_pct: u8,
63    pub protocol_take_rate_pct: u8,
64    pub protocol_liquidation_fee_pct: u8,
65    pub loan_to_value_pct: u8,
66    pub liquidation_threshold_pct: u8,
67    pub min_liquidation_bonus_bps: u16,
68    pub max_liquidation_bonus_bps: u16,
69    pub bad_debt_liquidation_bonus_bps: u16,
70    pub deleveraging_margin_call_period_secs: u64,
71    pub deleveraging_threshold_decrease_bps_per_day: u64,
72    pub fees: KaminoReserveFees,
73    pub borrow_rate_curve: KaminoBorrowRateCurve,
74    pub borrow_factor_pct: u64,
75    pub deposit_limit: u64,
76    pub borrow_limit: u64,
77    pub token_info: KaminoTokenInfo,
78    pub deposit_withdrawal_cap: KaminoWithdrawalCaps,
79    pub debt_withdrawal_cap: KaminoWithdrawalCaps,
80    pub elevation_groups: [u8; 20],
81    pub disable_usage_as_coll_outside_emode: u8,
82    pub utilization_limit_block_borrowing_above_pct: u8,
83    pub autodeleverage_enabled: u8,
84    pub borrow_limit_outside_elevation_group: u64,
85    pub borrow_limit_against_this_collateral_in_elevation_group: [u64; 32],
86    pub deleveraging_bonus_increase_bps_per_day: u64,
87    pub debt_maturity_timestamp: u64,
88    pub debt_term_seconds: u64,
89}
90
91#[derive(Serialize, Deserialize, Clone, Debug, Default)]
92pub struct KaminoReserveFees {
93    pub origination_fee_sf: u64,
94    pub flash_loan_fee_sf: u64,
95}
96
97#[derive(Serialize, Deserialize, Clone, Debug, Default)]
98pub struct KaminoBorrowRateCurve {
99    pub points: [KaminoCurvePoint; 11],
100}
101
102#[derive(Serialize, Deserialize, Clone, Debug, Default, Copy)]
103pub struct KaminoCurvePoint {
104    pub utilization_rate_bps: u32,
105    pub borrow_rate_bps: u32,
106}
107
108#[derive(Serialize, Deserialize, Clone, Debug, Default)]
109pub struct KaminoTokenInfo {
110    pub name: String,
111    pub heuristic: KaminoPriceHeuristic,
112    pub max_twap_divergence_bps: u64,
113    pub max_age_price_seconds: u64,
114    pub max_age_twap_seconds: u64,
115    pub scope_configuration: KaminoScopeConfiguration,
116    pub switchboard_configuration: KaminoSwitchboardConfiguration,
117    pub pyth_configuration: KaminoPythConfiguration,
118    pub block_price_usage: u8,
119}
120
121#[derive(Serialize, Deserialize, Clone, Debug, Default)]
122pub struct KaminoPriceHeuristic {
123    pub lower: u64,
124    pub upper: u64,
125    pub exp: u64,
126}
127
128#[derive(Serialize, Deserialize, Clone, Debug, Default)]
129pub struct KaminoScopeConfiguration {
130    pub price_feed: Pubkey,
131    pub price_chain: [u16; 4],
132    pub twap_chain: [u16; 4],
133}
134
135#[derive(Serialize, Deserialize, Clone, Debug, Default)]
136pub struct KaminoSwitchboardConfiguration {
137    pub price_aggregator: Pubkey,
138    pub twap_aggregator: Pubkey,
139}
140
141#[derive(Serialize, Deserialize, Clone, Debug, Default)]
142pub struct KaminoPythConfiguration {
143    pub price: Pubkey,
144}
145
146#[derive(Serialize, Deserialize, Clone, Debug, Default)]
147pub struct KaminoWithdrawalCaps {
148    pub config_capacity: i64,
149    pub current_total: i64,
150    pub last_interval_start_timestamp: u64,
151    pub config_interval_length_seconds: u64,
152}
153
154#[derive(Serialize, Deserialize, Clone, Debug, Default)]
155pub struct KaminoWithdrawQueue {
156    pub queued_collateral_amount: u64,
157    pub next_issued_ticket_sequence_number: u64,
158    pub next_withdrawable_ticket_sequence_number: u64,
159}
160
161#[derive(Serialize, Deserialize, Clone, Debug, Default)]
162pub struct KaminoLastUpdate {
163    pub slot: u64,
164    pub stale: u8,
165    pub price_status: u8,
166}
167
168/// 256-bit fixed-point number stored as four u64 limbs.
169#[derive(Serialize, Deserialize, Clone, Debug, Default)]
170pub struct KaminoBigFractionBytes {
171    pub value: [u64; 4],
172}
173
174// ============================================================
175// Obligation
176// ============================================================
177
178/// Kamino Obligation account — exact match of the on-chain IDL (padding omitted).
179#[derive(Serialize, Deserialize, Clone, Debug, Default)]
180pub struct KaminoObligation {
181    pub tag: u64,
182    pub last_update: KaminoLastUpdate,
183    pub lending_market: Pubkey,
184    pub owner: Pubkey,
185    pub deposits: [KaminoObligationCollateral; 8],
186    pub lowest_reserve_deposit_liquidation_ltv: u64,
187    pub deposited_value_sf: u128,
188    pub borrows: [KaminoObligationLiquidity; 5],
189    pub borrow_factor_adjusted_debt_value_sf: u128,
190    pub borrowed_assets_market_value_sf: u128,
191    pub allowed_borrow_value_sf: u128,
192    pub unhealthy_borrow_value_sf: u128,
193    pub elevation_group: u8,
194    pub num_of_obsolete_deposit_reserves: u8,
195    pub has_debt: u8,
196    pub referrer: Pubkey,
197    pub borrowing_disabled: u8,
198    pub autodeleverage_target_ltv_pct: u8,
199    pub lowest_reserve_deposit_max_ltv_pct: u8,
200    pub num_of_obsolete_borrow_reserves: u8,
201    pub highest_borrow_factor_pct: u64,
202    pub autodeleverage_margin_call_started_timestamp: u64,
203    pub obligation_orders: [KaminoObligationOrder; 2],
204    pub borrow_order: KaminoBorrowOrder,
205}
206
207#[derive(Serialize, Deserialize, Clone, Debug, Default)]
208pub struct KaminoObligationCollateral {
209    pub deposit_reserve: Pubkey,
210    pub deposited_amount: u64,
211    pub market_value_sf: u128,
212    pub borrowed_amount_against_this_collateral_in_elevation_group: u64,
213}
214
215#[derive(Serialize, Deserialize, Clone, Debug, Default)]
216pub struct KaminoObligationLiquidity {
217    pub borrow_reserve: Pubkey,
218    pub cumulative_borrow_rate_bsf: KaminoBigFractionBytes,
219    pub last_borrowed_at_timestamp: u64,
220    pub borrowed_amount_sf: u128,
221    pub market_value_sf: u128,
222    pub borrow_factor_adjusted_market_value_sf: u128,
223    pub borrowed_amount_outside_elevation_groups: u64,
224    pub fixed_term_borrow_rollover_config: KaminoFixedTermBorrowRolloverConfig,
225    pub borrowed_amount_at_expiration: u64,
226}
227
228#[derive(Serialize, Deserialize, Clone, Debug, Default)]
229pub struct KaminoObligationOrder {
230    pub condition_threshold_sf: u128,
231    pub opportunity_parameter_sf: u128,
232    pub min_execution_bonus_bps: u16,
233    pub max_execution_bonus_bps: u16,
234    pub condition_type: u8,
235    pub opportunity_type: u8,
236}
237
238#[derive(Serialize, Deserialize, Clone, Debug, Default)]
239pub struct KaminoBorrowOrder {
240    pub debt_liquidity_mint: Pubkey,
241    pub remaining_debt_amount: u64,
242    pub filled_debt_destination: Pubkey,
243    pub min_debt_term_seconds: u64,
244    pub fillable_until_timestamp: u64,
245    pub placed_at_timestamp: u64,
246    pub last_updated_at_timestamp: u64,
247    pub requested_debt_amount: u64,
248    pub max_borrow_rate_bps: u32,
249    pub active: u8,
250    pub enable_auto_rollover_on_filled_borrows: u8,
251}
252
253#[derive(Serialize, Deserialize, Clone, Debug, Default)]
254pub struct KaminoFixedTermBorrowRolloverConfig {
255    pub auto_rollover_enabled: u8,
256    pub open_term_allowed: u8,
257    pub migration_to_fixed_enabled: u8,
258    pub max_borrow_rate_bps: u32,
259    pub min_debt_term_seconds: u64,
260}
261
262// ============================================================
263// Withdraw Ticket
264// ============================================================
265
266#[derive(Serialize, Deserialize, Clone, Debug)]
267pub struct KaminoWithdrawTicket {
268    pub sequence_number: u64,
269    pub owner: Pubkey,
270    pub reserve: Pubkey,
271    pub user_destination_liquidity_ta: Pubkey,
272    pub queued_collateral_amount: u64,
273    pub created_at_timestamp: u64,
274    pub invalid: u8,
275}
276
277// ============================================================
278// Elevation Group
279// ============================================================
280
281#[derive(Serialize, Deserialize, Clone, Debug, Default)]
282pub struct KaminoElevationGroup {
283    pub max_liquidation_bonus_bps: u16,
284    pub id: u8,
285    pub ltv_pct: u8,
286    pub liquidation_threshold_pct: u8,
287    pub allow_new_loans: u8,
288    pub max_reserves_as_collateral: u8,
289    pub debt_reserve: Pubkey,
290}