Beginner FriendlyFoundryNFT
100 EXP
View results
Submission Details
Severity: high
Invalid

Missing input validation in `goOnStageOrBattle` function leads to DOS

Summary

Missing input validation in goOnStageOrBattle function leads to DOS

Vulnerability Details

User can input 0 in _credBet parameter in goOnStageOrBattle function and become defender. This will force the challenger to also bet 0 credTokens for the battle due to below line.

require(defenderBet == _credBet, "RapBattle: Bet amounts do not match");

Battles with 0 credTokens as totalPrize is same as no battle as without bets, battle loses it's purpose.

Attacker can take advance of this to front-run every time a battle is completed to become defender with 0 credToken bet.

Impact

Attacker can front-run every time a battle is completed to become defender with 0 credToken bet. As battles are the main functionality of RapBattle contract, attacker can DOS the contract to make battle meaningless.

Tools Used

Manual Review

Recommendations

Add the below code in goOnStageOrBattle function -

function goOnStageOrBattle(uint256 _tokenId, uint256 _credBet) external {
+ require(_credBet > 0, "RapBattle: Bet amount cannot be zero");
if (defender == address(0)) {
defender = msg.sender;
defenderBet = _credBet;
defenderTokenId = _tokenId;
emit OnStage(msg.sender, _tokenId, _credBet);
oneShotNft.transferFrom(msg.sender, address(this), _tokenId);
credToken.transferFrom(msg.sender, address(this), _credBet);
} else {
// credToken.transferFrom(msg.sender, address(this), _credBet);
_battle(_tokenId, _credBet);
}
}
Updates

Lead Judging Commences

inallhonesty Lead Judge over 1 year ago
Submission Judgement Published
Invalidated
Reason: Design choice

Support

FAQs

Can't find an answer? Chat with us on Discord, Twitter or Linkedin.