In the Last Man Standing game, each time a player claims the throne, the claimFee
is increased by a percentage set at deployment through the variable feeIncreasePercentage
. This mechanism is meant to gradually raise the entry cost and add tension to the game.
However, the constructor only ensures feeIncreasePercentage <= 100
, which allows a 100% increase — effectively doubling the claimFee at each call:
This leads to exponential growth (e.g., 0.5 ETH → 1 → 2 → 4 → 8 ...), pricing out most participants after just a few rounds. Since no upper bound or economic cap exists, the throne becomes unaffordable, and game rounds can lock themselves.
Although the contract includes a resetGame()
function, only the owner can invoke it, and it resets the round after a winner has been declared, not during a live game. Therefore, it does not mitigate the fact that individual rounds can become inaccessible, or that whales can dominate early with no viable competition.
Likelihood:
The issue will occur in any deployment where feeIncreasePercentage
is too high (e.g., ≥ 50), especially if many players interact in a short time.
It is deterministic and accumulative with every call to claimThrone
.
Impact:
Rounds can become economically inaccessible after a few claims.
The escalation mechanic becomes abusive rather than challenging.
Early players or wealthy addresses can dominate and crowd out others.
The game logic of Last Man Standing (progressive but fair competition) is broken.
Add this Proof of Code into Game.t.sol
that proves that with 100% fee increase the claimThrone become rapidly very expensive.
Mitigation should target the root cause: unbounded configuration of feeIncreasePercentage
, and optionally, introduce caps for claimFee
.
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.