APY

Annual Percentage Yield

Borrow APY

[IRM(utilization_rate) / slots_per_year + 1] ^ slots_per_year

let slot_interest_rate = current_borrow_rate.try_div(SLOTS_PER_YEAR)?;
let compounded_interest_rate = Rate::one()
     .try_add(slot_interest_rate)?
     .try_pow(slots_elapsed)?;
 self.cumulative_borrow_rate_wads = self
     .cumulative_borrow_rate_wads
     .try_mul(compounded_interest_rate)?;
self.borrowed_amount_wads = self
     .borrowed_amount_wads
     .try_mul(compounded_interest_rate)?;
      Ok(())

Supply APY

(borrow_apy - platform_profit) / (total_borrow / total_supply)

IRM

// Calculate the current borrow rate
    pub fn current_borrow_rate(&self) -> Result<Rate, ProgramError> {
        let utilization_rate = self.liquidity.utilization_rate()?;
        let optimal_utilization_rate = Rate::from_percent(self.config.optimal_utilization_rate);        
        let low_utilization = utilization_rate < optimal_utilization_rate;
        if low_utilization || self.config.optimal_utilization_rate == 100 {
            let normalized_rate = utilization_rate.try_div(optimal_utilization_rate)?
            let min_rate = Rate::from_percent(self.config.min_borrow_rate);
            let rate_range = Rate::from_percent(
                self.config
                    .optimal_borrow_rate
                    .checked_sub(self.config.min_borrow_rate)
                    .ok_or(LendingError::MathOverflow)?,
            );
            Ok(normalized_rate.try_mul(rate_range)?.try_add(min_rate)?)
        } else {
            let normalized_rate = utilization_rate
                .try_sub(optimal_utilization_rate)?
                .try_div(Rate::from_percent(
                    100u8
                        .checked_sub(self.config.optimal_utilization_rate)
                        .ok_or(LendingError::MathOverflow)?,
                ))?;
            let min_rate = Rate::from_percent(self.config.optimal_borrow_rate);
            let rate_range = Rate::from_percent(
                self.config
                    .max_borrow_rate
                    .checked_sub(self.config.optimal_borrow_rate)
                    .ok_or(LendingError::MathOverflow)?,
            );
  
            Ok(normalized_rate.try_mul(rate_range)?.try_add(min_rate)?)  
         }  
     }

Last updated