#42127 [SC-Insight] Redundant Fee Calculation in addYeetback() function
Description
Brief/Intro
Vulnerability Details
code Yeet.sol
function restart(bytes32 userRandomNumber) external payable whenNotPaused {
if (userRandomNumber == bytes32(0)) {
revert InvalidRandomNumber();
}
if (!isRoundFinished()) {
revert RoundStillLive(roundNumber);
}
if (!hasCooldownEnded()) {
revert CooldownNotEnded(block.timestamp, endOfYeetTime + COOLDOWN_TIME);
}
emit RoundWinner(lastYeeted, block.timestamp, potToWinner, roundNumber, nrOfYeets);
uint256 fee = yeetback.getEntropyFee();
if (msg.value < fee) {
revert NotEnoughValueToPayEntropyFee(msg.value, fee);
}
uint256 remaining = msg.value - fee;
if (potToYeetback > 0) {
yeetback.addYeetback{value: fee + potToYeetback}(userRandomNumber, roundNumber, potToYeetback);
}
winnings[lastYeeted] += potToWinner;
_roundWinners[roundNumber] = Winner(lastYeeted, block.timestamp, potToWinner, roundNumber);
copySettings();
roundNumber += 1;
potToYeetback = 0;
potToWinner = 0;
nrOfYeets = 0;
lastYeeted = address(0);
lastYeetedAt = 0;
yeetTimeInSeconds = YEET_TIME_SECONDS;
endOfYeetTime = block.timestamp + yeetTimeInSeconds + BOOSTRAP_PHASE_DURATION;
roundStartTime = block.timestamp;
if (remaining > 0) {
(bool success,) = payable(msg.sender).call{value: remaining}("");
require(success, "Transfer failed, cant return remaining value to sender");
}
emit RoundStarted(
roundNumber,
roundStartTime,
YEET_TIME_SECONDS,
POT_DIVISION,
TAX_PER_YEET,
TAX_TO_STAKERS,
TAX_TO_PUBLIC_GOODS,
TAX_TO_TREASURY,
YEETBACK_PERCENTAGE,
COOLDOWN_TIME
);
}code Yeetback.sol
Impact Details
References
Proof of Concept
Proof of Concept
Previous#42123 [SC-Critical] Insufficient Token Reservation in `startUnstake` Leads to Permanent Freezing of Vested FundsNext#42152 [SC-Critical] `StakeV2::accumulatedDeptRewardsYeet` fails to account for pending vesting withdrawals which could cause contract insolvency
Was this helpful?