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/// Subset of the Kamino Reserve account fields needed by consumer services.
10///
11/// Equivalent to `SpotMarket` for Drift. Includes fields for collateral
12/// valuation, interest rate computation, and liquidity tracking.
13#[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/// Subset of Reserve.liquidity fields.
23#[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    /// Token program (SPL Token or Token-2022) for this reserve's mint.
40    #[serde(default)]
41    pub token_program: Pubkey,
42}
43
44/// Subset of Reserve.collateral fields.
45#[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/// Subset of Reserve.config fields.
53#[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}
68
69/// Kamino obligation account, equivalent to `DriftUser`.
70///
71/// Tracks a user's deposits and borrows within a Kamino lending market.
72#[derive(Serialize, Deserialize, Clone, Debug)]
73pub struct KaminoObligation {
74    pub lending_market: Pubkey,
75    #[serde(default)]
76    pub owner: Pubkey,
77    pub deposits: Vec<KaminoObligationCollateral>,
78    pub borrows: Vec<KaminoObligationLiquidity>,
79    pub deposited_value_sf: u128,
80    pub borrowed_assets_market_value_sf: u128,
81    pub allowed_borrow_value_sf: u128,
82    pub unhealthy_borrow_value_sf: u128,
83    pub has_debt: u8,
84    pub elevation_group: u8,
85    pub last_update: KaminoLastUpdate,
86}
87
88/// Obligation deposit position, equivalent to `SpotPosition` (deposit side).
89#[derive(Serialize, Deserialize, Clone, Debug, Default)]
90pub struct KaminoObligationCollateral {
91    pub deposit_reserve: Pubkey,
92    pub deposited_amount: u64,
93    pub market_value_sf: u128,
94}
95
96/// Obligation borrow position, equivalent to `SpotPosition` (borrow side).
97#[derive(Serialize, Deserialize, Clone, Debug, Default)]
98pub struct KaminoObligationLiquidity {
99    pub borrow_reserve: Pubkey,
100    pub cumulative_borrow_rate_bsf: KaminoBigFractionBytes,
101    pub borrowed_amount_sf: u128,
102    pub market_value_sf: u128,
103    pub borrow_factor_adjusted_market_value_sf: u128,
104}
105
106/// Kamino withdraw ticket for queued withdrawal flow.
107#[derive(Serialize, Deserialize, Clone, Debug)]
108pub struct KaminoWithdrawTicket {
109    pub sequence_number: u64,
110    pub owner: Pubkey,
111    pub reserve: Pubkey,
112    pub user_destination_liquidity_ta: Pubkey,
113    pub queued_collateral_amount: u64,
114    pub created_at_timestamp: u64,
115    pub invalid: u8,
116}
117
118/// Kamino elevation group for xStocks and isolated markets.
119#[derive(Serialize, Deserialize, Clone, Debug, Default)]
120pub struct KaminoElevationGroup {
121    pub max_liquidation_bonus_bps: u16,
122    pub id: u8,
123    pub ltv_pct: u8,
124    pub liquidation_threshold_pct: u8,
125    pub allow_new_loans: u8,
126    pub max_reserves_as_collateral: u8,
127    pub debt_reserve: Pubkey,
128}
129
130/// Slot-based staleness tracker.
131#[derive(Serialize, Deserialize, Clone, Debug, Default)]
132pub struct KaminoLastUpdate {
133    pub slot: u64,
134    pub stale: u8,
135}
136
137/// 256-bit fixed-point number stored as four u64 limbs.
138#[derive(Serialize, Deserialize, Clone, Debug, Default)]
139pub struct KaminoBigFractionBytes {
140    pub value: [u64; 4],
141}
142
143/// Reserve fee configuration.
144#[derive(Serialize, Deserialize, Clone, Debug, Default)]
145pub struct KaminoReserveFees {
146    #[serde(default)]
147    pub origination_fee_sf: u64,
148    #[serde(default)]
149    pub flash_loan_fee_sf: u64,
150}
151
152/// Piecewise-linear borrow rate curve with up to 11 points.
153#[derive(Serialize, Deserialize, Clone, Debug, Default)]
154pub struct KaminoBorrowRateCurve {
155    pub points: [KaminoCurvePoint; 11],
156}
157
158/// Single point on the borrow rate curve.
159#[derive(Serialize, Deserialize, Clone, Debug, Default, Copy)]
160pub struct KaminoCurvePoint {
161    pub utilization_rate_bps: u32,
162    pub borrow_rate_bps: u32,
163}
164
165/// Withdrawal/debt capacity limiter with time-based resets.
166#[derive(Serialize, Deserialize, Clone, Debug, Default)]
167pub struct KaminoWithdrawalCaps {
168    pub config_capacity: i64,
169    pub current_total: i64,
170    pub last_interval_start_timestamp: u64,
171    pub config_interval_length_seconds: u64,
172}