首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >链上AAVE收率的计算

链上AAVE收率的计算
EN

Ethereum用户
提问于 2022-09-29 02:22:54
回答 1查看 181关注 0票数 1

我正在从事一个项目,其中涉及跟踪和收回AAVE收益率的链,同时保持原来的存款余额。我搞不懂如何在特定的时间点精确计算AAVE的产量。我最初的方法是只保存存款量,然后通过以下方法计算收益:

产量= aToken_balance - deposited_amount

但这似乎行不通。我发现,在计算了这个收益率后,如果我们试图提取这个价值,我们得到的aToken余额就会低于我们的初始存款量。我知道aTokens有动态的供给/平衡,但必须有一种方法来精确计算:“我现在有X钱”

我正在多边形Mainnet的一个分叉上进行测试,我想知道它是否与我的测试环境有关(例如,在没有人真正与AAVE交互的主板上模拟时间传递)?下面是测试合同和问题的截图。任何见解都是非常感谢的。

代码语言:javascript
复制
pragma solidity ^0.8.4;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "./IPool.sol";

contract AaveTest2 {
    IPool public aavePoolManager = IPool(0x794a61358D6845594F94dc1DB02A252b5b4814aD);
    address public usdc = 0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174;
    address public ausdc = 0x625E7708f30cA75bfd92586e17077590C60eb4cD;
    address public dai = 0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063;
    address public adai = 0x82E64f49Ed5EC1bC6e43DAD4FC8Af9bb3A2312EE;

    uint public totalStakedUSDC;
    uint public totalStakedDAI;

    constructor() {}


    function aaveDepositUSDC(uint amount) public {
        IERC20(usdc).approve(address(aavePoolManager), amount);
        aavePoolManager.supply(usdc, amount, address(this), 0);
        totalStakedUSDC += amount;
    }

    function calculateYieldUSDC() public view returns (uint) {
        uint yield = IERC20(ausdc).balanceOf(address(this)) - totalStakedUSDC;
        return yield;
    }
    
    function withdrawYieldUSDC() public {
        uint yield = calculateYieldUSDC();
        aavePoolManager.withdraw(usdc, yield, address(this));
    }

    function withdrawUSDC(uint amount) public {
        aavePoolManager.withdraw(usdc, amount, address(this));
        totalStakedUSDC -= amount;
    }

    function aaveDepositDAI(uint amount) public {
        IERC20(dai).approve(address(aavePoolManager), amount);
        aavePoolManager.supply(dai, amount, address(this), 0);
        totalStakedDAI += amount;
    }

    function calculateYieldDAI() public view returns (uint) {
        uint yield = IERC20(adai).balanceOf(address(this)) - totalStakedDAI;
        return yield;
    }
    
    function withdrawYieldDAI() public {
        uint yield = calculateYieldDAI();
        aavePoolManager.withdraw(dai, yield, address(this));
    }

    function withdrawDAI(uint amount) public {
        aavePoolManager.withdraw(dai, amount, address(this));
        totalStakedDAI -= amount;
    }
}
EN

回答 1

Ethereum用户

回答已采纳

发布于 2022-09-29 06:38:06

如果我没记错。Aave使用索引来跟踪aToken的值。

步骤1,撤回索引

代码语言:javascript
复制
(, , , , , , ,uint256 liquidityIndex, , ) = IdataProvider.getReserveData(asset_address);

这应该返回一个射线的数字。

第二步,检索您的比例平衡。

代码语言:javascript
复制
uint256 scaledBalance = AToken(asset_address).scaledBalanceOf(address(this));

第三步,做数学运算得到你的当前值。

代码语言:javascript
复制
uint256 value_now = (scaledBalance * liquidityIndex) * 1e18 / 1e27;
票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/136530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档