borrow_rate_curve is configured as a flat curve at the target rate, so borrowers pay the same rate regardless of utilization. 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.
Reserve-level configuration
The fixed-rate mechanics are controlled by theseReserveConfig fields:
Market-level rollover settings
- 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
Mixing fixed and open on the same reserve isn’t supported. To run both, deploy two reserves for the same mint.
How interest accrues
Total borrow rate =borrow_rate_curve value at current utilization + host_fixed_interest_rate_bps.
For a fixed-rate reserve, the borrow_rate_curve is configured as a flat curve (both endpoints set to the same rate), so the base rate is constant regardless of utilization. With host_fixed_interest_rate_bps at its default of 0, the borrower pays exactly the flat curve rate. Set a non-zero host_fixed_interest_rate_bps only when you intentionally want a protocol-side spread on top of the lender-facing rate. See Reserve Configuration for full details on configuring the flat curve.
Maturity and what happens at it
When a borrow reaches itsdebt_maturity_timestamp (per-borrow or cohort):
The rollover modes
Rollover preserves the principal but resets accrual: the new term starts fresh. Penalties from the prior term do not carry over.
Early-repay penalty
The early-repay penalty applies during the first term only. Once a loan rolls over into a subsequent term, the borrower can repay at any time without penalty.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, the penalty no longer applies.
Curator workflow: launching a fixed rate reserve
1
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.
2
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.3
Set market-level rollover windows
Decide the rollover window — how far before maturity borrowers can roll. Common settings: 24–72 hours.
4
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).5
Test on staging
Take a fixed-term borrow on staging, fast-forward time using a test scenario, exercise rollover, exercise repay, exercise mature-debt liquidation. Confirm the lifecycle works before mainnet.
Common errors
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