我正在从事一个项目,其中涉及跟踪和收回AAVE收益率的链,同时保持原来的存款余额。我搞不懂如何在特定的时间点精确计算AAVE的产量。我最初的方法是只保存存款量,然后通过以下方法计算收益:
产量= aToken_balance - deposited_amount
但这似乎行不通。我发现,在计算了这个收益率后,如果我们试图提取这个价值,我们得到的aToken余额就会低于我们的初始存款量。我知道aTokens有动态的供给/平衡,但必须有一种方法来精确计算:“我现在有X钱”
我正在多边形Mainnet的一个分叉上进行测试,我想知道它是否与我的测试环境有关(例如,在没有人真正与AAVE交互的主板上模拟时间传递)?下面是测试合同和问题的截图。任何见解都是非常感谢的。
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;
}
}


发布于 2022-09-29 06:38:06
如果我没记错。Aave使用索引来跟踪aToken的值。
步骤1,撤回索引
(, , , , , , ,uint256 liquidityIndex, , ) = IdataProvider.getReserveData(asset_address);这应该返回一个射线的数字。
第二步,检索您的比例平衡。
uint256 scaledBalance = AToken(asset_address).scaledBalanceOf(address(this));第三步,做数学运算得到你的当前值。
uint256 value_now = (scaledBalance * liquidityIndex) * 1e18 / 1e27;https://ethereum.stackexchange.com/questions/136530
复制相似问题