TwentyOne

First Flight #29
Beginner FriendlyGameFiFoundrySolidity
100 EXP
View results
Submission Details
Severity: medium
Invalid

Lack of Emergency Pause Mechanism Leaves Contract Vulnerable During Critical Issues

Summary

The TwentyOne contract lacks the ability to pause operations in case of emergencies. Given its gambling nature and direct handling of ETH, the inability to halt operations when critical issues are discovered puts user funds at risk.

Vulnerability Details

  • No Pause Functionality:

    • Contract cannot be stopped if vulnerabilities are discovered

    • All functions remain active even during critical issues

    • No way to prevent further user interactions during problems

  • Critical Operations:

    • Contract handles real ETH transfers

    • Involves gambling mechanics and randomness

    • Complex game state management

Impact

  • Continuous Risk Exposure:

    • Discovered vulnerabilities can be continuously exploited

    • No way to protect user funds during emergencies

    • Forces hard choices between leaving exploit active or breaking contract

  • Limited Crisis Management:

    • No graceful way to handle:

      • Critical bugs

      • Failed upgrades

      • Market manipulation

      • Randomness exploits

Tools Used

  • Manual Code Review

Recommendations

  • Implement OpenZeppelin's Pausable pattern:

import "@openzeppelin/contracts/security/Pausable.sol";
contract TwentyOne is Pausable {
function startGame() public payable whenNotPaused returns (uint256) {
// ... existing code
}
function hit() public whenNotPaused {
// ... existing code
}
function call() public whenNotPaused {
// ... existing code
}
// Admin functions
function pause() external onlyOwner {
_pause();
}
function unpause() external onlyOwner {
_unpause();
}
}
  • Add emergency withdrawal function for owner:

function emergencyWithdraw() external onlyOwner whenPaused {
uint256 balance = address(this).balance;
(bool success,) = payable(owner()).call{value: balance}("");
require(success, "Withdrawal failed");
}
Updates

Lead Judging Commences

inallhonesty Lead Judge 11 months ago
Submission Judgement Published
Invalidated
Reason: Non-acceptable severity

Appeal created

eierina Submitter
11 months ago
inallhonesty Lead Judge
11 months ago
inallhonesty Lead Judge 11 months ago
Submission Judgement Published
Invalidated
Reason: Non-acceptable severity

Support

FAQs

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