关于aave aToken的一点问题

  function withdraw(
    address asset,
    uint256 amount,
    address to
  ) external override whenNotPaused returns (uint256) {
    DataTypes.ReserveData storage reserve = _reserves[asset];

    address aToken = reserve.aTokenAddress;

    uint256 userBalance = IAToken(aToken).balanceOf(msg.sender);

    uint256 amountToWithdraw = amount;

    if (amount == type(uint256).max) {
      amountToWithdraw = userBalance;
    }

    ValidationLogic.validateWithdraw(
      asset,
      amountToWithdraw,
      userBalance,
      _reserves,
      _usersConfig[msg.sender],
      _reservesList,
      _reservesCount,
      _addressesProvider.getPriceOracle()
    );

    reserve.updateState();

    reserve.updateInterestRates(asset, aToken, 0, amountToWithdraw);

    if (amountToWithdraw == userBalance) {
      _usersConfig[msg.sender].setUsingAsCollateral(reserve.id, false);
      emit ReserveUsedAsCollateralDisabled(asset, msg.sender);
    }

    IAToken(aToken).burn(msg.sender, to, amountToWithdraw, reserve.liquidityIndex);

    emit Withdraw(asset, msg.sender, to, amountToWithdraw);

    return amountToWithdraw;
  }

如代码所示,如果我要取回所有的抵押资产,也就是userBalance,此时scaled balance计算的流动性指数为NI_t_old,在reserve.updateState()后,我们的流动性指数变成了NI_t_new,这不就意味着在burn aToken的时候,又生了一次息,燃烧的scaled amount永远小于userBalance,aToken的余额永远不会是0

请先 登录 后评论

1 个回答

张小风
请先 登录 后评论
  • 0 关注
  • 0 收藏,1005 浏览
  • tegertooornil 提出于 2023-11-16 19:28