Normal behavior: Anti-sniping should maintain a sliding window (e.g., “always at least 15 minutes left”) by setting auctionEnd = block.timestamp + extension when bids arrive near the end.
Issue: The code adds the extension to the existing deadline:
(A bid with timeLeft = 10m increases the buffer to 25m, not 15m. Repeated bids placed before the window repeatedly inflate the buffer, enabling time-dilation griefing (keeping the auction open much longer than intended).)
Likelihood:
Occurs whenever bids come in while timeLeft < extension. Common near the end of competitive auctions.
Impact:
Operational griefing / soft DoS: Attackers (or strategic bidders) can prolong closing, delaying settlement & cash flows.
Seller fatigue / UX issues: Auction end becomes unpredictable and significantly longer than the configured window.
The test starts an auction (end = now + 15m), warps time so 10m remain, then submits a new bid. Because the code adds 15m to the existing auctionEnd (auctionEnd += 15m) instead of resetting to now + 15m, the new time left becomes ~25m (10m remaining + 15m added). Repeating this near the end lets bidders inflate the buffer repeatedly and keep the auction open far longer than intended.
Optional hardening:
Add a max end cap, e.g., require(listing.auctionEnd <= start + MAX_DURATION, "auction max duration exceeded");
Emit an event when the cap is reached to keep indexers in sync.
This keeps anti-sniping behavior while preventing compounding extensions that enable long-tail griefing.
BidBeast marketplace contains a flaw in its auction timing mechanism. This causes the contract to miscalculate the actual end time of an auction, resulting in auctions that either conclude prematurely or run longer than specified.
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.