在Aave V3中,借贷利率由市场中每种资产的供求关系决定。因此同一市场中的所有借款人无论抵押品如何,都支付相同的利率。这样是不太公平的,比如A抵押ETH(低风险代币)借出USDC,而B抵押新出的MTK(高风险代币)也借出USDC。他们支付着同样的利息,但所施予系统的风险是不一样的。 而Aave V4的风险溢价机制,借款者除了支付基础利息外,还需要根据抵押品的风险大小支付额外的利息。 > 官方[博客](https://aave.com/blog/aave-v4-risk-premiums)中的例子:如果借入 GHO 的**基础利率 (base rate)** 为 5%,而您使用 WETH 作为抵押品,则您只需支付 5% 的利率,因为 WETH 的**抵押风险 (Collateral Risk)** 为 0%。如果您使用 LINK 作为抵押品(其抵押风险为 30%),则您需要额外支付相当于基础债务 30% 的溢价。如果您使用 UNI 作为抵押品(其抵押风险为 40%),则您需要额外支付相当于基础债务 40% 的溢价。 ![image](https://hackmd.io/_uploads/HyZ3Ne-4-x.png) <br> 来看看合约中,与风险溢价相关的变量。 在Hub合约中,会分别存每个asset的总风险溢价情况,以及对于某个asset所对应的spoke分别的风险溢价情况: ```solidity /// @dev Number of assets listed in the Hub. uint256 internal _assetCount; /// @dev Map of asset identifiers to Asset data. mapping(uint256 assetId => Asset) internal _assets; /// @dev Map of asset identifiers and spoke addresses to Spoke data. mapping(uint256 assetId => mapping(address spoke => SpokeData)) internal _spokes; /// @dev Map of asset identifiers to set of spoke addresses. mapping(uint256 assetId => EnumerableSet.AddressSet) internal _assetToSpokes; /// @dev Set of underlying addresses listed as assets in the Hub. EnumerableSet.AddressSet internal _underlyingAssets; ``` ![image](https://hackmd.io/_uploads/SkcyBebN-l.png) 风险溢价这部分所对应的债务由 `premiumShares` 和 `premiumOffsetRay` 两变量计算而来。而premiumShares 占基础债务(即drawnShares)的比例, 即为**riskPremium** (RP),该数值反映了整体的风险情况。 <br> 在Spoke合约中,用户每个资产仓位存储着风险溢价债务,以及总仓位宏观的riskPremium。另外,spoke中每个资产对应一个collateralRisk (CR)配置,反映着该资产的风险大小(0%表示最低风险,最高风险为1000%)。 ![image](https://hackmd.io/_uploads/rJI-Bxb4We.png) 变量的关联为:collateralRisk 结合用户的抵押借款情况,得出用户的 riskPremium。而风险溢价债务数据在更新时,需要依据 riskPremium。 <br> riskPremium的计算示例: 某用户存入的抵押品有:价值5000美元的ETH ($CR_{ETH}$ = 0%), 价值5000美元的wstETH ($CR_{wstETH}$ = 10%) 和价值1000美元的CRV ($CR_{CRV}$ = 100%) 然后,该用户借出了价值8000美元的USDT。此时,该用户的RP应该为多少? 首先,找出哪部分抵押品刚好可以覆盖债务。根据抵押品的风险从小到大排序,依次进行覆盖。可知,5000美元的ETH和3000美元的wstETH可以覆盖8000美元的债务。 因此,RP = (5000 * 0% + 3000 * 10%) / 8000 = 3.75% <br> 根据该计算机制,可知会导致riskPremium改变的行为有: - 用户增加抵押品; - 用户减少抵押品; - 用户借款; - 用户偿还借款; - 仓位被清算; 正常来说,当用户的RP改变时,应当更新用户各个仓位`premiumShares` 和 `premiumOffsetRay` 数值,使得按照最新的风险情况来计算溢价。 <br> 先说说溢价的计算,溢价债务: **Premium Debt = premiumShare * drawnIndex - premiumOffset** premiumOffset字段作为偏移量,用于计算在index增长过程中,premiumShare对应的债务增量。 ![image](https://hackmd.io/_uploads/S1i_SxbVZg.png) > 关于PremiumOffset另外的一个理解角度:每一份share的记录都会对应资产的转移,当用户供应时,用户转入代币,spoke中会记录对应supplyShare。当用户借款时,spoke转出代币,也会记录borrowShare。而在记录premiumShare时,并不需要代币转移,但需要记录,因此就有了premiumOffset > <br> 上面提到,正常来说,当用户的抵押品或债务改变时,应该更新riskPremium,同时更新各个仓位的`premiumShares` 和 `premiumOffsetRay` 。但实际情况会比较复杂。 在这条[PR](https://github.com/aave/aave-v4/pull/1037)中提到,只有RP明显恶化时,才会进行更新,而对于RP改善的情况,则是希望用户自行调用相关函数去更新。 通过阅读代码得知: 1. 供应抵押品不会有任何相关操作; 2. 提出抵押品、借款,会更新用户的RP,也会更新溢价share和offset; 3. 而偿还债务,因为规定是优先偿还溢价债务,所以溢价share和offset必然会改变。但改变时所依据的RP是旧的,而不是在此次偿还后新的抵押债务结构所对应的RP。当然,RP也没有更新。 4. 用户仓位被清算时,会更新RP和溢价share/offset。但清算这步应该是存在有RP改善的情况,涉及着一个不等式; 5. 另外,让我疑惑的是,用户动态风险配置的更新,同时也会更新RP和溢价share/offset。这和前面的想法有些不符。 <br> 参考: 1. https://aave.com/blog/aave-v4-risk-premiums 2. https://github.com/aave/aave-v4/blob/main/docs/overview.md#risk-premium 3. https://governance.aave.com/t/aave-v4-new-features-and-risk-parameter-analysis/23443#p-59818-h-3-risk-premiums-23 4. https://github.com/aave/aave-v4/pull/1037 5. https://github.com/aave/aave-v4/pull/801