The relationship between LTV and liquidation threshold
| Field | What it does |
|---|---|
loanToValuePct | Maximum borrowing capacity against the asset, as a percent of its USD value. A user with 750 of debt. |
liquidationThresholdPct | The point at which the position becomes liquidatable. Must be >= loanToValuePct. The gap between the two is the liquidation buffer — the cushion a borrower has before being liquidatable. |
liquidationThresholdPct - loanToValuePct | The buffer. Wider buffers reduce liquidation frequency at the cost of borrowing capacity. |
| Asset class | LTV | LT | Buffer |
|---|---|---|---|
| Major stablecoins (in stables-only group) | 90–95% | 92–97% | 2–3% |
| Major liquid assets (SOL, BTC, ETH) | 70–80% | 75–85% | 5–10% |
| LSTs paired with their underlying (eMode) | 88–92% | 90–95% | 2–5% |
| Long-tail volatile assets | 30–55% | 50–70% | 10–20% |
| Newly listed assets | Start conservative; widen later |
Borrow factor
borrowFactorPct: 125 is treated as if you borrowed 125 units for risk purposes — making the position behave more conservatively.
| borrowFactorPct | Effect |
|---|---|
100 | No adjustment. Default for stables and major assets. |
125 | Debt is treated as 25% larger than its market value. Use for assets where post-liquidation slippage is higher than typical. |
200+ | Aggressive overweight. Use for highly volatile or thinly traded debt assets. |
borrowFactorPct >= 100; values below have no effect.
The interest rate curve
borrowed / deposited) using a piecewise linear curve. The curve must satisfy:
- Exactly 11 points (pad with the final point repeated if you have fewer breakpoints)
utilizationRateBpsstrictly non-decreasing from0to10000(0%to100%)borrowRateBpsnon-decreasing across the curve- Rate between two breakpoints is linearly interpolated
Designing the curve
The economics of an IR curve hinge on the kink — the breakpoint where the rate starts climbing steeply.| Region | Purpose |
|---|---|
0% → kink | Mild slope. Lets borrowers access cheap leverage when liquidity is abundant. |
kink → 100% | Steep slope. Penalizes high utilization, pulls borrowers to repay and lenders to deposit. |
| Utilization | Borrow rate |
|---|---|
| 0% | 0% |
| 70% | 5% (the kink) |
| 85% | 15% |
| 100% | 80%+ |
Padding the array
The on-chain struct expects 11 points. If your curve has fewer real breakpoints, repeat the final point to fill:Deposit and borrow caps
| Cap | Effect |
|---|---|
depositLimit | Hard ceiling on total deposits. New deposits beyond this revert. Set higher than borrowLimit to leave a withdrawal buffer. |
borrowLimit | Hard ceiling on total borrows. New borrows beyond this revert. |
| Phase | depositLimit | borrowLimit |
|---|---|---|
| Initial listing | Conservative (e.g., $1M equivalent) | 80–90% of depositLimit |
| After 30 days of clean operation | 2–5× initial | Same ratio |
| Steady state | Asset-specific; track asset’s on-chain liquidity | Same ratio |
borrowLimit < depositLimit ensures there is always some unborrowed liquidity (subject to live withdrawals). borrowLimit == depositLimit allows full utilization but means depositors may need the withdrawal queue to redeem.
A focused command exists for adjusting just the borrow cap:
Utilization-based borrow blocking
0 disables. Useful as a softer alternative to borrowLimit for reserves where you want to throttle leverage at high utilization without capping total deposits.
Example: utilizationLimitBlockBorrowingAbovePct: 90 means borrows revert when utilization is above 90%, while existing borrows and repayments continue unaffected.
Fees
| Fee | Charged on | How it accrues |
|---|---|---|
fees.borrowFee | Origination of every borrow, as a decimal string (e.g. "0.001" = 0.1%) | Added to borrow’s debt at origination |
fees.flashLoanFee | Each flash loan | Charged in the same instruction as the flash repay |
protocolTakeRatePct | Interest accrual on the reserve | Percentage (0–100) of accrued interest routed to protocol fees |
protocolLiquidationFeePct | Liquidations | Percentage (0–100) of liquidation proceeds routed to protocol fees |
protocolOrderExecutionFeePct | Filled obligation orders | Percentage (0–100) of filled order proceeds routed to protocol fees |
lending_market_owner via redeem_fees.
Reserve status
| Value | State | Meaning |
|---|---|---|
0 | Active | Normal operation |
1 | Obsolete | Deprecated — the program treats this similarly to active for existing positions but signals to integrators not to surface for new activity |
2 | Hidden | Hidden from default UIs |
0. Use 1 when phasing out a reserve while honoring existing obligations.
Putting it together: a checklist for a new reserve
Pick LTV and liquidation threshold
Use comparable Kamino reserves as a starting reference. For a never-listed asset, start more conservatively than analogues and widen later.
Design the IR curve
Pick a kink (typically 70–85% utilization). Set base rate at the kink (3–8% for stables, 5–15% for volatile assets). Set max rate at 100% utilization (40–80% APR is common).
Choose caps
depositLimit proportional to the asset’s verified on-chain liquidity. borrowLimit 80–90% of depositLimit.Set fees
protocolTakeRatePct = 0–20% if you want the curator to capture interest revenue. Origination fees default to 0 for most consumer-facing reserves.Configure the oracle
Scope is the default. Set TWAP and staleness guards. → Configure oracles
Decide on advanced features
eMode? Auto-deleverage? Withdrawal queue? Fixed-term? Each is opt-in. → Lifecycle
Reference
- Reserve config reference — every field documented
- Liquidations — what happens when LT is breached
- Elevation groups — relaxed parameters for correlated assets