Skip to content

Interest rate models

Pooled money markets set borrowing and lending rates with a formula, not a negotiation: a “kinked” curve reads the reserve’s utilization (how much of the pool is borrowed) and outputs a rate that climbs slowly until a target utilization, then climbs sharply beyond it, automatically pushing borrowers to repay and lenders to deposit when a pool runs dry. A separate lineage of protocols — the Yield Protocol, and now Morpho Midnight — instead discovers a fixed rate the same way a bond market does: by trading a token that pays back a fixed amount at a future date at whatever price buyers and sellers agree on today. Both approaches turn up on Ethereum and Solana, with Solana protocols like marginfi and Kamino publishing their exact curve breakpoints on-chain as configurable parameters rather than a single hardcoded formula.

Think of a toll bridge whose operator wants traffic to stay below 80% of capacity most of the time. Below that level, the toll rises gently as more cars use the bridge. Past 80%, the operator sharply raises the toll for every extra car, because congestion past that point gets expensive fast and drivers need a strong incentive to use another route (or come back later). A separate bridge across town instead auctions off a fixed number of “crossing rights” for next Tuesday; whatever price those rights trade at today tells you, in effect, what tomorrow’s toll is expected to be.

When you borrow coins from the shared piggy bank, the fee you pay depends on how empty the bank already is. If most people’s coins are still in the bank, the fee is small. If almost every coin has already been borrowed by someone else, the fee jumps up a lot, so people are encouraged to put coins back before the bank runs completely empty. Some newer piggy banks let you agree on a fee today that never changes until a set date in the future, the same way you might agree with a friend today on exactly how many coins you’ll owe them next month, no matter what happens in between.

Scenario: a USDC reserve with a two-slope curve, optimal utilization 80%, base rate 0%, slope1 4%, slope2 75% (illustrative parameters modeled on Aave/Kamino/marginfi’s published two- and multi-point curve designs).

  1. Calm market (state: U = 50%). Half the pool is borrowed. Rate is well below the kink: borrowers pay a modest, roughly linear rate.
  2. Demand rises (state: U = 80%, the kink). The pool hits its “optimal” utilization exactly at the point the curve was designed around; rate is at its designed comfortable ceiling.
  3. Sudden borrowing spike (state: U = 95%). A large borrower (or several) push utilization 15 points past optimal. Because the second slope is far steeper, the rate roughly doubles or more for a comparatively small extra 15% of the pool borrowed.
  4. Market responds (state: U falls back toward 80%). The high rate makes borrowing expensive and lending attractive, pulling in new deposits and encouraging repayments until utilization eases back down — the curve is a self-correcting feedback loop, not a one-time price.
  5. A fixed-rate alternative, same day. On a Morpho Midnight-style market, instead of watching a curve, a lender posts an offer to sell “credit units” maturing in 90 days at a price of 0.98 per unit; a borrower who takes that offer locks in a rate for the full 90 days, unaffected by whatever the pooled market’s utilization does in the meantime.
  • Myth: The interest rate model sets what lenders earn. Reality: It sets what borrowers pay; lenders earn that rate times utilization (and minus any protocol cut), so a pool’s supply APY is always below its borrow APY (see /lending/money-markets/).
  • Myth: A “kinked” curve has exactly two segments everywhere. Reality: marginfi’s curve configuration supports up to seven interpolation points, not just a zero-utilization rate, one kink, and a hundred-percent rate — most banks use only two or three of them (marginfi README, 2026-08 fetch).
  • Myth: APR and APY are the same number. Reality: APR assumes simple, once-a-year interest; APY compounds. marginfi’s docs note popular banks “compound every few minutes, or even every few seconds,” so realized yields sit close to continuously compounded APY (marginfi README, 2026-08 fetch).
  • Myth: A fixed rate in DeFi always means a fixed-rate loan product bolted onto a variable pool. Reality: Morpho Midnight and the earlier Yield Protocol instead create the fixed rate directly from the market price of a tradable token, the same mechanism that prices a Treasury bill (Paradigm, “The Yield Protocol,” 2020-04-01; Morpho Midnight whitepaper, 2026-05).
  • Myth: Interest rate parameters are fixed by the protocol’s code forever. Reality: On Aave, governance can update the curve; on isolated-market designs like Morpho Blue/Midnight and Kamino’s per-reserve configuration, whoever creates the market picks the curve, and it becomes immutable only for that specific market (see /lending/modular-lending/).

A variable lending rate is a formula that reads live utilization and outputs a number; a fixed lending rate is a market price that already has tomorrow’s expected rate baked in.

