#41974 [SC-Critical] Reducing `totalSupply` in `startUnstake` leads to protocol insolvency
Description
function startUnstake(uint256 unStakeAmount) external {
require(unStakeAmount > 0, "Amount must be greater than 0");
require(stakedTimes[msg.sender] < STAKING_LIMIT, "Amount must be less then the STAKING_LIMIT constant");
_updateRewards(msg.sender);
uint256 amount = balanceOf[msg.sender];
require(amount >= unStakeAmount, "Insufficient balance");
balanceOf[msg.sender] -= unStakeAmount;
@> totalSupply -= unStakeAmount;
uint256 start = block.timestamp;
uint256 end = start + VESTING_PERIOD;
vestings[msg.sender].push(Vesting(unStakeAmount, start, end));
stakedTimes[msg.sender]++;
emit VestingStarted(msg.sender, unStakeAmount, vestings[msg.sender].length - 1);
}Proof of Concept
Previous#41952 [SC-Insight] Reduce storage costs by eliminating stakedTimes in StakeV2::startUnstakeNext#41981 [SC-Critical] Loss of user funds during unstaking, while under the lockup period
Was this helpful?