Interest Rate Model
Compound uses a jump-rate model — a piecewise-linear curve with a gentle slope below the kink and a sharp spike above it. The kink creates a natural liquidity buffer, and the supply rate is derived directly from the borrow rate by scaling with utilization and the reserve factor.
Jump Rate Parameters
🔢 The Jump Rate Formula
+ (util − kink) × jumpMultiplier
📊 Historical Borrow Rates: USDC on Compound V2 (2020–2026)
Compound V2 USDC borrow rates spiked above 15% during the COVID crash (March 2020), normalised through 2021–2023 at 1–5%, briefly topped 8% during the 2024 hiking cycle, and settled in the 3–5% range in 2025–2026. Dotted red markers flag events where utilisation crossed the 90% threshold — the proxy for "near kink" stress.
How the jump rate works
Compound V2 prices borrows along a two-segment piecewise-linear curve. For any market (cUSDC, cDAI, cETH …), the protocol stores five parameters: baseRate, multiplier, kink, jumpMultiplier, and reserveFactor. Every block, accrueInterest() is called, which grows totalBorrows by the accumulated interest. The borrow rate at any utilisation u is:
When u ≤ kink: borrowRate = baseRate + u × multiplier
When u > kink: borrowRate = baseRate + kink × multiplier + (u − kink) × jumpMultiplier
The kink is the design centrepiece. It is typically set at 80% — governance chooses this value per asset. Below the kink, the multiplier (say 5%) means borrow rate climbs 5 percentage points for each 100% utilisation: at 50% util, the borrow rate is a comfortable 2.5% APY. Above the kink, the jumpMultiplier takes over and the curve becomes almost vertical: at 95% util with jumpMultiplier 50, the rate is baseRate + 80×5% + 15×50% = 4% + 750% / 100 = 11.5% APY, which is punishing enough to force immediate repayment pressure.
The supply rate is a direct downstream consequence of the borrow rate. Suppliers share the interest earned by the pool,
but the reserveFactor carves out a protocol fee: supplyRate = borrowRate × util × (1 − reserveFactor).
At 80% util with a 10% reserve factor, even a 5% borrow rate yields only 5% × 0.80 × 0.90 = 3.6% supply APY. At very
low utilisation — say 20% — the supply rate collapses to near zero regardless of how high borrow rates are, which is
why sophisticated suppliers watch utilisation, not just the borrow rate headline.
Compound vs Aave V1 interest rate model
The Compound V2 and Aave V1 interest rate models are structurally identical. Both use a kinked piecewise-linear
curve with a below-kink slope and an above-kink slope that is significantly steeper. The naming differs: Compound calls
the pre-kink slope multiplier and the post-kink slope jumpMultiplier; Aave calls them
slope1 and slope2. Both use a baseRate that shifts the whole curve up or down.
The key practical difference is that Compound V2 sets baseRate = 0 for most markets, making the borrow rate exactly zero when utilisation is zero. Aave V1 defaults to a small non-zero baseRate (e.g., 1%) so the protocol earns a spread even in thin markets. Compound's zero-base model keeps borrowing costs lower in calm conditions; Aave's positive-base model builds reserves faster when markets are quiet. By the time Aave V2 and V3 launched, Aave had converged on a similar model with separate base and slope parameters per asset.
Another difference: Compound V2 exposes raw parameters (multiplier, jumpMultiplier) that map directly to a borrow rate formula readable in plain Solidity, while Aave V3 uses an InterestRateModel contract with the same math but expressed in more abstract IRM slots. Understanding Compound's jump rate makes reading any money market's rate model trivial.
How interest compounds: cToken accrual model
Unlike Aave, where interest accrues to a user's balance as a growing number, Compound suppliers earn interest through a rising cToken exchange rate. Each cToken contract maintains:
exchangeRate = (totalCash + totalBorrows − totalReserves) / totalSupply
Every block, accrueInterest() increases totalBorrows by the accumulated interest
(Δborrows = totalBorrows × borrowRate × blockTime). This grows the numerator of the exchange rate
without minting new cTokens. If you supplied 1,000 DAI and received 45,662 cDAI at an exchange rate of 0.0219,
and over one year the exchange rate grows to 0.0232, your 45,662 cDAI redeem for 45,662 × 0.0232 = 1,059.36 DAI.
No claim. No rebase. Just a higher redemption value baked into every cToken you hold.
The compound frequency is block-time continuous: interest is calculated and added on every Ethereum block (~12 seconds).
This is effectively continuous compounding for APY purposes. The displayed APY on Compound's UI applies the standard
compound interest formula: APY = (1 + rate_per_block)^(blocks_per_year) − 1, where blocks_per_year ≈ 2,628,000.
Compound V2 vs V3 (Comet) IR model
Compound V3 (Comet) preserves the jump-rate structure but restructures the market topology. V2 is a shared multi-asset pool: any asset can be borrowed against any collateral, and all borrowers of USDC share the same USDC borrow rate. V3 isolates each market to a single borrow asset. cUSDCv3 lets you supply WBTC, wstETH, COMP, LINK, or UNI as collateral and borrow USDC only — the USDC liability is siloed from other Comet deployments.
In Comet, each market has its own interest rate model configured at deployment. The structure — baseRate, multiplier, kink, jumpMultiplier — is identical, but the parameters are set per Comet, not per asset inside a shared pool. This means USDC on cUSDCv3 can have different rate parameters than USDC on cWETHv3, which targets a different risk profile. V3 also introduces a cleaner separation between borrow collateral factor (used to calculate borrowing capacity) and liquidate collateral factor (used to determine when liquidation triggers), giving positions a buffer zone.
The cToken accrual model also changes in V3. Comet uses a single underlying asset per market, so the "exchange rate" concept is replaced by a simpler per-asset supply balance that grows via the same reserve-factor mechanism. The economic outcome for suppliers is identical — continuously compounding yield — but the on-chain accounting is cleaner.
Frequently asked questions
- What exactly is the kink and why does it matter?
- The kink is a utilization threshold — typically 80% — where the interest rate curve changes slope. Below it, the borrow rate rises proportionally with utilization. Above it, the jumpMultiplier kicks in and rates climb steeply. The idea is to keep reserves liquid: when utilization hits the kink, borrowing becomes expensive fast, encouraging borrowers to repay and new suppliers to deposit. Without a kink, rates could climb gradually all the way to 100%, and at 100% no one could withdraw.
- How is Compound's model different from Aave's interest rate model?
- Conceptually they are very similar — both are piecewise-linear, utilization-driven curves with an optimal point and a steep slope above it. The key differences are terminology and parameterization: Compound calls the pre-kink slope 'multiplier' and the post-kink slope 'jumpMultiplier', while Aave calls them 'slope1' and 'slope2'. Compound V2 also uses a base rate of 0 for most markets (making the curve pass through the origin), whereas Aave often sets a small non-zero base rate. The math is structurally identical.
- How does the supply rate relate to the borrow rate?
- Supply rate = borrow rate × utilization × (1 − reserve factor). Suppliers don't earn the full borrow rate — the reserve factor (typically 10–20% on Compound V2) siphons a cut into the protocol's reserves. So if the borrow rate is 5% and utilization is 80% with a 10% reserve factor, the supply rate is 5% × 0.80 × 0.90 = 3.6%. At low utilization, supply rate is nearly zero even if borrow rates look healthy — a common source of confusion for new users.
- Why does Compound V2 set baseRate to 0 for most assets?
- A base rate of 0 means borrow rate is 0 when utilization is 0 — no interest is charged when there are no borrows outstanding. This is a design choice that Aave differs on by default. Setting baseRate > 0 means the protocol earns a spread even at low utilization, which is good for reserve accumulation but penalizes borrowers even when the pool is undersubscribed. Compound's zero-base model keeps borrow costs low during calm markets and relies entirely on the jumpMultiplier to manage liquidity risk above the kink.
- How does the cToken accrual model connect to interest rates?
- Every block, Compound's accrueInterest() function increases totalBorrows by the accumulated interest since the last block. This grows the numerator of the cToken exchange rate without minting new cTokens, so each existing cToken redeems for more underlying. The borrow rate drives how fast totalBorrows grows; the supply rate is simply the borrow rate scaled by utilization and the reserve factor. You never 'receive' interest as new tokens — your cToken balance is static, but its redemption value climbs continuously.
- What is the difference between Compound V2 and V3 (Comet) interest rate models?
- Compound V3 (Comet) uses the same jump-rate structure but with important modifications: each Comet market has a single borrow asset (e.g., USDC only), which simplifies parameterization. Governance no longer sets per-asset interest rate models across a multi-collateral market — instead, each Comet has its own isolated parameters. V3 also separates the borrow collateral factor from the liquidation collateral factor, giving positions a buffer before liquidation triggers, and the absorb mechanism replaces V2's liquidator repayment model with a protocol-level position takeover.