An ERC4626 vault defines controlled asset withdrawal via the redeem() and withdrawal() functions, which calculate the proportionate share of assets a holder can retrieve based on their ownership and vault's total balance.
In this vault, the intended flow is that users may only withdraw assets through the customer withdraw() function after the event has ended and only if they belong to the winning country.
However, the inherited ERC4626.redeem() function remains publicly callable and is not overridden in BriVault. This allows any share holder to directly call redeem() on the contract, bypassing the tournament restrictions and accessing their proportionate share of the vault's assets regardless of event state, winner, or eligibility. This completely breaks the game logic and incentive model.
Likelihood: High
The condition occurs whenever a participant or even a non-participant holding shares calls redeem() directly, which is always possible.
Impact: High
All users can freely withdraw underlying assets before the event ends, undermining the entire tournament staking mechanism. As such, the vault's balance can be drained, preventing legitimate winners from receiving rewards and breaking trust and accounting consistency.
The following test case proves the unrestricted redemptions from a user who does not belong in the winners set.
The redeem() function can be overriden and throw, forcing participants to withdraw only through withdraw().
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.