Normal behavior: Depositing should mint shares to the same address that is recognized as the depositor for staking/refund logic. Cancelling should burn the corresponding shares and refund the proper depositor, keeping vault solvency.
Issue: deposit(assets, receiver) records stake for receiver but mints shares to msg.sender. cancelParticipation() refunds msg.sender and burns msg.senders shares. An attacker can deposit under a victim receiver (records stake there) while keeping the shares, then the victim calls cancel to get a refund from the vault without burning the attacker’s shares. This leaves unpaid shares in circulation (backed by zero assets), effectively “printing” free shares.
Likelihood: High
Occurs whenever a user can deposit with receiver != msg.sender and then that receiver calls cancel.
Anyone can freely call these functions as long as they have 2 addresses
Everyone has motivation to do this as it will print free shares (only fee is paid)
Impact: High
Leaves outstanding shares without backing assets, making the vault insolvent.
Later payouts (including to legitimate winners) are reduced or fail due to insufficient vault balance.
Breaks the whole game mechanic as users can enter the game for free
Description:
a user has 2 addresses: user1 and user2
user1 deposits to receiver = user2, but shares are minted to user1.
user2 calls cancel to get a refund (vault pays out), but their shares are zero, so no burn occurs.
user2 transfers the refunded tokens back to user1. user1 ends up with tokens and the original shares (free shares).
Make share recipient and stake owner the same party. Minimal change: mint shares to receiver to match stakedAsset[receiver] semantics. Optionally, enforce receiver == msg.sender to remove third-party deposit risk.
Consider also validating and cleaning up participation state on cancel to avoid stale accounting in other flows.
Align minted shares with the recorded stake owner:
Or prevent third-party deposits entirely:
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.