The Auction.sol
contract lacks critical functionality to handle unsold ZENO
tokens after an auction ends. When an auction concludes without selling all allocated tokens, the remaining ZENO
tokens become permanently locked in the contract with no mechanism to withdraw or reallocate them.
Let's examine how tokens become locked:
The AuctionState
state tracks remaining tokens but provides no withdrawal mechanism:
Tokens can only be moved through the buy function:
Once auction ends, tokens are frozen:
The locking occurs because:
Tokens can only move via buy()
buy()
is blocked after endTime
No withdrawal function exists
No owner recovery mechanism
No way to start new auction with remaining tokens
Auction starts with 1,000,000 ZENO tokens
Only 600,000 tokens are sold
Auction ends
Remaining 400,000 tokens are permanently locked
No function exists to recover these tokens
How the protocol gets affected?:
Results in permanent loss of protocol assets (ZENO tokens)
Affects every auction that doesn't sell out completely
No recovery mechanism exists
Impacts protocol's ability to efficiently allocate tokens
Manual review
Add withdrawal functionality for unsold tokens:
The key focus should be on ensuring no tokens can become permanently locked in the contract, while maintaining the protocol's control over unsold tokens.
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.