DeFi における金利
Compound, AAVE などの lending pool を想定します.
金利は, 主に基本は供給(貸し手)と需要(借り手)の pool 残高の割合できまります.
利用率が低い(貸し手が多いが, 借り手が少ない)と, 金利は低いです.
利用率が高いと金利は高くなります.
Compound, AAVE では, 金利のカーブを kined(共起?) model(2つの線形の金利モデルで, 利用率が高くなると金利上昇が高くなる)にすることで,
利用率が高い場合は借り手は金利が高くなるので返そうとするインセンティブが働き, 貸し手は金利が高いのでより供給を行おうというインセンティブが働くことで, 最適な利用率(optimal utilization. たとえば USDC だと 90% くらい)に収れんするのを期待しています.
また, 各ユーザー単位では, 借入率(利用率)が高くなりすぎると担保割れになり清算(liquidation)が発生します. 担保割れになるとペナルティ(借り手が貸し手に借入の 5% 支払いなど)が発生するので, 利用率が高い状態では借り手はより早めに返済したくなります.
このルールも利用することで, プール全体としては最適な利用率に収斂するのを狙っているようです.
risk-free rate
ステーブルコインの場合は, そのペッグしている通貨の risk-free rate(国債で運用などからのほぼリスクゼロで得られる金利)も考慮しています.
その他詳細
Towards Understanding Flash Loan and Its Applications in DeFi Ecosystem
https://arxiv.org/abs/2010.12252
に金利モデルの解説があります.
実装
実装としては, 金利は debt token(負債トークン)を発行(mint)することで実現しているようです.
Compound
1 block(ethereum だと平均 15 秒)で供給の割合を計算して金利を計算します.
Rate = cToken.supplyRatePerBlock(); // Integer
Rate = 37893566
ETH Mantissa = 1 * 10 ^ 18 (ETH has 18 decimal places)
Blocks Per Day = 4 * 60 * 24 (based on 4 blocks occurring every minute)
Days Per Year = 365
APY = ((((Rate / ETH Mantissa * Blocks Per Day + 1) ^ Days Per Year - 1)) - 1) * 100
金利などの履歴は API で取得できます.
AAVE
AAVE も, 基本は Compound と同じようにブロック単位で金利を計算します(variable rate)
AAVE では, この変動金利(variable rate)に加えて, stable 金利(stable rate)があります.
stable 金利はスキャンしている platform(compound とか他の lending pool?)の金利から重み平均で求めています.
stable 金利は借入期間中ずっと固定ではなく, 状況によって変更になります.
stable 金利が変更になる条件
Utilization が 95% を超え, かつ時系列での重み付き APY が 25%(レートは config で設定) 以下の場合
(利用率は高いが, stable rate での借り手がおらず貸し手が十分な金利を得ていない場合)
詳細はコードをみるのがよいでしょう.