> For the complete documentation index, see [llms.txt](https://vaultbook.gauntlet.xyz/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://vaultbook.gauntlet.xyz/vaults/morpho-vaults/morpho-adaptive-curve-irm.md).

# Morpho Adaptive Curve IRM

The AdaptiveCurveIRM is Morpho Blue's native interest rate model. It targets a **90% utilization ratio** by continuously adjusting an internal rate anchor. This page explains how the curve works, how the anchor adapts over time, and how quickly rates can move at different utilization levels.

### The Rate Curve

At any point in time, the borrow rate is a function of two inputs:

* **Current utilization** `U` - the share of supplied assets currently borrowed
* **`rateAtTarget`** - an internal state variable representing the borrow rate at exactly 90% utilization

The curve is piecewise linear with a kink at the 90% target. Below the kink it is shallow; above it is steep.

```
// err = (U - 0.90) / normFactor,  bounded to [-1, +1]
// normFactor = (1 - 0.90) above target, 0.90 below target

if err < 0:
  r = ((1 - 1/C) × err + 1) × rateAtTarget

if err >= 0:
  r = ((C - 1) × err + 1) × rateAtTarget

// C = 4 (curve steepness)
```

This produces a fixed multiplier structure regardless of where `rateAtTarget` sits:

| Utilization | Multiplier | Example (rateAtTarget = 4%) |
| ----------- | ---------- | --------------------------- |
| 0%          | 0.25×      | 1.00%                       |
| 90% (kink)  | 1.00×      | 4.00%                       |
| 100%        | 4.00×      | 16.00%                      |

The **shape of the curve never changes** — only the anchor moves. If `rateAtTarget` doubles, every point on the curve doubles with it.

#### Key Parameters

| Parameter             | Value  | Description                                        |
| --------------------- | ------ | -------------------------------------------------- |
| `TARGET_UTILIZATION`  | 90%    | Kink point; borrow rate equals `rateAtTarget` here |
| `CURVE_STEEPNESS` (C) | 4      | Max rate = 4× anchor; min rate = 0.25× anchor      |
| `ADJUSTMENT_SPEED`    | 50/yr  | Controls how fast `rateAtTarget` adapts            |
| `MIN_RATE_AT_TARGET`  | 0.1%   | Floor on `rateAtTarget`                            |
| `MAX_RATE_AT_TARGET`  | 1,200% | Ceiling on `rateAtTarget`                          |

***

### The Adaptive Mechanism

Between market interactions, `rateAtTarget` drifts continuously based on the signed error between current utilization and the 90% target.

```
speed            = ADJUSTMENT_SPEED × err       // 50/yr × [-1, +1]
elapsed          = block.timestamp - lastUpdate

endRateAtTarget  = startRateAtTarget × exp(speed × elapsed)
```

The further utilization deviates from target, the faster the anchor moves:

* **U > 90%** - error is positive, `rateAtTarget` rises. Higher rates attract new supply and discourage borrowing until utilization falls back to target.
* **U < 90% -** error is negative, `rateAtTarget` falls. Lower rates stimulate borrowing and may cause suppliers to exit until utilization recovers.
* **U = 90%** - error is zero, `rateAtTarget` is unchanged. This is the only stable fixed point.

### Rate Velocity

#### Borrow Rate at Each Utilization Level

The table below shows the instantaneous borrow rate and the rate after 5 days of sustained utilization, starting from `rateAtTarget = 4%`.

| Util | err  | rAT t=0 | rAT t=5d | Borrow t=0 | Borrow t=5d | Change | Max rate t=0 | Max rate t=5d |
| ---- | ---- | ------- | -------- | ---------- | ----------- | ------ | ------------ | ------------- |
| 90%  | 0.00 | 4.00%   | 4.00%    | 4.00%      | 4.00%       | +0%    | 16.00%       | 16.00%        |
| 91%  | 0.10 | 4.00%   | 4.28%    | 5.20%      | 5.57%       | +7%    | 16.00%       | 17.13%        |
| 92%  | 0.20 | 4.00%   | 4.59%    | 6.40%      | 7.34%       | +15%   | 16.00%       | 18.35%        |
| 93%  | 0.30 | 4.00%   | 4.91%    | 7.60%      | 9.33%       | +23%   | 16.00%       | 19.65%        |
| 94%  | 0.40 | 4.00%   | 5.26%    | 8.80%      | 11.57%      | +32%   | 16.00%       | 21.04%        |
| 95%  | 0.50 | 4.00%   | 5.63%    | 10.00%     | 14.08%      | +41%   | 16.00%       | 22.53%        |
| 96%  | 0.60 | 4.00%   | 6.03%    | 11.20%     | 16.89%      | +51%   | 16.00%       | 24.13%        |
| 97%  | 0.70 | 4.00%   | 6.46%    | 12.40%     | 20.03%      | +62%   | 16.00%       | 25.84%        |
| 98%  | 0.80 | 4.00%   | 6.92%    | 13.60%     | 23.52%      | +73%   | 16.00%       | 27.68%        |
| 99%  | 0.90 | 4.00%   | 7.41%    | 14.80%     | 27.41%      | +85%   | 16.00%       | 29.64%        |
| 100% | 1.00 | 4.00%   | 7.93%    | 16.00%     | 31.74%      | +98%   | 16.00%       | 31.74%        |

*rAT = rateAtTarget. Max rate = borrow rate at 100% utilization given the adapted rateAtTarget. Protocol fee not applied.*

#### Time for `rateAtTarget` to Reach a Level

Starting from `rateAtTarget = 4%`, days required to reach each target rate at constant utilization.

```
t = ln(targetRate / startRate) / (ADJUSTMENT_SPEED × err) × 365
```

| Constant UR | To 7%     | To 8%     | To 9%     | To 10%    |
| ----------- | --------- | --------- | --------- | --------- |
| 91%         | 40.4 days | 50.0 days | 58.5 days | 66.1 days |
| 92%         | 20.2 days | 25.0 days | 29.2 days | 33.0 days |
| 93%         | 13.5 days | 16.7 days | 19.5 days | 22.0 days |
| 95%         | 8.1 days  | 10.0 days | 11.7 days | 13.2 days |
| 97%         | 5.8 days  | 7.1 days  | 8.3 days  | 9.4 days  |
| 100%        | 4.1 days  | 5.1 days  | 5.9 days  | 6.7 days  |

*Assumes constant utilization throughout. In practice, rising rates will attract new supply and reduce utilization before these levels are reached.*

#### Doubling Time by Utilization

How many days of sustained utilization before `rateAtTarget` and every point on the curve doubles.

| Utilization | err  | Speed   | Doubling Time |
| ----------- | ---- | ------- | ------------- |
| 91%         | 0.10 | 5.0/yr  | 50.6 days     |
| 92%         | 0.20 | 10.0/yr | 25.3 days     |
| 93%         | 0.30 | 15.0/yr | 16.9 days     |
| 94%         | 0.40 | 20.0/yr | 12.6 days     |
| 95%         | 0.50 | 25.0/yr | 10.1 days     |
| 96%         | 0.60 | 30.0/yr | 8.4 days      |
| 97%         | 0.70 | 35.0/yr | 7.2 days      |
| 98%         | 0.80 | 40.0/yr | 6.3 days      |
| 99%         | 0.90 | 45.0/yr | 5.6 days      |
| 100%        | 1.00 | 50.0/yr | 5.1 days      |

***

### Supply APY vs Borrow APY

`rateAtTarget` is not the supply APY. The relationship between the two is:

```
supplyAPY = borrowAPY × utilization × (1 - protocolFee)
```

At 90% utilization, a 4% borrow APY with a 15% protocol fee yields a supply APY of approximately 3.0&#x36;**%**. The gap between borrow and supply APY narrows at higher utilization but never fully closes due to the protocol fee.

***

### Risk Considerations

**Slow-moving markets.** A market pinned at 91% adapts slowly - `rateAtTarget` takes \~50 days to double. This is insufficient pressure for rapid rebalancing. Curators should treat sustained utilization above 91% as a signal to add supply capacity proactively.

**Fast-moving markets.** Above 95% utilization, the anchor can double in under 10 days. Combined with the 4× curve multiplier, the max borrow rate can reach multiples of its starting value quickly, which may trigger liquidations if borrowers are not monitoring positions.

**The 4× leverage on volatility.** Because the max rate is always `C × rateAtTarget`, any drift in the anchor is amplified fourfold at the top of the curve. A `rateAtTarget` move from 4% to 8% moves the max rate from 16% to 32%.

**`rateAtTarget` as a market health signal.** Rising `rateAtTarget` indicates sustained over-utilization. Falling `rateAtTarget` indicates sustained under-utilization!


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://vaultbook.gauntlet.xyz/vaults/morpho-vaults/morpho-adaptive-curve-irm.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
