Every stake accepted from a supported standard ERC20 should remain claimable after a valid terminal outcome.
The k=2 bonus calculation expands amount * (T - entryTime)^2 into absolute timestamp moments. The stored moments can be safe when a stake enters, while the later additions in _bonusShare() overflow after T advances. The mathematically equivalent centered score still fits, but Solidity reverts before reaching Math.mulDiv.
The global expression is evaluated for every claimant. Therefore, one sufficiently large stake can make even a small honest staker's claim revert. This raw-unit threshold is reachable with a standards-compliant high-decimal ERC20; at the repository's realistic base timestamp, the PoC uses less than 0.02 token at 60 decimals.
Likelihood:
This occurs when an allowlisted standard ERC20 has a very large raw-unit supply or high decimal precision and aggregate stake approaches the arithmetic bound.
Any positive bonus causes _bonusShare() to execute after SURVIVED or EXPIRED resolution.
Impact:
A large staker can make every staker's claim revert, including claims for small honest deposits.
Principal remains locked because withdrawals are disabled after the risk window opens and no principal-only claim path bypasses _bonusShare().
Place PoC.t.sol in test/ and run:
The complete file defines a standard 60-decimal ERC20 and reuses the repository's existing unit-test mocks. It does not require a BattleChain RPC.
Cap aggregate stake against the largest possible scoring timestamp, which is bounded by expiry, or replace the expanded absolute-time formula with wider centered arithmetic.
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.
The contest is complete and the rewards are being distributed.