当前位置: 首页 > news >正文

aave v3 资产状态更新(updateState)合约代码解析

我们知道aave是基于流动性指数(liquidityIndex )和可变借款指数( variableBorrowIndex )来计算用户的存款利息和借款利息的,在理解此方法之前需要先阅读aave v3 存款与借款利息的计算方式这篇文章。每次有借贷,还款,存取,清算,等操作都会触发利率的变化,而updateState这个合约函数就是专门处理这一环节的,在借贷,还款,存取,清算这些操作执行前都要把状态更新成最新的。

  function updateState(DataTypes.ReserveData storage reserve,DataTypes.ReserveCache memory reserveCache) internal {// If time didn't pass since last stored timestamp, skip state update//solium-disable-next-lineif (reserveCache.reserveLastUpdateTimestamp == uint40(block.timestamp)) {return;}_updateIndexes(reserve, reserveCache);_accrueToTreasury(reserve, reserveCache);//solium-disable-next-linereserve.lastUpdateTimestamp = uint40(block.timestamp);reserveCache.reserveLastUpdateTimestamp = uint40(block.timestamp);}

_updateIndexes部分在aave v3 存款与借款利息的计算方式这篇文章中已经解析过,这里不再赘述。我们直接看_accrueToTreasury;

  function _accrueToTreasury(DataTypes.ReserveData storage reserve,DataTypes.ReserveCache memory reserveCache) internal {if (reserveCache.reserveFactor == 0) {return;}// debt accrued is the sum of the current debt minus the sum of the debt at the last update// Rounding down to undermint to the treasury and keep the invariant healthy.uint256 totalDebtAccrued = reserveCache.currScaledVariableDebt.rayMulFloor(reserveCache.nextVariableBorrowIndex - reserveCache.currVariableBorrowIndex);uint256 amountToMint = totalDebtAccrued.percentMul(reserveCache.reserveFactor);if (amountToMint != 0) {reserve.accruedToTreasury += amountToMint.getATokenMintScaledAmount(reserveCache.nextLiquidityIndex).toUint128();}}

这个方法是向协议累积收益的核心函数。将借贷利息的一部分分配给协议 ,这是 Aave 的收入来源机制。

第一步检查储备因子reserveFactor 如果为 0,则直接返回 这个参数存储在ReserveConfigurationMap 第64位(详情见状态存储)

第二步计算本次借出多少钱
reserveCache.currScaledVariableDebt 表示当前所有被借出的可变利率债务的缩放后总金额

总累积债务利息 = 当前缩放债务 × (新借款指数 - 旧借款指数)

上面公式可能不太好理解,我们拆分一下:

  • 上次更新时总共借出的本息= 当前缩放债务×旧借款指数
  • 本次更新后总共借出的本息 =  当前缩放债务×新借款指数
  • 二者的差值代表从上次更新状态到目前位置产生了多少新的利息(这个方法是存取,借贷之前前进行处理的方法,还没有对本金进行处理,所以这里的差值只是利息)

reserveFactor (储备因子)是Aave协议中用于控制协议收入比例的参数。

协议收入 = 累积债务利息 × reserveFactor

最后由于利润会转变为储蓄,所以要通过当前的储蓄利息指数转换再累加到协议的总收入上

reserve.accruedToTreasury += amountToMint.getATokenMintScaledAmount(reserveCache.nextLiquidityIndex).toUint128();

累加的金额需要先将实际金额转换为aToken的缩放金额

  • amountToMint :需要铸造到金库的实际金额(以基础资产为单位,如DAI)
  • reserveCache.nextLiquidityIndex :下一个流动性指数,用于缩放计算
  • getATokenMintScaledAmount :来自TokenMath库的方法,计算公式为:

缩放金额 = 实际金额 ÷ 流动性指数

http://www.dtcms.com/a/614819.html

相关文章:

  • 淄博外贸网站建设公司wordpress首页调用文章多张图片
  • 自适应网站模板公司网站建设 趋势
  • 前端无障碍开发资源,WCAG指南与工具
  • 【前端学习】React学习【万字总结】
  • 前端无障碍开发标准,WCAG 2.2新特性
  • 人形机器人应用于职业教育与实训,以及素养课题设计与知识图谱动态更新
  • 人力资源网站怎么建设网站不想备案
  • 建设网站的文案范文深圳高端logo设计公司
  • 前端微前端架构设计,应用间通信 前端微前端架构设计:应用间通信的实践与挑战
  • 短讯 | 利用开源 Galaxy 平台简化临床细菌全基因组测序数据分析
  • 基于单片机的智慧校园自动打铃系统设计
  • 网站群建设管理规定做公司+网站建设价格
  • 搭建网站用服务器还是虚拟主机百度站长平台清退
  • 技术演进中的开发沉思-192 JavaScript: 发展历程(下篇)
  • 视频网站seo怎么做青海做网站的公司
  • 反编译使用易语言工具详细解析与实践指南
  • Android Navigation 组件(用于Fragment间的跳转)
  • 旅游做视频网站产品宣传网站开发
  • 常州做企业网站如何做好产品网络推广
  • 【具身智能】深入理解3D旋转:从欧拉角、万向锁到四元数与插值算法SLERP
  • 城市建设网站设计代码生成器在线
  • 浏览器中内嵌一个浏览器
  • 深圳网站建设推广方法赣州优化公司
  • 【模板】组合数(牛客)
  • 微信电影网站怎么做凡客网上商城
  • 《硬件学习杂记A》成为AI时代更全面的自己
  • VS2013编译C语言 | 如何在VS2013中编译C语言程序并解决常见问题
  • 怎么用自己电脑做网站服务器网址大全2345qiren
  • 建设网站需要学什么网上查公司怎么查
  • 企业网站模板cms南昌的网站推广公司