Users can put their money into the contract while measures to mitigate an exploit are discussed. This can lead to lost funds.
pragma solidity 0.8.26;
import {Test, console} from "forge-std/Test.sol";
import { FeeCollector } from "src/core/collectors/FeeCollector.sol";
import { Treasury } from "src/core/collectors/Treasury.sol";
import { BoostController } from "src/core/governance/boost/BoostController.sol";
import { GaugeController } from "src/core/governance/gauges/GaugeController.sol";
import { RAACGauge } from "src/core/governance/gauges/RAACGauge.sol";
import { RWAGauge } from "src/core/governance/gauges/RWAGauge.sol";
import { Governance } from "src/core/governance/proposals/Governance.sol";
import { TimelockController } from "src/core/governance/proposals/TimelockController.sol";
import { RAACMinter } from "src/core/minters/RAACMinter/RAACMinter.sol";
import { RAACReleaseOrchestrator } from "src/core/minters/RAACReleaseOrchestrator/RAACReleaseOrchestrator.sol";
import { RAACHousePriceOracle } from "src/core/oracles/RAACHousePriceOracle.sol";
import { RAACPrimeRateOracle } from "src/core/oracles/RAACPrimeRateOracle.sol";
import { LendingPool } from "src/core/pools/LendingPool/LendingPool.sol";
import { MarketCreator } from "src/core/pools/StabilityPool/MarketCreator.sol";
import { NFTLiquidator } from "src/core/pools/StabilityPool/NFTLiquidator.sol";
import { StabilityPool } from "src/core/pools/StabilityPool/StabilityPool.sol";
import { RAACHousePrices } from "src/core/primitives/RAACHousePrices.sol";
import { DebtToken } from "src/core/tokens/DebtToken.sol";
import { DEToken } from "src/core/tokens/DEToken.sol";
import { IndexToken } from "src/core/tokens/IndexToken.sol";
import { LPToken } from "src/core/tokens/LPToken.sol";
import { RAACNFT } from "src/core/tokens/RAACNFT.sol";
import { RAACToken } from "src/core/tokens/RAACToken.sol";
import { RToken } from "src/core/tokens/RToken.sol";
import { veRAACToken } from "src/core/tokens/veRAACToken.sol";
import { Auction } from "src/zeno/Auction.sol";
import { ZENO } from "src/zeno/ZENO.sol";
import { MockAsset } from "test/Mocks/MockAsset.sol";
import { MockUSDC } from "test/Mocks/MockUSDC.sol";
contract BaseTests is Test {
FeeCollector public s_collector;
Treasury public s_treasury;
BoostController public s_boostController;
GaugeController public s_gaugeController;
RAACGauge public s_raacGauge;
RWAGauge public s_rwaGauge;
Governance public s_governance;
TimelockController public s_timeLockController;
RAACMinter public s_raacMinter;
RAACReleaseOrchestrator public s_raacOrchestrator;
RAACHousePriceOracle public s_raacPriceOracle;
RAACPrimeRateOracle public s_raacPrimeRateOracle;
LendingPool public s_lendingPool;
MarketCreator public s_marketCreator;
NFTLiquidator public s_nftLiquidator;
StabilityPool public s_stabilityPool;
RAACHousePrices public s_raacHousePrices;
DebtToken public s_debtToken;
DEToken public s_deToken;
IndexToken public s_indexToken;
LPToken public s_lpToken;
RAACNFT public s_raacNFT;
RAACToken public s_raacToken;
RToken public s_rToken;
veRAACToken public s_veToken;
Auction public s_auction;
ZENO public s_zeno;
address s_proposer1 = makeAddr("proposer1");
address s_proposer2 = makeAddr("proposer2");
address s_proposer3 = makeAddr("proposer3");
address s_proposer4 = makeAddr("proposer4");
address s_executor1 = makeAddr("executor1");
address s_executor2 = makeAddr("executor2");
address s_executor3 = makeAddr("executor3");
address s_executor4 = makeAddr("executor4");
address public s_repairFund = makeAddr("repairFund");
address public s_businessAddress = makeAddr("businessAddress");
MockAsset public s_assetToken;
MockUSDC public s_usdc;
address public s_admin = makeAddr("admin");
address public s_user01 = makeAddr("s_user01");
uint256 constant public INITIAL_PRICE = 100*10**6;
uint256 constant public RESERVE_PRICE = 50*10**18;
function setUp() public virtual {
vm.warp(1739824870);
vm.startPrank(s_admin);
s_treasury = new Treasury(s_admin);
s_raacToken = new RAACToken(
s_admin,
0,
0
);
s_veToken = new veRAACToken(address(s_raacToken));
s_collector = new FeeCollector(
address(s_raacToken),
address(s_veToken),
address(s_treasury),
s_repairFund,
s_admin
);
s_boostController = new BoostController(address(s_veToken));
s_gaugeController = new GaugeController(address(s_veToken));
s_assetToken = new MockAsset("Asset Token", "ATN");
s_usdc = new MockUSDC("Mock USDC", "USDC");
s_rToken = new RToken(
"Reward Token",
"rToken",
s_admin,
address(s_assetToken)
);
s_lpToken = new LPToken(
"LP Token",
"LPT",
s_admin
);
s_raacGauge = new RAACGauge(
address(s_rToken),
address(s_lpToken),
address(s_gaugeController)
);
s_rwaGauge = new RWAGauge(
address(s_rToken),
address(s_lpToken),
address(s_gaugeController)
);
s_debtToken = new DebtToken(
"Debt Token",
"DBT",
s_admin
);
s_raacHousePrices = new RAACHousePrices(s_admin);
s_raacPriceOracle = new RAACHousePriceOracle(
address(0),
0x66756e2d657468657265756d2d6d61696e6e65742d3100000000000000000000,
address(s_raacHousePrices)
);
s_raacNFT = new RAACNFT(
address(s_assetToken),
address(s_raacHousePrices),
s_admin
);
s_stabilityPool = new StabilityPool(
s_admin
);
s_lendingPool = new LendingPool(
address(s_assetToken),
address(s_rToken),
address(s_debtToken),
address(s_raacNFT),
address(s_raacPriceOracle),
1
);
s_raacMinter = new RAACMinter(
address(s_raacToken),
address(s_stabilityPool),
address(s_lendingPool),
s_admin
);
s_timeLockController = new TimelockController(
5 days,
addProposers(),
addExecutors(),
s_admin
);
s_governance = new Governance(
address(s_veToken),
address(s_timeLockController)
);
s_raacOrchestrator = new RAACReleaseOrchestrator(address(s_raacToken));
s_deToken = new DEToken(
"DE Token",
"DET",
s_admin,
address(s_rToken)
);
s_zeno = new ZENO(
address(s_usdc),
block.timestamp + 1 days,
"Zeno Token",
"ZENO",
s_admin
);
s_auction = new Auction(
address(s_zeno),
address(s_usdc),
s_businessAddress,
block.timestamp + 1 days,
block.timestamp + 4 days,
INITIAL_PRICE,
RESERVE_PRICE,
RESERVE_PRICE,
s_admin
);
vm.stopPrank();
}
function addProposers() public returns(address[] memory){
address[] memory proposers = new address[](4);
proposers[0] = (s_proposer1);
proposers[1] = (s_proposer2);
proposers[2] = (s_proposer3);
proposers[3] = (s_proposer4);
return proposers;
}
function addExecutors() public returns(address[] memory){
address[] memory executors = new address[](4);
executors[0] = (s_executor1);
executors[1] = (s_executor2);
executors[2] = (s_executor3);
executors[3] = (s_executor4);
return executors;
}
}
Although withdraws should not be blocked, the stake functionality should be blocked during emergency state.