Skip to main content
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.

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 = 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 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

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

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