Last Man Standing

First Flight #45
Beginner FriendlyFoundrySolidity
100 EXP
View results
Submission Details
Impact: high
Likelihood: high
Invalid

Exponential Claim Fee Growth Quickly Prices Out New Players, Leading to Game Stalling

Exponential Claim Fee Growth Quickly Prices Out New Players, Leading to Game Stalling

Description

  • Normally, a percentage-based increase mechanism is meant to gently scale costs over time. However, due to repeated multiplicative updates to claimFee, the current formula results in exponential growth rather than linear.

  • Explain the specific issue or problem in one or more sentences

  • This causes the fee to grow by a percentage of itself each time a player claims the throne, resulting in the following pattern.

  • newFee = initialFee × (1 + p%)^n

  • Where:

    • initialFee is the starting claim fee

    • p% is feeIncreasePercentage / 100

    • n is the number of throne claims

claimFee = claimFee + (claimFee * feeIncreasePercentage) / 100;

Risk

Likelihood:

  • This will occur inevitably with any non-zero feeIncreasePercentage.

  • The more popular the game becomes (i.e., more players join), the faster the fee escalates.

Impact:

  • After a few rounds, the fee becomes prohibitively expensive.

    • At 20% increase, the fee doubles in ~4 rounds

    • At 50% increase, the fee doubles every 2 rounds

  • Players will drop off rapidly, leaving the game inactive or inaccessible.

  • Core economic mechanics fail due to unsustainable growth.

Proof of Concept

// Initial state:
claimFee = 1 ether;
feeIncreasePercentage = 20;
// After 5 claims:
claimFee = claimFee * (1.2)^52.49 ether
// After 10 claims:
claimFee = 1 ether * (1.2)^106.19 ether
// After 20 claims:
claimFee ≈ 38 ether
This exponential curve rapidly prices out most players.

Recommended Mitigation

- claimFee = claimFee + (claimFee * feeIncreasePercentage) / 100;
+ uint256 increase = (claimFee * feeIncreasePercentage) / 100;
+ if (increase == 0) increase = 1;
+ claimFee = claimFee + increase;
+ // Optional: Cap the maximum claimFee to prevent runaway growth
+ if (claimFee > MAX_CLAIM_FEE) {
+ claimFee = MAX_CLAIM_FEE;
+ }
Or switch to a flat increment model if linear scaling is more appropriate:
+ claimFee = claimFee + BASE_INCREMENT; // Avoids compounding
Updates

Appeal created

inallhonesty Lead Judge about 1 month ago
Submission Judgement Published
Invalidated
Reason: Non-acceptable severity

Support

FAQs

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