A fixed rate reserve locks borrowers into a predictable rate for a defined duration. Borrows on the reserve carry a maturity timestamp and pay a host-set fixed rate component on top of the variable IR curve. At maturity, the borrower must repay, roll over, or face liquidation. Each (rate, term) combination lives on its own reserve. A market that offers, say, 4%/30-day, 5%/60-day, and 6%/90-day USDC borrows would have three USDC fixed rate reserves — one per (rate, term) pair — each with its own debt maturity.Documentation Index
Fetch the complete documentation index at: https://kamino.com/docs/llms.txt
Use this file to discover all available pages before exploring further.
Reserve-level configuration
The fixed-rate mechanics are controlled by theseReserveConfig fields:
| Field | What it does |
|---|---|
debt_term_seconds | Duration of the fixed term, in seconds. 0 = open-term reserve. Setting any positive value makes every borrow on this reserve a fixed-term borrow |
debt_maturity_timestamp | Optional absolute Unix timestamp when all debt on this reserve matures simultaneously. 0 = each borrow rolls forward debt_term_seconds from origination |
host_fixed_interest_rate_bps | Fixed-rate component (bps) added to the variable rate from the IR curve |
early_repay_remaining_interest_pct | Penalty for repaying before maturity, expressed as percent (0–100) of the remaining interest to maturity |
Market-level rollover settings
| Field | What it does |
|---|---|
fixed_term_rollover_window_duration_seconds | Window before maturity allowing fixed→fixed rollover. 0 disables |
open_term_rollover_window_duration_seconds | Window before maturity allowing fixed→open rollover. 0 disables |
obligation_borrow_migration_to_fixed_execution_enabled | If 1, allows open→fixed migration anytime |
obligation_borrow_rollover_configuration_enabled | If 1, allows borrowers to pre-configure rollover behavior |
min_partial_rollover_value | Minimum size for a partial rollover. 0 requires full rollovers only |
term_based_full_liquidation_duration_secs | Time after maturity before full (close-factor-bypassing) liquidation is available |
mature_reserve_debt_liquidation_enabled | Master switch for mature-debt liquidation flow |
obligation_borrow_debt_term_liquidation_enabled | Per-feature switch for the term-based liquidation path |
- SDK
- API
- Kamino CLI
Configure a fixed rate reserve via SDK
Reserve-level fields are set viakaminoManager.updateReserveIxs (or at creation via addAssetToMarketIxs). Market-level rollover and liquidation flags are set via updateLendingMarketIxs.Reserve config
Market-level rollover and liquidation flags
User-side rollover
The user-facing rollover instruction (rolloverFixedTermBorrow) is part of the on-chain klend program. The current public klend-sdk does not yet expose a dedicated TypeScript helper for it; until it ships, end-user apps integrate the rollover via the Kamino webapp or by building the instruction manually from the program IDL.Open-term vs. fixed-rate
| Mode | Configuration |
|---|---|
| Open-term (default) | debt_term_seconds = 0, debt_maturity_timestamp = 0, host_fixed_interest_rate_bps = 0 |
| Per-borrow rolling fixed term | debt_term_seconds > 0, debt_maturity_timestamp = 0. Every borrow matures debt_term_seconds after origination |
| Cohort fixed term | debt_term_seconds > 0, debt_maturity_timestamp > 0. All debt matures at the absolute timestamp |
How interest accrues
Total borrow rate =IR curve rate at current utilization + host_fixed_interest_rate_bps.
The fixed component is a flat bps add-on; the variable component reacts to utilization as on any reserve. The borrower’s actual cost depends on both how full the reserve is and the curator’s fixed-rate setting. This design lets a curator offer “5% fixed plus utilization premium” pricing while keeping the variable component responsive.
Maturity and what happens at it
When a borrow reaches itsdebt_maturity_timestamp (per-borrow or cohort):
| Outcome | Trigger |
|---|---|
| Repay in full | The borrower repays. The position closes |
| Roll over | The borrower rolls into a new fixed term — same reserve, different reserve, or migrates to open-term. Subject to market-level rollover flags |
| Liquidation as mature debt | If mature_reserve_debt_liquidation_enabled = 1 and obligation_borrow_debt_term_liquidation_enabled = 1, mature debt becomes liquidatable |
| Forced full liquidation | After term_based_full_liquidation_duration_secs past maturity, the position is eligible for full (close-factor-bypassing) liquidation |
The rollover modes
| Mode | Source | Destination | Constraints |
|---|---|---|---|
| Fixed → Fixed | A fixed rate reserve | Another (or same) fixed rate reserve | Allowed only inside fixed_term_rollover_window_duration_seconds of original maturity |
| Fixed → Open | A fixed rate reserve | An open-term reserve for the same mint | Allowed only inside open_term_rollover_window_duration_seconds of original maturity |
| Open → Fixed | An open-term reserve | A fixed rate reserve for the same mint | Allowed any time, gated by obligation_borrow_migration_to_fixed_execution_enabled |
Early-repay penalty
early_repay_remaining_interest_pct | Effect |
|---|---|
0 | No penalty. Borrowers can repay any time at no extra cost |
50 | 50% of remaining interest is owed at repay. Mild discouragement of early exit |
100 | Full term’s interest is locked in. The borrower owes the same regardless of repay time |
If the borrower borrows additional principal on an already-active fixed-term position, the borrow timestamp is reset for the entire position. Effectively, the new top-up creates a new fixed term covering the combined balance. After a rollover, penalties reset to zero for the new term.
Curator workflow: launching a fixed rate reserve
Decide the (rate, term) matrix
Pick the durations and rates you want to offer (e.g., 30/60/90 days at 4%/5%/6%). Each combination is a separate reserve.
Configure each reserve
Set
debt_term_seconds, host_fixed_interest_rate_bps, early_repay_remaining_interest_pct. Choose risk parameters (LTV, threshold, IR curve) appropriate for the duration.Set market-level rollover windows
Decide the rollover window — how far before maturity borrowers can roll. Common settings: 24–72 hours.
Enable mature-debt liquidation
Set
mature_reserve_debt_liquidation_enabled = 1 and obligation_borrow_debt_term_liquidation_enabled = 1. Choose term_based_full_liquidation_duration_secs (typically 12–48 hours after maturity).Common errors
| Error | Cause |
|---|---|
BorrowRolloverExecutionDisabled | Market-level rollover window is 0. Set fixed_term_rollover_window_duration_seconds (or open_term_rollover_window_duration_seconds) to a positive value |
RolloverWindowNotOpen | Borrower tried to roll outside the configured window before maturity |
MatureDebtLiquidationDisabled | The position is mature but liquidation flags are off. Either enable the liquidation flags or repay |
| Sub-$2 obligations stuck near maturity | A known edge case where dust positions interact poorly with the close-factor cap. Set min_full_liquidation_value_threshold low enough that mature dust positions can be fully liquidated |
Reference
- Reserve config reference — fixed-rate reserve fields
- Market config reference — rollover and term-liquidation flags
- Borrow orders — peer-to-peer matching for fixed-rate liquidity
- Liquidations — base liquidation mechanics