How it is actually happening => The voting power is only calculated on the basis of the latest lock created
pragma solidity ^0.8.19;
import "forge-std/Test.sol";
import "forge-std/console.sol";
import "../contracts/core/tokens/veRAACToken.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "../contracts/core/governance/proposals/Governance.sol";
import "../contracts/core/governance/proposals/TimelockController.sol";
import "../contracts/interfaces/core/governance/proposals/IGovernance.sol";
contract MockRAACToken is ERC20 {
constructor() ERC20("RAAC Token", "RAAC") {
_mint(msg.sender, 10000000000e18);
}
}
contract veRAACTokenTest is Test {
veRAACToken public veToken;
MockRAACToken public raacToken;
Governance public governanceContract;
TimelockController public timelockController;
address public admin;
address public user;
address public attackerAccount2;
event EmergencyWithdrawEnabled(uint256 delay);
event EmergencyActionScheduled(bytes32 indexed actionId, uint256 executionTime);
event LockCreated(address indexed user, uint256 amount, uint256 unlockTime);
event EmergencyWithdrawn(address indexed user, uint256 amount);
uint256 constant EMERGENCY_DELAY = 3 days;
uint256 constant MIN_LOCK_DURATION = 365 days;
bytes32 constant EMERGENCY_WITHDRAW_ACTION = keccak256("enableEmergencyWithdraw");
uint256 public constant MAX_LOCK_DURATION = 1460 days;
function setUp() public {
admin = address(this);
user = makeAddr("user");
raacToken = new MockRAACToken();
veToken = new veRAACToken(address(raacToken));
address[] memory proposers = new address[](1);
proposers[0] = admin;
address[] memory executors = new address[](1);
executors[0] = admin;
timelockController = new TimelockController(2 days, proposers, executors, admin);
governanceContract = new Governance(address(veToken), address(timelockController));
raacToken.transfer(user, 1000000e18);
raacToken.transfer(admin, 200_000e18);
vm.startPrank(user);
raacToken.approve(address(veToken),type(uint256).max);
vm.stopPrank();
}
function test_MultipleLocks() public {
vm.startPrank(user);
uint256 FirstLockAmount = 10000e18;
veToken.lock(FirstLockAmount,MIN_LOCK_DURATION);
uint256 firstLockPower = veToken.getVotingPower(user);
console.log("FIrst lock Voting power:",FirstLockAmount);
uint256 SecondLockAmount = 1e18;
veToken.lock(SecondLockAmount,MAX_LOCK_DURATION);
uint256 TotalPowerAfterTwoLocks= veToken.getVotingPower(user);
console.log("Total Lock Voting Power:", TotalPowerAfterTwoLocks);
uint256 ThirdLockAmount = 1;
veToken.lock(ThirdLockAmount,MAX_LOCK_DURATION);
uint256 TotalPowerAfterThreeLocks= veToken.getVotingPower(user);
console.log("Total Lock Voting Power:", TotalPowerAfterThreeLocks);
vm.stopPrank();
uint256 TotalVotingPower = veToken.getTotalVotingPower();
console.log("The total voting power of the system is:",TotalVotingPower);
}
}
The voting power is only calculated on the basis of the latest lock, which can cause loss of Rewards and voting privileges.