Let U[0,1]U \in [0,1] be a reserve’s utilization, UoptimalU_{optimal} the target utilization, and R0,Rslope1,Rslope2R_0, R_{slope1}, R_{slope2} configured constants. The classic Aave/Compound-lineage borrow rate is

Rborrow(U)={R0+UUoptimalRslope1,UUoptimalR0+Rslope1+UUoptimal1UoptimalRslope2,U>UoptimalR_{borrow}(U) = \begin{cases} R_0 + \dfrac{U}{U_{optimal}}\,R_{slope1}, & U \le U_{optimal} \\[6pt] R_0 + R_{slope1} + \dfrac{U - U_{optimal}}{1 - U_{optimal}}\,R_{slope2}, & U > U_{optimal} \end{cases}

Aave’s own V3 docs describe exactly this shape in words: “below the optimal point, borrow rates rise with the first slope; above it, they rise faster with the second slope” (Aave V3 overview docs, 2026-08 fetch). The supply rate lenders receive is Rsupply=Rborrow×U×(1reserve factor)R_{supply} = R_{borrow}\times U\times(1-\text{reserve factor}), since only borrowed funds generate interest and the protocol may keep a cut.

marginfi generalizes the same idea to as many as seven configured points (x0,y0),,(xn,yn)(x_0,y_0),\dots,(x_n,y_n) along the 0–100% utilization axis, with a required point at (0,y0)(0,y_0) and (100,yn)(100,y_n), and linearly interpolates between whichever two points bracket the current utilization:

r=urx0x1x0(y1y0)+y0r = \frac{ur - x_0}{x_1 - x_0}(y_1 - y_0) + y_0

The README gives a worked check: with zero_util_rate 10%, a point at (50%, 100%), and current utilization 25%, r=250500(10010)+10=55%r = \frac{25-0}{50-0}(100-10)+10 = 55\%; with points at (50%, 100%) and (80%, 150%) and utilization 60%, r=60508050(150100)+100=116.67%r = \frac{60-50}{80-50}(150-100)+100 = 116.67\% (marginfi README, 2026-08 fetch). From that base rate rr, marginfi derives lending_rate=r×UR\text{lending\_rate} = r\times UR and borrow_rate=r×ir_fees+fixed_fees\text{borrow\_rate} = r\times ir\_fees + fixed\_fees, so the lender/borrower spread is explicit fee revenue rather than a hidden rounding effect.

Rates without an oracle: Aave’s algorithmic stable-rate formula

Section titled “Rates without an oracle: Aave’s algorithmic stable-rate formula”

Aave V3 replaced an earlier design needing a live “average market borrow rate” oracle with a purely on-chain formula: the stable rate is a two-stage kinked function of utilization, plus a further offset if the stable/variable debt mix drifts past its own optimum (Aave V3 technical paper, 2022-01, §4.4, eqs. 1–4). The paper’s own worked example: an asset with a 2% stable offset hitting 4% variable rates at 90% optimal utilization has a minimal stable APR of 6%.

The amount actually owed or earned depends on how often the rate compounds. An accrual index LL tracks this: every time a reserve is touched, Lt+Δt=Lt×(1+R×Δt)L_{t+\Delta t} = L_t\times(1 + R\times\Delta t) (simple) or, closer to true continuous compounding, Lt=L0e0tR(s)dsL_t = L_0\, e^{\int_0^t R(s)\,ds}. marginfi’s docs note some venues approximate this on-chain “using a Taylor series approximation” every Solana slot (~400ms) (marginfi README, 2026-08 fetch). Kamino’s accrue_interest measures slots_elapsed since the last touch and compounds the current borrow rate over exactly that gap (Kamino architecture docs, 2026-08 fetch).

Discovering a fixed rate from a traded price

Section titled “Discovering a fixed rate from a traded price”

Instead of computing a rate from utilization, the Yield Protocol’s yTokens behave like zero-coupon bonds: an on-chain obligation settling at a fixed future date, “secured by collateral in another asset,” whose floating market price implicitly reveals its interest rate — and “the prices of yTokens of varying maturities can be used to infer interest rates, and even to construct a yield curve” (Paradigm, “The Yield Protocol,” 2020-04-01). Morpho Midnight implements the same idea inside isolated markets: “the user rate is naturally implied from the discount at which units are traded: for any traded price P>0P > 0, the simple rate over the remaining term is r=1P1r = \frac{1}{P} - 1” (Morpho Midnight whitepaper, 2026-05, §2.1). Prices move in a discrete tick grid sized so each tick step is a constant relative change in implied return, starting at δ=2%\delta = 2\% per tick and configurable down to 0.5%0.5\% (§3.5). A settlement fee widens the buyer/seller spread by a time-to-maturity–dependent amount f(ttm)f(ttm), piecewise-linear between breakpoints at 0, 1, 7, 30, 90, 180 and 360 days and capped so the implied annualized fee never exceeds 50 bps (§7.1).

Variable-rate curve. Using the illustrative two-slope parameters from §2 (Uoptimal=80%U_{optimal}=80\%, R0=0%R_0=0\%, Rslope1=4%R_{slope1}=4\%, Rslope2=75%R_{slope2}=75\%):

  • At U=50%U=50\%: Rborrow=0.500.80×4%=2.5%R_{borrow} = \frac{0.50}{0.80}\times4\% = 2.5\%.
  • At U=80%U=80\% (the kink): Rborrow=4%R_{borrow} = 4\%.
  • At U=95%U=95\%: Rborrow=4%+0.950.8010.80×75%=4%+0.75×75%=60.25%R_{borrow} = 4\% + \frac{0.95-0.80}{1-0.80}\times75\% = 4\% + 0.75\times75\% = 60.25\%. Going from 80% to 95% utilization — a 15-point move — pushed the rate from 4% to over 60%, a more than 15x jump, exactly the “sharp past the kink” behavior the curve is designed to produce.

marginfi multi-point curve, reusing the README’s own numbers: zero_util_rate 10%, one interpolation point at (50%, 100%), utilization 25% gives r=(250)/(500)×(10010)+10=55%r=(25-0)/(50-0)\times(100-10)+10=55\% (marginfi README, 2026-08 fetch). If fees add, say, a 1% ir_fee multiplier and 0.5% fixed_fee, borrow rate =55%×1.01+0.5%=56.05%= 55\%\times1.01+0.5\% = 56.05\%, while lenders at 25% utilization earn lending rate =55%×0.25=13.75%=55\%\times0.25=13.75\% — the spread (42.3 points here) funds protocol and insurance fees.

Fixed-rate discovery. On a Midnight-style 90-day market, a lender’s offer trades at P=0.98P=0.98: simple rate over the term r=1/0.981=2.041%r = 1/0.98 - 1 = 2.041\% for 90 days, or roughly 2.041%×36090=8.16%2.041\%\times\frac{360}{90}=8.16\% annualized (simple, ignoring compounding and fees) — a number the borrower and lender both locked in the moment the trade settled, regardless of what happens to any pooled market’s utilization over the next 90 days.

  • Aave V3 / Compound — the two-slope kinked curve is the shared ancestor design; Aave V3 additionally removed the stable-rate oracle for the algorithmic formula in §3 (Aave V3 technical paper, 2022-01, §4.4).
  • Yield Protocol — the historical originator of market-discovered fixed rates via tradable, maturity-dated yTokens, letting users “synthetically lend or borrow the target asset for a fixed term” (Paradigm, 2020-04-01).
  • Morpho Midnight — the modern implementation of interest-rate discovery inside isolated, permissionlessly created fixed-maturity markets; full market design in /lending/modular-lending/.
  • marginfi (rebranded Project 0 / P0) — publishes its exact multi-point curve mechanics in its own README, the most detailed public interest-rate documentation among this page’s Solana sources.
  • Kamino Lend — reserves “calculate interest rates based on utilization,” with accrue_interest compounding continuously against slot-measured elapsed time (Kamino architecture docs, 2026-08 fetch).
  • Save (formerly Solend) and Jupiter Lend — both describe utilization-based rates in their public docs, but neither fetched source spells out curve breakpoints (Save docs; Jupiter developer docs, 2026-08 fetch) — treat exact curve shapes as unverified.
  • Flash-loan-funded utilization spikes as an oracle-manipulation vector. A rate curve reacts instantly to utilization, and utilization can be moved temporarily within one transaction using borrowed capital, so any external contract reading a lending market’s current rate as a price input inherits that manipulability — the root cause behind the bZx attacks of February 2020, covered in /lending/flash-loans/.
  • Governance mis-calibration. Setting UoptimalU_{optimal} too high leaves too little of the pool available for withdrawal in a bank-run scenario; too low needlessly starves borrowers and lenders — a tuning problem Aave’s own V3 paper motivates its “risk admin” role around (Aave V3 technical paper, 2022-01, §3.2).
  • Immutable-market curve mistakes are permanent. Morpho Blue/Midnight markets are immutable once created, so a poorly chosen curve or fee schedule cannot be patched — only abandoned — trading governance flexibility for the isolation guarantees in /lending/modular-lending/.
  • Fixed-rate settlement risk near maturity. Morpho Midnight softens post-maturity liquidations with a Dutch-auction-style ramp specifically to avoid “transferring excessive value from the borrower to the liquidator” when a healthy borrower merely misses the settlement date (Morpho Midnight whitepaper, 2026-05, §4.3–4.4) — full mechanics in /lending/liquidations/.
  • Recourse gap when a rate or price feed is simply wrong. cc7768’s ethresear.ch framework notes “Fast DeFi” gives instant, anonymous execution but no dispute process if a relied-upon number turns out wrong (ethresear.ch 11182, 2021-11-04).
  • Can a single curve serve wildly different asset volatilities? The tension Aave’s V3 paper raises about aggregated pools — one-size-fits-all risk parameters — applies just as much to interest curves as to LTVs (Aave V3 technical paper, 2022-01, §1.1); isolated-market designs push this decision to whoever creates the market instead of resolving it.
  • Whether fixed-rate liquidity can ever match variable-rate depth. The Midnight whitepaper is candid that “a central challenge in scaling onchain lending markets is bootstrapping liquidity” — its offer/callback design exists to work around this, not to prove it solved (Morpho Midnight whitepaper, 2026-05, §1).
  • How much of “APY” displayed to users is real. marginfi’s own docs concede “different venues and providers handle the APR -> APY conversion in different ways” (marginfi README, 2026-08 fetch) — cross-protocol rate comparisons are noisier than displayed numbers suggest.
  • Whether rate-discovery markets need their own risk engine. Midnight’s bad-debt change from Morpho Blue — realizing losses as soon as a liquidator first acts, not only once collateral is fully seized — narrows, but doesn’t eliminate, the window “informed lenders” can exit before a loss is socialized (Morpho Midnight whitepaper, 2026-05, §4.5, footnote 5); see /lending/risk-engines/.
AspectEthereumSolana
Dominant rate modelTwo-slope kinked curve, governance-set (Aave/Compound lineage)Multi-point (up to 7) interpolated curve, per-bank/per-reserve config (marginfi, Kamino)
Fixed-rate designSeparate market layer: Yield Protocol (2020), Morpho Midnight (2026) — price-discovered via traded zero-coupon-like unitsNo fixed-rate discovery market documented in this page’s sources
Accrual granularityPer-block or per-interaction compounding, often approximatedKamino/marginfi compound on every reserve-touching instruction, sometimes multiple times per second on active banks
Algorithmic vs. oracle-fed ratesAave V3 explicitly removed an oracle dependency for stable rates (2022)Curves are utilization-only inputs by design; no Solana source here documents an oracle-fed rate model
Governance over curve parametersOn-chain governance vote (Aave); immutable per-market (Morpho)Group/market admin sets curve at bank/reserve creation (marginfi, Kamino)

The deeper difference is architectural rather than mathematical: Ethereum’s highest-profile rate models are either governance-tunable parameters on a shared pool (Aave) or fully immutable inside a permissionless market (Morpho), with little middle ground, while Solana’s marginfi and Kamino default to admin-configurable curves on a per-bank/per-reserve basis without a governance vote, reflecting the smaller number of large, foundation-adjacent teams currently running Solana’s major lending markets.

Morpho Midnight Whitepaper — Bhargav Nagaraja Bhatt, Paul Frambot, Quentin Garchery, Mathis Gontier Delaunay, Adrien Husson, Paul-Adrien Nicole, Adrien Laversanne-Finot, Matthieu Lesbre (Morpho Association), May 2026. morpho.org/whitepapers/midnight-whitepaper.pdf

The paper opens by noting on-chain lending totals “about $25b of active loans as of May 2026” (as of 2026-05) and diagnosing why pool-based, utilization-priced variable rates — the design this page opens with — leave interest-rate risk as “a direct barrier for borrowers who need predictable funding costs” and make small markets easy to move (§1). It frames Midnight as Morpho Blue’s fixed-rate sibling: isolated, immutable, permissionlessly created markets, but for fixed-maturity credit instead of open-ended variable debt.

Section 2 defines the market mechanics: positions are “credit units” and “debt units,” analogous to zero-coupon bonds, with the user rate implied directly from the traded price (r=1/P1r = 1/P - 1). Because units are fungible at the market level rather than tied to the trade that created them, early exits are possible by trading in the opposite direction, and trading continues even past maturity (except that debt cannot increase further) specifically “to facilitate unwinding in the event of unprofitable liquidations.”

Section 3 covers the offer-based trading layer that makes this practical: makers post signed offers with an attached “ratifier” contract for validation, optionally backed by a callback that sources funds only when the offer is filled — letting a lender keep capital deployed on Morpho Blue until a fixed-rate offer executes. Multi-market offers sharing a consumption-group budget solve liquidity fragmentation across many isolated maturities with one signature. A discrete, geometrically-spaced tick grid (§3.5) prevents undercutting by economically meaningless price increments while keeping tick spacing proportional to implied-rate changes.

Section 4 is the liquidation design: maximum debt capacity is the collateral-value-weighted sum of per-collateral liquidation LTVs (eq. 3); the liquidation incentive factor is capped by a per-market “liquidation cursor” γ\gamma (eq. 4); unhealthy positions use a “recovery close factor” that only restores health rather than fully closing the position; and overdue-but-healthy positions past maturity face a softened, Dutch-auction-style liquidation incentive ramping from 1 to the maximum over 60 minutes, explicitly to protect borrowers who are merely late rather than insolvent. Section 4.5 tightens Morpho Blue’s bad-debt realization timing, crystallizing losses as soon as a liquidator first acts rather than only once collateral is fully seized. Sections 5–7 cover optional access-control gates, a single coarse-grained authorization primitive, and two capped protocol fees (a per-trade settlement fee and a continuous fee on outstanding credit).

“The user rate is naturally implied from the discount at which units are traded: for any traded price P > 0, the simple rate over the remaining term is r = 1/P − 1.” (§2.1, Markets)

“A central challenge in scaling onchain lending markets is bootstrapping liquidity.” (§1, Introduction)

“This is enabled to facilitate unwinding in the event of unprofitable liquidations.” (§2.3, Early exits)

“The amount repaid by the liquidator is capped at the level required to restore the position to health, a mechanism referred to as the recovery close factor.” (§4.3, Liquidation of unhealthy positions)

“Here, the time to realize a loss is set by how quickly a liquidator first acts on the position, considerably narrowing that window.” (§4.5, footnote 5, Bad-debt accounting)

Background needed: what a zero-coupon bond is (a token that pays a fixed amount at maturity and trades below that amount beforehand, with the discount encoding the interest rate), and the isolated-market vocabulary from Morpho Blue (/lending/modular-lending/). On a first pass, skip the tick-quantization algebra in §3.5 past equation 1 — the intuition (“constant relative rate change per tick, until you’re near par where price ticks take over”) matters more than the derivation. The hardest paragraph is §4.5’s bad-debt footnote comparing Midnight to Morpho Blue: it is easy to read as a minor implementation detail, but it is actually describing a real economic race — on Morpho Blue, sophisticated lenders can detect an under-collateralized position and exit before the loss is formally recognized, leaving slower lenders to absorb it; Midnight narrows, but does not close, that window by tying loss recognition to the first liquidator action instead of full collateral seizure.

  • Morpho Midnight (2026-05) is itself the “what changed” relative to the Yield Protocol (2020) and Morpho Blue’s variable-only design (2023): it is the first widely documented attempt to bring Yield-Protocol-style rate discovery into an isolated, Blue-style permissionless market framework, citing both directly in its own references (Morpho Midnight whitepaper, 2026-05, refs. [4], [6]).
  • Aave’s stable-rate mechanism, the subject of its own algorithmic redesign in 2022, has become a comparatively minor feature across most Aave deployments as variable-rate borrowing dominates volume industry-wide as of the mid-2020s (inferred from the general shift toward variable-only and fixed-via-separate-market designs described across this page’s sources; no single dated source quantifies this shift precisely).
  1. Paradigm, “The Yield Protocol: On-Chain Lending With Interest Rate Discovery” (2020-04-01) — read first if you want the original, simpler statement of why a traded token can reveal an interest rate, before Midnight’s added tick/offer machinery.
  2. Aave V3 Technical Paper, §4.4 (2022-01-27) — read if you want to see a governance-oracle dependency actually removed and replaced with a closed-form utilization-based formula.
  3. marginfi-v2 README, “Interest Rates, Curves, and Compounding” (2026-08 fetch) — read if you want the most concrete, worked-example-driven explanation of multi-point curve interpolation and the APR/APY distinction available among this page’s sources.