Mathematical structure of interest rate models: equations, calibration, and joint constraints
Mathematical Structure of the Interest Rate Models
Each model below is described in three parts: the equations that define it, the parameters that govern its behavior, and the mechanical link between parameter values and model dynamics. The goal is to make explicit how calibration choices propagate — why, for example, a high $k_p$ in Morpho's adaptive curve produces qualitatively different dynamics than a high $\gamma$ in a linear kink, even though both are described as "aggressive."
Linear Kink Model
The linear kink model is piecewise linear in utilization:
$$i_b =\begin{cases}\alpha + \beta \cdot U_t, & \text{if } U_t \leq U_{\text{opt}} \\\\\alpha + \beta \cdot U_{\text{opt}} + \gamma \cdot (U_t - U_{\text{opt}}), & \text{if } U_t > U_{\text{opt}}\end{cases}$$
Four parameters define it: the base rate $\alpha$ (rate at $U_t = 0$), the below-kink slope $\beta$, the above-kink slope $\gamma$, and the kink location $U_{\text{opt}}$. The rate at full utilization is $\alpha + \beta \cdot U_{\text{opt}} + \gamma \cdot (1 - U_{\text{opt}})$, which is the implicit cap of the model.
Parameter Interaction - The four parameters are not independent. Once $\alpha$ and $U_{\text{opt}}$ are chosen, $\beta$ is bounded above by the rate the protocol is willing to charge at the kink, and $\gamma$ is bounded below by the rate the protocol needs at $U_t = 1$ to discourage full utilization. A common error is setting $\gamma$ aggressively (e.g. 300%) without checking that the resulting rate at $U_t = 1$ makes the pool unusable for borrowers operating near the kink. In practice, $\gamma \geq 100\%$ is necessary in thin-liquidity pools to maintain stable equilibria; $\gamma < 50\%$ allows utilization to drift into the dangerous zone and persist there.
What $\beta$ and $\gamma$ do mechanically. $\beta$ controls how much rate signal borrowers receive in the normal operating range. A small $\beta$ (5–10%) means rates barely change as utilization drifts between 0 and $U_{\text{opt}}$ — the model is effectively dormant in this region. $\gamma$ controls how decisively the model responds once utilization breaches the kink. The order-of-magnitude gap between $\beta$ and $\gamma$ (typically 10× to 30×) is the model's only mechanism for distinguishing "normal" from "stressed" — it has no memory, no time-dependence, and no feedback from prior states.
Kashi Reactive Model
Kashi defines an optimal range $[U_{\min}, U_{\max}]$ rather than a single optimal point, and adjusts the rate based on quadratic distance from that range. The deviation is:
$$\Delta U =\begin{cases}\dfrac{U_{\min} - U_t}{U_{\min}}, & \text{if } U_t < U_{\min} \\\\[6pt]\dfrac{U_t - U_{\max}}{1 - U_{\max}}, & \text{if } U_t > U_{\max} \\\\[6pt]0, & \text{if } U_{\min} \leq U_t \leq U_{\max}\end{cases}$$
The response scale combines the half-life parameter $E$ with quadratic deviation and elapsed time:
$$\text{scale} = E + \Delta U^2 \cdot \text{elapsed}$$
The interest rate then updates multiplicatively:
$$IR =\begin{cases}IR_{t-1} \cdot \dfrac{E}{\text{scale}}, & \text{if } U_t < U_{\min} \quad \text{(rate decreases)} \\\\[6pt]IR_{t-1} \cdot \dfrac{\text{scale}}{E}, & \text{if } U_t > U_{\max} \quad \text{(rate increases)} \\\\[6pt]IR_{t-1}, & \text{if } U_t \in [U_{\min}, U_{\max}]\end{cases}$$
Hard floors and ceilings bound the rate: $IR_t = \max(IR, IR_{\min})$ on the low side and $\min(IR, IR_{\max})$ on the high side.
Parameter interactions. Four parameters carry meaning: the range width $(U_{\max} - U_{\min})$, the half-life $E$, and the floor/ceiling pair $(IR_{\min}, IR_{\max})$. The half-life $E$ has a specific operational meaning — at the boundary of the range and $\Delta U$ close to zero, $\text{scale} \approx E$ and the rate is unchanged. The further outside the range, the more aggressively scale dominates $E$, and the faster the rate moves. The original Kashi implementation uses $E = 8$ hours, meaning the rate halves (or doubles) over 8 hours of sustained range-violation when $\Delta U = 1$.
The range-width trap. A narrow range (e.g. $U_{\max} - U_{\min} = 0.05$) makes the model spend most of its time outside the range, continuously scaling rates rather than holding them constant. The intended "stable inside, reactive outside" behavior collapses into "perpetually reactive." A range that is too wide (e.g. $U_{\max} - U_{\min} = 0.30$) defeats the purpose of having a model at all — utilization can drift across most of the curve without any rate signal. The implicit assumption is that observed utilization noise has a standard deviation roughly equal to $(U_{\max} - U_{\min})/4$; ranges narrower than this trigger constantly on noise.
The cap as a soft solvency limit. Because the rate is hard-capped at $IR_{\max}$, the model loses its ability to respond once utilization is high enough that even $IR_{\max}$ cannot pull users back. If the pool needs a rate above $IR_{\max}$ to constrain a stress event, the model has nothing more to offer — $IR_{\max}$ becomes a soft solvency limit, and calibration must treat it as such.
Euler V1 Reactive Model
Euler V1 extends Kashi by adding a learning component that uses observed utilization response to modulate rate changes. First, the utilization change since the last block is recorded:
$$\Delta U_t = U_t - U_{t-1}$$
The distance from the optimal range is computed (same as Kashi, but normalized differently above and below):
$$U_{\text{dist}} =\begin{cases}-\dfrac{U_{\min} - U_t}{U_{\min}}, & \text{if } U_t < U_{\min} \\\\[6pt]\dfrac{U_t - U_{\max}}{U_{\max}}, & \text{if } U_t > U_{\max} \\\\[6pt]1, & \text{if } U_t \in [U_{\min}, U_{\max}]\end{cases}$$
And the distance of the previous rate from its bounds:
$$IR_{\text{dist}} =\begin{cases}\dfrac{IR_{\text{prev}}}{IR_{\max}}, & \text{if } U_t < U_{\min} \\\\[6pt]\dfrac{IR_{\max} - IR_{\text{prev}}}{IR_{\max}}, & \text{if } U_t > U_{\max} \\\\[6pt]1, & \text{if } U_t \in [U_{\min}, U_{\max}]\end{cases}$$
The control signal combines these with elapsed time and the reactivity parameter $k_a$:
$$C = U_{\text{dist}} \cdot IR_{\text{dist}} \cdot dT \cdot k_a$$
The learning term scales the observed utilization response by $k_d$:
$$\text{base} = \Delta U_t \cdot k_d$$
The final rate is the previous rate plus both adjustments:
$$IR_t = IR_{t-1} + \text{base} + C$$
What $k_a$ and $k_d$ do separately. $k_a$ is the reactive coefficient — it determines how much rate change is required by the current distance from optimal. $k_d$ is the learning coefficient — it determines how much the prior block's response feeds into the current adjustment. The model's behavior depends on which dominates. When $k_d$ is small (or set to zero), the model collapses to a pure reactive controller similar to Kashi. When $k_d$ is large, the model becomes responsive to the derivative of utilization rather than just its level — a sudden move triggers a large rate change even if utilization is still inside the optimal range.
The learning-rate calibration problem. $k_d$ earns its complexity only when response patterns are stable enough to be learned. In practice, this means: a relatively homogeneous borrower base, low external rate noise, and stable enough conditions for $\Delta U_t$ to carry signal rather than noise. When these conditions are absent — for example, a new pool with a heterogeneous user base — $k_d$ learns from noise and the model oscillates. A common calibration starting point is $k_d / k_a \approx 0.1\text{–}0.3$; ratios above 1 give the learning component dominance and require careful empirical validation.
Silo Dynamic Model
Silo divides the utilization curve into four regions: very low ($U_t < U_{\text{low}}$), low ($[U_{\text{low}}, U_{\text{opt}}]$), optimal ($[U_{\text{opt}}, U_{\text{crit}}]$), and critical ($U_t > U_{\text{crit}}$). In the very-low region, the rate is purely proportional:
$$r_{\text{lin}} = k_{\text{lin}} \cdot U_t$$
Above $U_{\text{low}}$, the model checks position relative to $U_{\text{crit}}$ and computes a proportional adjustment $r_p$. The defining feature is the time-amplification above critical:
$$r_p =\begin{cases}k_{\text{crit}} \cdot (T_{\text{crit}} + \beta_t \cdot T) \cdot (U_t - U_{\text{crit}}), & \text{if } U_t > U_{\text{crit}} \\\\[4pt]\min\bigl(0,\ k_{\text{low}} \cdot (U_t - U_{\text{low}})\bigr), & \text{if } U_t \leq U_{\text{crit}}\end{cases}$$
$T_{\text{crit}}$ is the cumulative time utilization has spent above the critical threshold; $T$ is the time since the last update; $\beta_t$ is the time-amplification factor (renamed here from the original $\beta$ to avoid collision with the linear-kink slope). The interest rate updates by accumulating the proportional adjustment:
$$r_i = \max(r_{i-1},\ r_{\text{lin}})$$
$$r_t = \max(r_i + r_p,\ r_{\text{lin}})$$
The time-acceleration is the model's defining feature. Above $U_{\text{crit}}$, the rate grows with both distance from critical and time spent there. Two pools that breach $U_{\text{crit}}$ by the same amount but have spent different cumulative times above $U_{\text{crit}}$ will have different rates — the longer-stressed pool pays more. This is unique among the six models; it explicitly penalizes persistence rather than just magnitude.
$\beta_t$ as a memory parameter. The time-amplification factor $\beta_t$ controls how quickly the time penalty compounds. A small $\beta_t$ ($\approx 0.001\text{–}0.01$) means the time term contributes meaningfully only over many hours of critical utilization; a large $\beta_t$ ($\approx 0.1\text{–}1$) makes the penalty bite within minutes. The choice should be tied to the pool's expected reaction speed: pools with active liquidators and elastic borrowers can tolerate a small $\beta_t$ because the critical condition resolves quickly; pools with slow user response need a larger $\beta_t$ to force resolution before bad debt accumulates.
The four-region calibration problem. Three boundary points ($U_{\text{low}}$, $U_{\text{opt}}$, $U_{\text{crit}}$) and three proportional terms ($k_{\text{lin}}$, $k_{\text{low}}$, $k_{\text{crit}}$) must be set, plus $\beta_t$. Small misplacements of region boundaries cause the model to spend more time in transitional regions than in the steady states it was designed for. If $U_{\text{opt}}$ and $U_{\text{crit}}$ are too close together, the optimal range — where the model is meant to hold rates steady — collapses, and the pool experiences near-continuous rate movement. If $U_{\text{low}}$ and $U_{\text{opt}}$ are too close, the low region disappears and the very-low region's $r_{\text{lin}}$ starts to bind awkwardly against $r_p$.
Frax Variable Rate
Frax combines a linear kink curve with a mechanism that shifts the entire curve based on sustained range violations. The deviation from the optimal range is computed first:
$$\Delta U =\begin{cases}\dfrac{U_{\min} - U_t}{U_{\min}}, & \text{if } U_t < U_{\min} \\\\[6pt]\dfrac{U_t - U_{\max}}{U_{\max}}, & \text{if } U_t > U_{\max}\end{cases}$$
The proportional response combines the rate half-life $I_{0.5}$ with quadratic deviation and elapsed time:
$$D = I_{0.5} + \Delta U^2 \cdot \Delta t$$
The full-utilization rate $IR_{\text{full}}$ — the rate at $U_t = 1$ — is then updated multiplicatively, exactly like Kashi but applied to the curve's maximum rather than the current rate:
$$IR_{\text{full}} =\begin{cases}\max\bigl(IR_{\min},\ IR_t \cdot I_{0.5}/D\bigr), & \text{if } U_t < U_{\min} \quad \text{(curve shifts down)} \\\\[6pt]\min\bigl(IR_{\max},\ IR_t \cdot D/I_{0.5}\bigr), & \text{if } U_t > U_{\max} \quad \text{(curve shifts up)} \\\\[6pt]IR_t, & \text{if } U_t \in [U_{\min}, U_{\max}]\end{cases}$$
Once $IR_{\text{full}}$ is set, the current rate is computed from a linear kink with two segments meeting at $U_{\text{vertex}}$:
$$IR_{\text{vertex}} = (IR_{\text{full}} - IR_{U=0}) \cdot \text{VertexRate} + IR_{U=0}$$
$$IR =\begin{cases}IR_{U=0} + \dfrac{U_t \cdot (IR_{\text{vertex}} - IR_{U=0})}{U_{\text{vertex}}}, & \text{if } U_t \leq U_{\text{vertex}} \\\\[8pt]IR_{\text{vertex}} + (U_t - U_{\text{vertex}}) \cdot (IR_{\text{full}} - IR_{\text{vertex}}), & \text{if } U_t > U_{\text{vertex}}\end{cases}$$
The two-layer structure. Frax separates the shape of the rate curve (a linear kink, defined by $IR_{U=0}$, $U_{\text{vertex}}$, $\text{VertexRate}$, and $IR_{\text{full}}$) from the *position* of the curve, which shifts based on sustained range violations. The shape parameters define the pool's steady-state rate function; the shift mechanism handles regime changes when steady-state assumptions fail.
Why calibration is brittle. Seven interconnected parameters ($U_{\min}$, $U_{\max}$, $U_{\text{vertex}}$, $I_{0.5}$, $IR_{U=0}$, $IR_{\min}$, $IR_{\max}$) must be jointly consistent. Two specific traps recur. First, if $U_{\text{vertex}}$ sits outside $[U_{\min}, U_{\max}]$, the kink lives in a region where the curve is also shifting — and small changes in $U_t$ produce compounding effects from both mechanisms. Standard practice is $U_{\text{vertex}} \approx U_{\max}$. Second, if $\text{VertexRate}$ is too small (say, 0.3), the rate at the kink is much lower than $IR_{\text{full}}$, which means borrowers face a discontinuous-looking rate spike as utilization crosses $U_{\text{vertex}}$ even when $IR_{\text{full}}$ has not shifted. $\text{VertexRate} \approx 0.5\text{–}0.7$ keeps the kink visible without making it punitive on its own.
$I_{0.5}$ as the regime-change clock. The half-life $I_{0.5}$ controls how fast the curve shifts in response to sustained mismatch. In Frax's reference implementation, $I_{0.5} \approx 12$ hours, meaning the curve halves (or doubles) over 12 hours of sustained $\Delta U = 1$ conditions. A shorter half-life makes the model behave more like Kashi (current-rate adjustment dominates); a longer half-life makes the curve-shifting mechanism nearly inert, and the model degrades to a linear kink with extra parameters.
Morpho Adaptive Curve (PD Controller)
Morpho's adaptive curve is a continuous proportional-derivative controller built on top of a linear kink. The error between current and optimal utilization is normalized asymmetrically:
$$\Delta U =\begin{cases}\dfrac{U_t - U_{\text{opt}}}{1 - U_{\text{opt}}}, & \text{if } U_t > U_{\text{opt}} \\\\[6pt]\dfrac{U_t - U_{\text{opt}}}{U_{\text{opt}}}, & \text{if } U_t \leq U_{\text{opt}}\end{cases}$$
The position on the linear kink — the multiplicative factor applied for the curve's current shape — is:
$$c(U) =\begin{cases}(k_d - 1) \cdot \Delta U + 1, & \text{if } U_t > U_{\text{opt}} \\\\[4pt]\left(1 - \dfrac{1}{k_d}\right) \cdot \Delta U + 1, & \text{if } U_t \leq U_{\text{opt}}\end{cases}$$
The scaling factor — the speed at which the curve shifts — uses an exponential of the error integrated over elapsed time:
$$V(t) = \exp(k_p \cdot \Delta U_t \cdot \text{elapsed})$$
The final rate is:
$$IR_t = IR_{t-1} \cdot V(t) \cdot c(U)$$
In the current Morpho Blue implementation, $k_d = 4$ and $k_p = 50$, with $U_{\text{opt}} = 0.9$.
$k_d$ and $k_p$ do different things. $k_d$ controls the shape of the curve at a given moment — it scales the multiplicative factor $c(U)$, so it determines how much the rate moves per unit of utilization error within a single block. $k_p$ controls the speed at which the curve shifts over time — it scales $V(t)$, so it determines how persistently a sustained error compounds into rate changes across blocks. Raising $k_d$ makes the curve steeper now. Raising $k_p$ makes the curve shift faster *over time*. The two failure modes are different: high $k_d$ produces sharp single-block rate jumps; high $k_p$ produces sustained drift even when current utilization is on target.
Why $k_p = 50$ is high. With $k_p = 50$, a sustained $\Delta U = 0.05$ (utilization 0.95 against $U_{\text{opt}} = 0.9$) compounds at rate $\exp(50 \cdot 0.05) = \exp(2.5) \approx 12.2 \times$ per unit of elapsed time (in Morpho's internal units, this corresponds to roughly per-year scaling — within hours the practical effect is multiplicatively significant). The model is designed to make sustained off-target conditions expensive quickly. The cost is that small transient mismatches also feed into $V(t)$, and the exponential form means the response is non-linear in error: doubling $\Delta U$ more than doubles the speed of curve shift.
The single-point target as the source of volatility. Because $\Delta U$ is defined relative to a single point $U_{\text{opt}}$ rather than a range, every block where $U_t \neq U_{\text{opt}}$ generates a non-zero $\Delta U$ and a non-zero curve shift. In a pool with a perfectly elastic borrower base, this is fine — users arbitrage $U_t$ back to $U_{\text{opt}}$ quickly and the curve shifts cancel out over short windows. In a less elastic pool, $U_t$ drifts on its own dynamics, $\Delta U$ accumulates with a sign that depends on whether the drift is above or below $U_{\text{opt}}$, and $V(t)$ drives the curve up or down regardless of whether the drift is structurally meaningful. This is the mechanical source of the wstETH-wETH volatility pattern: not a model error, but the model's PD structure operating on a less elastic pool than $k_p = 50$ was calibrated for.
Calibration: from pool type to parameter values
The parameter postures in Part 1 expressed pool-to-model mappings qualitatively. This section traces those postures back to the joint constraints between parameters — what each value implies about the others, and how the choices interact in practice.
Linear kink for stable-asset core markets. The canonical calibration is $U_{\text{opt}} = 0.85$, $\alpha = 0\%$, $\beta = 7\%$, $\gamma = 250\%$, giving a rate at the kink of 5.95% and a rate at $U_t = 1$ of 43.45%. The binding constraint is the rate at $U_t = 1$: it must be high enough that no borrower can profitably hold positions through a liquidity squeeze, but low enough that it does not destroy the pool's basic functioning. $\gamma = 250\%$ achieves this when $U_{\text{opt}} = 0.85$; if $U_{\text{opt}}$ is moved to 0.9, the rate at $U_t = 1$ falls to $(0\% + 7\% \cdot 0.9 + 250\% \cdot 0.1) = 31.3\%$ — possibly too low, requiring $\gamma$ to be raised to compensate. The lesson is that $U_{\text{opt}}$ and $\gamma$ are jointly constrained by the desired full-utilization rate, and moving one forces a corresponding move in the other.
Linear kink for long-tail assets. For long-tail pools the calibration inverts: $U_{\text{opt}}$ drops to 0.4–0.5, $\gamma$ rises to 500%+, and $\beta$ stays modest. The goal is not to optimize capital efficiency but to discourage utilization from approaching levels at which liquidations cannot exit cleanly. A useful calibration check: at the borrow cap, what is the utilization? If the borrow cap implies $U_t = 0.6$ in normal conditions, $U_{\text{opt}}$ should be set above this so the cap itself does not put the pool into the punitive region of the curve. A common failure pattern is setting $U_{\text{opt}} = 0.45$ alongside a borrow cap that pushes $U_t$ to 0.55 — the pool sits in the punitive region by design, defeating both the cap and the model.
Morpho adaptive curve at high $U_{\text{opt}}$. The reference values ($k_d = 4$, $k_p = 50$, $U_{\text{opt}} = 0.9$) define a specific tradeoff: high target utilization is preserved by accepting that $V(t)$ does substantial work to keep $U_t$ there. For a less elastic borrower base, two adjustments help: lowering $k_p$ to 20–30 reduces the speed at which transient noise drives curve shifts, and lowering $U_{\text{opt}}$ to 0.85 reduces the frequency at which $\Delta U$ triggers a response in the first place. The joint constraint is between $k_p$ and the pool's natural utilization volatility — a noisier pool needs a lower $k_p$, or it pays for that noise in rate volatility. Raising $k_d$ does not help with volatility; it makes the curve steeper, which amplifies rather than dampens noise-driven rate moves.
Frax for stable-rate-with-decisive-response. A canonical calibration is $U_{\min} = 0.75$, $U_{\max} = 0.85$, $U_{\text{vertex}} = 0.85$, $\text{VertexRate} = 0.5$, $I_{0.5} = 12$ hours, $IR_{U=0} = 0\%$, $IR_{\min} = 0\%$, $IR_{\max} = 200\%$. The two operationally critical choices are the range width and $I_{0.5}$. A range of 0.10 (between 0.75 and 0.85) absorbs typical noise without triggering curve shifts; a range narrower than 0.05 is generally too tight for any real pool. $I_{0.5} = 12$ hours means curve shifts compound over operational rather than market timeframes — fast enough to respond to real regime changes within a day, slow enough that hourly noise does not move the curve materially. Shortening $I_{0.5}$ to 1–2 hours changes the model's character entirely, making it behave more like Kashi.
Silo for the critical-utilization risk surface. The defining choice in Silo is $U_{\text{crit}}$, the boundary at which time-amplification activates. A canonical calibration places $U_{\text{crit}}$ at 0.9 with $U_{\text{opt}}$ at 0.8 and $U_{\text{low}}$ at 0.5, giving the optimal range (0.8 to 0.9) room to absorb noise while reserving the time-penalty for sustained 90%+ utilization. $\beta_t$ is the second critical parameter: $\beta_t \approx 0.01$ per hour makes the time term meaningful within 6–12 hours of critical conditions, which matches the operational window in which most lending stress resolves. The joint constraint between $k_{\text{crit}}$ and $\beta_t$ determines how fast the critical penalty bites — high $k_{\text{crit}}$ with low $\beta_t$ produces a sharp but non-escalating penalty; low $k_{\text{crit}}$ with high $\beta_t$ produces a gentle penalty that compounds over time. Most calibrations of Silo-style models err toward the first; the second is more appropriate when the dominant tail risk is persistence rather than magnitude.
Reactive models (Kashi, Euler V1) for elastic borrower bases. Both Kashi and Euler V1 require a borrower base that responds within hours to rate changes; calibration of the half-life parameter ($E$ in Kashi, $dT$-scaled $k_a$ in Euler V1) should match observed empirical response times. For pools with response times measured in days rather than hours, these models systematically lag — by the time rates have moved enough to provoke a response, the condition that triggered them may have resolved on its own. Calibration starting point for Kashi: $E = 8$ hours (the original implementation), tightened to 4 hours for actively arbitraged pools and loosened to 24 hours for slower-moving ones. For Euler V1, $k_d / k_a$ should stay below 1 in noisy pools to prevent the learning component from over-fitting block-level noise.
A Note on Universal Joint Constraint
Every model in this set has at least one parameter that controls how quickly the model responds ($\gamma$, $k_p$, $\beta_t$, $I_{0.5}$, $E$, $k_a$) and at least one that controls how aggressively it responds at a given utilization ($\beta$, $k_d$, $k_{\text{crit}}$, $IR_{\text{full}}$, $\text{VertexRate}$). The most common calibration error across models is treating these two parameters as independent: setting an aggressive level parameter alongside a fast time parameter, producing a model that overreacts within blocks; or setting a gentle level parameter alongside a slow time parameter, producing a model that does nothing useful. The level and time parameters are jointly constrained by the pool's characteristic response time — the timescale over which borrowers and lenders actually move capital in response to rate signals. Calibration that ignores this empirical timescale produces models that look reasonable on paper and behave poorly in production.
Summary: Parameter Values by Pool Type
| Pool type | Model | Reference parameter values | Binding constraint |
|---|---|---|---|
| Stable-asset core markets | Linear kink | $U_{\text{opt}} = 0.85$; $\alpha = 0\%$; $\beta = 7\%$; $\gamma = 250\%$ | Rate at $U_t = 1$ must exceed worst-case borrower benefit from holding through a squeeze; sets $\gamma$ given $U_{\text{opt}}$ |
| Long-tail / new-asset pools | Linear kink | $U_{\text{opt}} = 0.45$; $\alpha = 0\%$; $\beta = 4\%$; $\gamma = 500\%+$ | Borrow cap utilization must sit below $U_{\text{opt}}$; sets $U_{\text{opt}}$ given expected cap utilization |
| Capital efficiency prioritized | Morpho adaptive | $k_d = 4$; $k_p = 50$; $U_{\text{opt}} = 0.9$ | $k_p$ must match elasticity of borrower base; lower $k_p$ (20–30) for less elastic pools |
| Stable rates with decisive response | Frax | $U_{\min} = 0.75$; $U_{\max} = 0.85$; $U_{\text{vertex}} = 0.85$; $\text{VertexRate} = 0.5$; $I_{0.5} = 12$h | Range width $\geq 4\times$ observed utilization volatility; $U_{\text{vertex}} \approx U_{\max}$ |
| Sustained-utilization tail risk | Silo dynamic | $U_{\text{low}} = 0.5$; $U_{\text{opt}} = 0.8$; $U_{\text{crit}} = 0.9$; $\beta_t \approx 0.01$/hr | $k_{\text{crit}}$ and $\beta_t$ jointly determine penalty profile — sharp vs. compounding |
| Elastic borrower bases | Kashi / Euler V1 | Kashi: $U_{\min} = 0.75$, $U_{\max} = 0.85$, $E = 8$h. Euler V1: $k_d / k_a \leq 1$ | Half-life parameter must match empirical borrower response time |
The reference values above are starting points, not recommendations. The work of calibration is the work of estimating, for a given pool, the characteristic response time of its users and the typical magnitude of its utilization noise — and then setting parameters whose joint behavior is consistent with both.