Interest Rates
✦ Key Takeaways
- Kinked curve — rates rise slowly below optimal utilization, then sharply above it
- Per-second accrual — interest compounds continuously via a global borrow index
- Floating rates — both supply and borrow APY update with every protocol interaction
- Reserve factor — 10% of borrow interest goes to protocol reserves
The Kinked Rate Model
The model uses two slopes separated by a kink point (optimal utilization). Below the kink, rates rise gently to encourage borrowing. Above the kink, rates spike to incentivize repayment and new supply.
Rate formula
utilization = totalBorrows / totalAssets
If utilization ≤ optimalUtilization:
borrowRate = baseRate + (utilization / optimal) × slope1
If utilization > optimalUtilization:
borrowRate = baseRate + slope1 + ((utilization - optimal) / (1 - optimal)) × slope2
supplyRate = borrowRate × utilization × (1 - reserveFactor) Default Parameters
| Parameter | Value | Description |
|---|---|---|
| Base Rate | 2% | Minimum borrow rate at 0% utilization |
| Slope 1 | 4% | Rate increase per unit utilization below kink |
| Slope 2 | 75% | Steep rate increase above kink |
| Optimal Utilization | 80% | Kink point where slope changes |
| Reserve Factor | 10% | Portion of borrow interest to reserves |
Example Rates
| Utilization | Borrow APY | Supply APY |
|---|---|---|
| 0% | 2.0% | 0.0% |
| 40% | 4.0% | 1.44% |
| 80% (kink) | 6.0% | 4.32% |
| 90% | 43.5% | 35.2% |
| 95% | 62.3% | 53.3% |
| 100% | 81.0% | 72.9% |
ℹ Why the steep slope?
Above 80% utilization, rates spike dramatically. This is by design — it creates strong incentives for borrowers to repay and for new lenders to supply, ensuring the pool doesn't become fully utilized (which would block lender withdrawals).
Accrual Mechanics
Interest accrues per-second. Every time someone interacts with the pool (supply, borrow, repay, withdraw, liquidate), the global borrow index is updated:
Index update
timeDelta = now - lastUpdate
ratePerSecond = borrowRateAPY / SECONDS_PER_YEAR
newIndex = oldIndex × (1 + ratePerSecond × timeDelta)
// Each borrower's actual debt:
actualDebt = scaledDebt × newIndex This means interest compounds automatically — borrowers don't need to take any action, and lenders see their share value grow in real time.
💡 Reading current rates
Use
readPoolSnapshot() from the SDK to get current utilization, borrow APY, and supply APY. See TypeScript SDK.