Appearance
Utilization-Based Interest Rates
Borrow APR increases as pool utilization rises. As a pool becomes more utilized, borrowing becomes more expensive and supplying becomes more attractive. This encourages repayments and new supply, pushing utilization back toward a healthy band without manual intervention.
Borrow APR
Alula uses a kinked interest rate model with two kink points. Borrow APR is a piecewise-linear function of utilization.
Below the first kink
If U < U_k1:
BorrowAPR = BaseAPR + (U/U_k1) × (APR_k1 - BaseAPR)
Between the kinks
If U ∈ [U_k1, U_k2):
BorrowAPR = APR_k1 + [(U - U_k1)/(U_k2 - U_k1)] × (APR_k2 - APR_k1)
Above the second kink
If U ≥ U_k2:
BorrowAPR = APR_k2 + [(U - U_k2)/(1 - U_k2)] × (APR_max - APR_k2)
Per-second borrow rate
BorrowRate_per_second = BorrowAPR / SECONDS_IN_YEAR
Legend
U: utilization ratio, defined as total borrowed amount / total supplied liquidityU_k1: utilization at the 1st kink pointU_k2: utilization at the 2nd kink pointBaseAPR: base APR that is always presentAPR_k1: borrow APR at U_k1APR_k2: borrow APR at U_k2APR_max: maximum borrow APR at U = 1
Constraints
0 < U_k1 <= U_k2 <= 1BaseAPR ≤ APR_k1 ≤ APR_k2 ≤ APR_max
Reactive Interest Rate Modifier
In addition to the kinked interest rate model, each pool has a reactive interest rate modifier that creates a feedback loop to steer utilization toward a target level.
Configuration
Each pool's PoolConfig includes:
target_utilization_ratio_bps: the desired utilization ratio expressed in basis pointsinterest_rate_modifier: a multiplier applied to the base borrow APRir_reactivity_constant: a value in the range 0–100 that controls how aggressively the modifier reacts to deviations from the target utilization
Feedback Loop
The modifier adjusts dynamically based on the relationship between current utilization and the target:
- When utilization exceeds the target, the modifier increases, making borrowing more expensive and incentivizing repayments.
- When utilization is below the target, the modifier decreases, making borrowing cheaper and incentivizing new borrows.
The ir_reactivity_constant determines the speed and magnitude of these adjustments. A higher value produces faster, more aggressive corrections; a lower value produces smoother, more gradual changes.
Bounds
The modifier is bounded to prevent extreme outcomes:
- Minimum: 0.1× (
MIN_IR_MODIFIER= 1,000 bps) - Maximum: 10× (
MAX_IR_MODIFIER= 100,000 bps)
Final Borrow APR
The final borrow APR applied to borrowers is:
FinalBorrowAPR = BaseBorrowAPR × interest_rate_modifier / 10000
where BaseBorrowAPR is the rate computed by the kinked interest rate model described above, and interest_rate_modifier is expressed in basis points (10,000 bps = 1×).