Most of the time, is the total deposits into the stabilityPool > 1, the utilisationRate will be higher than target.
It means that very soon it will reach the max emission rate, and max emission rate will be used during the minting
pragma solidity ^0.8.19;
import {Test, console} from "lib/forge-std/src/Test.sol";
import "contracts/core/pools/LendingPool/LendingPool.sol";
import "contracts/core/tokens/RToken.sol";
import "contracts/core/tokens/DebtToken.sol";
import "contracts/core/tokens/RAACNFT.sol";
import "contracts/core/tokens/RAACToken.sol";
import "contracts/core/minters/RAACMinter/RAACMinter.sol";
import "contracts/core/pools/StabilityPool/StabilityPool.sol";
import "contracts/core/tokens/DEToken.sol";
interface ITokenERC20{
function approve(address spender, uint256 amount) external returns (bool);
function balanceOf(address account) external view returns (uint256);
}
contract ArsenTest is Test{
RToken public rToken;
DebtToken public dToken;
RAACNFT public raacNFT;
RAACToken public raacToken;
DEToken public deToken;
RAACMinter public raacMinter;
HousePrices public housePrices;
PriceOracle public priceOracle;
LendingPool public lendingPool;
StabilityPool public stabilityPool;
address public attacker = address(8888);
address public user_1 = address(1111);
address public user_2 = address(2222);
address CRV_USD = address(0xf939E0A03FB07F59A73314E73794Be0E57ac1b4E);
string ETH_RPC_URL = "https://mainnet.infura.io/v3/2cef90f9f3f44a1fb5201d8547183d42";
function setUp() public{
uint256 ethFork = vm.createFork(ETH_RPC_URL);
vm.selectFork(ethFork);
housePrices = new HousePrices();
priceOracle = new PriceOracle();
rToken = new RToken(
"rToken",
"RTOKEN",
address(this),
CRV_USD
);
dToken = new DebtToken(
"Debt Token",
"DBTTOKEN",
address(this)
);
raacNFT = new RAACNFT(
CRV_USD,
address(housePrices),
address(this)
);
raacToken = new RAACToken(
address(this),
500,
500
);
deToken = new DEToken(
"DeToken",
"deToken",
address(this),
address(rToken)
);
lendingPool = new LendingPool(
CRV_USD,
address(rToken),
address(dToken),
address(raacNFT),
address(priceOracle),
100000000000000000000000000
);
stabilityPool = new StabilityPool(address(this));
raacMinter = new RAACMinter(
address(raacToken),
address(stabilityPool),
address(lendingPool),
address(this)
);
stabilityPool.initialize(
address(rToken),
address(deToken),
address(raacToken),
address(raacMinter),
CRV_USD,
address(lendingPool)
);
rToken.setReservePool(address(lendingPool));
dToken.setReservePool(address(lendingPool));
}
function test_deposit() public{
deToken.setStabilityPool(address(stabilityPool));
raacToken.setMinter(address(raacMinter));
rToken.testMint(user_1);
rToken.testMint(user_2);
vm.startPrank(user_1);
rToken.approve(address(stabilityPool), 100e18);
stabilityPool.deposit(1e18);
vm.stopPrank();
console.log("The current utilisationRate after the first deposit is", raacMinter.getUtilizationRate());
console.log("The current utilisation target is,", raacMinter.utilizationTarget());
while(raacMinter.emissionRate() != raacMinter.maxEmissionRate()){
vm.prank(user_1);
stabilityPool.deposit(1e18);
vm.warp(raacMinter.lastEmissionUpdateTimestamp() + raacMinter.emissionUpdateInterval());
raacMinter.updateEmissionRate();
}
console.log("Current emission rate is", raacMinter.getEmissionRate());
while(deToken.totalSupply() != 1e18){
vm.prank(user_1);
stabilityPool.withdraw(1e18);
}
console.log("Current emission rate is", raacMinter.getEmissionRate());
}
contract HousePrices{
function tokenToHousePrice(uint256 _tokenId) external view returns (uint256){
return 10_000e18;
}
}
contract PriceOracle{
function getLatestPrice(uint256 _tokenId) external view returns (uint256, uint256){
return(10_000e18, block.timestamp);
}
}