In TwentyOne::call function, both the player and the dealer are called via msg.sender, which goes against the very idea of having two different entities.
The docs state:
Dealer: The virtual counterpart managed by the smart contract. The dealer draws cards based on game logic.
In TwentyOne::call function, both the player and the dealer are called via msg.sender. Both the while loop and the subsequent uint256 dealerHand = dealersHand(msg.sender);
will work on the callers, i.e. the player's address, breaking the function and the contract.
The game is unplayable.
Manual review
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.