The vault allows users to transfer their ERC-4626 shares freely at any time, and also provides a cancelParticipation() function that refunds a user’s full stakedAsset[msg.sender] amount while burning only their current share balance.
Because the cancelParticipation() refund logic depends on stakedAsset[msg.sender] (which is not adjusted when the user transfers shares), an attacker can exploit this by transferring their shares to another address (already joined an event) before requesting a refund.
Impact: The second address participate with free shares on the tournament
Likelihood: High
The exploit is trivial: only standard ERC-20 transfer() and ERC-4626 redeem() calls are required. No timing or complex setup is needed.
Impact:
User with two addresses can participate for free in the tournament
Setup:
Wallet2 deposits small amount and joins team
Attacker deposits 100 ETH → gets 98.5 shares
Attacker transfers 98.5 shares to wallet2
Attacker calls cancelParticipation() → gets 98.5 ETH refund
Wallet2 uses free shares in the tournament
Event ends
Wallet2 withdraws if it's on the winner team (but anyway it partecipated with free shares)
This can be repeated with many addresses to increase chanse of win and to take the final profit.
Make shares non-transferable until after event, by overriding _update function.
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.