The intended flow is that each eligible address claims its allocation. The function accepts an arbitrary account parameter and never checks that msg.sender is that account.
Any address can pay the ETH fee and call claim(victim, amount, proof), sending tokens to victim. Combined with missing claim tracking, any party with a copied proof can repeatedly trigger transfers to the leaf address.
(Aderyn H-1 flags this as “ETH transferred without address checks” — tokens go to account, but authorization is absent.)
Likelihood:
A claim is included in a public block; the proof is trivially reusable by mempool searchers or bots.
A relayer model was not documented in the README; operators assume only the beneficiary can initiate claims.
Impact:
Attackers drain the pool by replaying proofs (see finding above) without needing to control the beneficiary key.
Frontrunners can execute the first claim for a victim (victim still receives tokens, but attacker controls timing and pays negligible fees).
Accounting and compliance assumptions (“user must call claim”) break when claims are forced by third parties.
Alternatively, document and implement an explicit allowedRelayer or EIP-712 meta-transaction path instead of open relaying.
The contest is live. Earn rewards by submitting a finding.
Submissions are being reviewed by our AI judge. Results will be available in a few minutes.
View all submissionsThe contest is complete and the rewards are being distributed.