The user tokens are transferred to the RToken contract and RTokens are minted in return.
pragma solidity ^0.8.13;
import {Test, console} from "forge-std/Test.sol";
import {IERC20} from "lib/forge-std/src/interfaces/IERC20.sol";
import {IERC721} from "lib/forge-std/src/interfaces/IERC721.sol";
import {LendingPool} from "contracts/core/pools/LendingPool/LendingPool.sol";
import {StabilityPool} from "contracts/core/pools/StabilityPool/StabilityPool.sol";
import {MarketCreator} from "contracts/core/pools/StabilityPool/MarketCreator.sol";
import {NFTLiquidator} from "contracts/core/pools/StabilityPool/NFTLiquidator.sol";
import {FeeCollector} from "contracts/core/collectors/FeeCollector.sol";
import {Treasury} from "contracts/core/collectors/Treasury.sol";
import {DebtToken} from "contracts/core/tokens/DebtToken.sol";
import {DEToken} from "contracts/core/tokens/DEToken.sol";
import {IndexToken} from "contracts/core/tokens/IndexToken.sol";
import {LPToken} from "contracts/core/tokens/LPToken.sol";
import {RAACNFT} from "contracts/core/tokens/RAACNFT.sol";
import {RAACToken} from "contracts/core/tokens/RAACToken.sol";
import {RToken} from "contracts/core/tokens/RToken.sol";
import {veRAACToken} from "contracts/core/tokens/veRAACToken.sol";
import {RAACHousePrices} from "contracts/core/primitives/RAACHousePrices.sol";
import {RAACMinter} from "contracts/core/minters/RAACMinter/RAACMinter.sol";
import {RAACReleaseOrchestrator} from "contracts/core/minters/RAACReleaseOrchestrator/RAACReleaseOrchestrator.sol";
import {BoostController} from "contracts/core/governance/boost/BoostController.sol";
import {BaseGauge} from "contracts/core/governance/gauges/BaseGauge.sol";
import {GaugeController, IGaugeController} from "contracts/core/governance/gauges/GaugeController.sol";
import {RAACGauge} from "contracts/core/governance/gauges/RAACGauge.sol";
import {RWAGauge} from "contracts/core/governance/gauges/RWAGauge.sol";
import {Governance} from "contracts/core/governance/proposals/Governance.sol";
import {TimelockController} from "contracts/core/governance/proposals/TimelockController.sol";
import {BaseChainlinkFunctionsOracle} from "contracts/core/oracles/BaseChainlinkFunctionsOracle.sol";
import {RAACHousePriceOracle} from "contracts/core/oracles/RAACHousePriceOracle.sol";
import {RAACPrimeRateOracle} from "contracts/core/oracles/RAACPrimeRateOracle.sol";
contract RAACTest is Test {
DebtToken debtToken;
DEToken deToken;
IndexToken indexToken;
LPToken lpToken;
RAACNFT raacNFT;
RAACToken raacToken;
RToken rToken;
veRAACToken veRaacToken;
LendingPool lendingPool;
StabilityPool stabilityPool;
RAACHousePrices raacHousePrices;
RAACHousePriceOracle housePriceOracle;
RAACPrimeRateOracle primeRateOracle;
RAACMinter raacMinter;
FeeCollector feeCollector;
Treasury treasury;
RAACGauge raacGauge;
RWAGauge rwaGauge;
GaugeController gaugeController;
BoostController boostController;
Governance governance;
TimelockController timelockController;
address owner = makeAddr("owner");
address admin = makeAddr("admin");
address repairFund = makeAddr("repairFund");
address manager = makeAddr("manager");
address liquidityPool = makeAddr("liquidityPool");
address user1 = makeAddr("user1");
address user2 = makeAddr("user2");
address user3 = makeAddr("user3");
address functionsRouter = 0x65Dcc24F8ff9e51F10DCc7Ed1e4e2A61e6E14bd6;
bytes32 DON_ID = 0x66756e2d657468657265756d2d6d61696e6e65742d3100000000000000000000;
address crvUSD = 0xf939E0A03FB07F59A73314E73794Be0E57ac1b4E;
address crvUSDVault = 0x0655977FEb2f289A4aB78af67BAB0d17aAb84367;
function setUp() public {
vm.createSelectFork("https://rpc.ankr.com/eth");
vm.startPrank(address(owner));
debtToken = new DebtToken("DebtToken", "DT", address(owner));
rToken = new RToken(
"RToken",
"RT",
address(owner),
address(crvUSD)
);
deToken = new DEToken(
"DEToken",
"DET",
address(owner),
address(rToken)
);
indexToken = new IndexToken("IndexToken", "IT");
lpToken = new LPToken("LPToken", "LPT", address(owner));
raacToken = new RAACToken(address(owner), 0, 0);
raacHousePrices = new RAACHousePrices(address(owner));
raacNFT = new RAACNFT(
address(crvUSD),
address(raacHousePrices),
address(owner)
);
veRaacToken = new veRAACToken(address(raacToken));
lendingPool = new LendingPool(
address(crvUSD),
address(rToken),
address(debtToken),
address(raacNFT),
address(raacHousePrices),
5_00
);
stabilityPool = new StabilityPool(address(owner));
lendingPool.setCurveVault(address(crvUSDVault));
lendingPool.setStabilityPool(address(stabilityPool));
raacMinter = new RAACMinter(
address(raacToken),
address(stabilityPool),
address(lendingPool),
address(owner)
);
stabilityPool.initialize(address(rToken), address(deToken), address(raacToken), address(raacMinter), address(crvUSD), address(lendingPool));
stabilityPool.setRAACMinter(address(raacMinter));
stabilityPool.setLiquidityPool(address(liquidityPool));
stabilityPool.addManager(address(manager), 50_000e18);
treasury = new Treasury(address(owner));
feeCollector = new FeeCollector(address(raacToken), address(veRaacToken), address(treasury), address(repairFund), address(owner));
housePriceOracle = new RAACHousePriceOracle(
address(functionsRouter),
DON_ID,
address(raacHousePrices)
);
primeRateOracle = new RAACPrimeRateOracle(
address(functionsRouter),
DON_ID,
address(lendingPool)
);
gaugeController = new GaugeController(address(veRaacToken));
raacGauge = new RAACGauge(
address(raacToken),
address(raacToken),
address(gaugeController)
);
rwaGauge = new RWAGauge(
address(raacToken),
address(crvUSD),
address(gaugeController)
);
raacHousePrices.setOracle(address(housePriceOracle));
debtToken.setReservePool(address(lendingPool));
rToken.setReservePool(address(lendingPool));
deToken.setStabilityPool(address(stabilityPool));
raacToken.setMinter(address(raacMinter));
raacToken.setFeeCollector(address(feeCollector));
raacToken.manageWhitelist(address(liquidityPool), true);
raacToken.manageWhitelist(address(stabilityPool), true);
veRaacToken.setMinter(address(raacMinter));
vm.stopPrank();
vm.startPrank(address(housePriceOracle));
raacHousePrices.setHousePrice(0, 10_000e18);
vm.stopPrank();
vm.startPrank(address(owner));
gaugeController.addGauge(address(raacGauge), IGaugeController.GaugeType.RAAC, 5000);
gaugeController.addGauge(address(rwaGauge), IGaugeController.GaugeType.RWA, 5000);
vm.stopPrank();
vm.startPrank(address(gaugeController));
raacGauge.setWeeklyEmission(200_000e18);
rwaGauge.setMonthlyEmission(1_500_000e18);
vm.stopPrank();
deal(address(crvUSD), address(user1), 50_000e18);
deal(address(crvUSD), address(user2), 50_000e18);
deal(address(crvUSD), address(stabilityPool), 20_000e18);
vm.label(address(crvUSD), "crvUSD");
vm.label(address(crvUSDVault), "CurveVault");
vm.label(address(deToken), "deToken");
vm.label(address(debtToken), "debtToken");
vm.label(address(indexToken), "indexToken");
vm.label(address(lpToken), "lpToken");
vm.label(address(raacNFT), "raacNFT");
vm.label(address(raacToken), "raacToken");
vm.label(address(rToken), "rToken");
vm.label(address(veRaacToken), "veRaacToken");
vm.label(address(lendingPool), "LendingPool");
vm.label(address(stabilityPool), "StabilityPool");
vm.label(address(raacHousePrices), "RAACHousePrices");
vm.label(address(housePriceOracle), "HousePriceOracle");
vm.label(address(primeRateOracle), "PrimeRateOracle");
vm.label(address(raacMinter), "RAACMinter");
vm.label(address(gaugeController), "GaugeController");
vm.label(address(raacGauge), "RAACGauge");
vm.label(address(rwaGauge), "RWAGauge");
vm.label(address(governance), "Governance");
vm.label(address(timelockController), "TimelockController");
}
function testDepositAndWithdraw() public {
vm.startPrank(address(user1));
IERC20(crvUSD).approve(address(lendingPool), type(uint256).max);
lendingPool.deposit(10_000e18);
vm.stopPrank();
}
}