Olive Docs
Liquidity Pool

Interest Rates and Utilization

Everything is 100% collateralized. When the liquidity pool sells you a call option, it locks in one SOL for every call option. It is impossible for the liquidity pool to default. Olive only sells covered calls and cash-secured puts, so the liquidity pool always locks enough collateral in the custody account to make sure there is zero risk of default.

Fixed rates are used for options and expiry futures. Once you buy an option or expiry future, you lock in that fixed rate. You can only sell back to the liquidity pool in that fixed rate.

Variable rates are used for perpetual futures. Each custody keeps a cumulative borrow-rate index. Long perps snapshot the underlying custody index. Short perps snapshot the USDC custody index. Borrow fees are realized lazily when a keeper or user touches a borrow-fee path, such as updating borrow fees, changing collateral, closing, liquidating, or executing TP/SL.

Variable Rates and Utilization

The ratio of locked assets to pool-owned assets is called the utilization ratio U. Pending limit-order escrow is excluded from pool-owned assets, so escrowed user funds cannot be counted as free liquidity or depress the displayed utilization. The variable interest-rate function is a nonlinear stress curve with a kink at optimal utilization. The curve is linear before the kink and squared after the kink.

rvariable(U)={rmin+(rkinkrmin)UUkink,0UUkink,rkink+(rmaxrkink)(UUkink1Ukink)2,Ukink<U1.r_\text{variable}(U)= \begin{cases} r^{\min}+\left(r^{\text{kink}}-r^{\min}\right)\dfrac{U}{U_{\text{kink}}}, & 0\le U\le U_{\text{kink}},\\ r^{\text{kink}}+\left(r^{\max}-r^{\text{kink}}\right) \left(\dfrac{U-U_{\text{kink}}}{1-U_{\text{kink}}}\right)^2, & U_{\text{kink}}<U\le 1. \end{cases}

The squared term makes the post-kink portion rise slowly at first, then sharply as utilization approaches 100%.

On chain:

U=custody.token_lockedcustody.token_ownedcustody.pending_escrowU=\frac{\text{custody.token\_locked}}{\text{custody.token\_owned}-\text{custody.pending\_escrow}}

Each custody then advances its borrow index by:

ΔI=rvariable(U)Δt\Delta I = r_\text{variable}(U)\cdot\Delta t

Perpetual borrow fees are charged from the index delta, not from a single current-rate snapshot:

Δborrow_fee=entry_notional(IcurrentIposition snapshot)10,000365 days\Delta\text{borrow\_fee} = \frac{\text{entry\_notional}\cdot\left(I_\text{current}-I_\text{position snapshot}\right)} {10{,}000\cdot365\text{ days}}

This makes borrow-fee accrual path-independent: if utilization changes while a perp is open, the position pays the weighted history of the relevant custody index.

Default Variable Rate Curves

Custody typer_minr_kinkr_maxU_kink
USDC / stable custody2%15%80%80%
SOL / volatile custody8%35%160%80%
80% kinkUtilizationAPR0%20%40%60%80%100%0%30%60%90%120%150%180%USDC: 2% → 15% → 80%SOL / volatile: 8% → 35% → 160%

Fixed Rates and 2D Utilization

For the fixed rate, Olive uses a rational saturation premium on top of the current per-custody variable rate. Calls and long expiry futures use the underlying custody side. Puts and short expiry futures use the USDC custody side.

premiumbps=round_half_up(βbpsU2d,bpstseconds10,000(tseconds+τseconds))\mathrm{premium}_{bps} = \operatorname{round\_half\_up} \left( \frac{ \beta_{bps}\cdot U_{2d,bps}\cdot t_{seconds} }{ 10{,}000\cdot(t_{seconds}+\tau_{seconds}) } \right) rfixed,bps=rvariable,bps(U)+premiumbpsr_{\text{fixed},bps} = r_{\text{variable},bps}(U) + \mathrm{premium}_{bps}

Where:

  • r_variable(U) is the current variable interest rate
  • beta_bps is the fixed-rate premium scaling factor
  • U_2d_bps is the current 2D utilization of the custody side
  • tau_seconds is the average expiry of live fixed-rate exposure on that custody side
  • t_seconds is the quoted position time to expiry

The premium is calculated with one integer division and one round-half-up operation. If t_seconds, beta_bps, or U_2d_bps is zero, the premium is zero. If tau_seconds is zero and the other inputs are nonzero, the premium saturates to its maximum value.

Shorter average expiry tau makes the premium saturate faster. Longer average expiry tau makes the premium saturate more slowly. The computation of tau and 2D utilization is unchanged.

The smart contract tracks fixed-rate exposure per custody in native units:

  • live_exposure_native is the currently live fixed-rate exposure for that custody side
  • time_value_native is exposure multiplied by remaining seconds to expiry
  • tau_seconds = time_value_native / live_exposure_native
  • U_2d is computed from time_value_native, pool-owned custody assets, and one protocol year

Liquidity taken represents the total amount of liquidity reserved by financial instruments that expire at a certain date. The 2D utilization is calculated by:

U2d=time_value_nativepool-owned custody assets365 daysU_{2d} = \frac{\text{time\_value\_native}}{\text{pool-owned custody assets}\cdot365\text{ days}}

The average expiry tau is:

τ  =  i=1nOIi(Tit0)i=1nOIi\tau \;=\; \frac{\sum_{i=1}^{n} \mathrm{OI}_i \,(T_i - t_0)}{\sum_{i=1}^{n} \mathrm{OI}_i}

Where:

  • OI_i is the native fixed-rate exposure of the expiry instrument
  • T_i is the expiry date of the instrument
  • t_0 is the current time

On this page