#41949 [SC-Insight] Optimize StakeV2::startUnstake with `unchecked` block to reduce gas costs
Submitted on Mar 19th 2025 at 14:50:55 UTC by @Ragnarok for Audit Comp | Yeet
Report ID: #41949
Report Type: Smart Contract
Report severity: Insight
Target: https://github.com/immunefi-team/audit-comp-yeet/blob/main/src/StakeV2.sol
Impacts:
Description
Description
In the StakeV2::startUnstake function, the unStakeAmount parameter is already validated to ensure it is less than or equal to balanceOf[msg.sender]. Therefore, when updating balanceOf[msg.sender] and totalSupply, we can use an unchecked block to save gas.
Additionally, since block.timestamp is extremely small compared to type(uint256).max, we can also use an unchecked block when calculating the end time for vesting.
StakeV2::startUnstake function:
function startUnstake(uint256 unStakeAmount) external {
...
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;
...
}Recommendation
Modify the StakeV2::startUnstake function:
function startUnstake(uint256 unStakeAmount) external {
...
uint256 amount = balanceOf[msg.sender];
require(amount >= unStakeAmount, "Insufficient balance");
unchecked {
balanceOf[msg.sender] -= unStakeAmount;
totalSupply -= unStakeAmount;
uint256 start = block.timestamp;
uint256 end = start + VESTING_PERIOD;
}
...
}Proof of Concept
Proof of Concept
Modify the StakeV2::startUnstake function:
function startUnstake(uint256 unStakeAmount) external {
...
uint256 amount = balanceOf[msg.sender];
require(amount >= unStakeAmount, "Insufficient balance");
unchecked {
balanceOf[msg.sender] -= unStakeAmount;
totalSupply -= unStakeAmount;
uint256 start = block.timestamp;
uint256 end = start + VESTING_PERIOD;
}
...
}Was this helpful?