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    #[serde(default)]
68    pub token_info: KaminoTokenInfo,
69}
70
71/// Oracle and price-validation configuration for a reserve's token.
72#[derive(Serialize, Deserialize, Clone, Debug, Default)]
73pub struct KaminoTokenInfo {
74    /// Human-readable token name (UTF-8, up to 32 bytes on-chain).
75    #[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/// Price heuristic bounds for sanity-checking oracle prices.
96#[derive(Serialize, Deserialize, Clone, Debug, Default)]
97pub struct KaminoPriceHeuristic {
98    pub lower: u64,
99    pub upper: u64,
100    pub exp: u64,
101}
102
103/// Scope oracle configuration.
104#[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/// Switchboard oracle configuration.
115#[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/// Pyth oracle configuration.
124#[derive(Serialize, Deserialize, Clone, Debug, Default)]
125pub struct KaminoPythConfiguration {
126    #[serde(default)]
127    pub price: Pubkey,
128}
129
130/// Kamino obligation account, equivalent to `DriftUser`.
131///
132/// Tracks a user's deposits and borrows within a Kamino lending market.
133#[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/// Obligation deposit position, equivalent to `SpotPosition` (deposit side).
150#[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/// Obligation borrow position, equivalent to `SpotPosition` (borrow side).
158#[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/// Kamino withdraw ticket for queued withdrawal flow.
168#[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/// Kamino elevation group for xStocks and isolated markets.
180#[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/// Slot-based staleness tracker.
192#[derive(Serialize, Deserialize, Clone, Debug, Default)]
193pub struct KaminoLastUpdate {
194    pub slot: u64,
195    pub stale: u8,
196}
197
198/// 256-bit fixed-point number stored as four u64 limbs.
199#[derive(Serialize, Deserialize, Clone, Debug, Default)]
200pub struct KaminoBigFractionBytes {
201    pub value: [u64; 4],
202}
203
204/// Reserve fee configuration.
205#[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/// Piecewise-linear borrow rate curve with up to 11 points.
214#[derive(Serialize, Deserialize, Clone, Debug, Default)]
215pub struct KaminoBorrowRateCurve {
216    pub points: [KaminoCurvePoint; 11],
217}
218
219/// Single point on the borrow rate curve.
220#[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/// Withdrawal/debt capacity limiter with time-based resets.
227#[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}