Skip to main content
A fixed rate reserve locks borrowers into a predictable rate for a defined duration. The reserve’s 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 these ReserveConfig fields:

Market-level rollover settings

Configure a fixed rate reserve via SDK

Reserve-level fields are set via kaminoManager.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 its debt_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