Problem Statement: Timed NFT Auctions with Escrow Settlement
Problem Statement: Timed NFT Auctions with Escrow Settlement — NFT auction system design interview depth
Problem Statement: Timed NFT Auctions with Escrow Settlement
Design an OpenSea / Foundation / SuperRare-class NFT auction where collectors bid in WETH escrow, sellers list timed English auctions, and settlement fulfills via Seaport with platform fees and optional ERC-2981 royalties. This understanding section (1/30) focuses on English auction with ascending bids and WETH escrow until settlement.
Mechanism
- English auction with ascending bids and WETH escrow until settlement
- Bids are accepted only while
auction.status = OPEN(or EXTENDED); high bid is the maximum escrowed amount with deterministic tie-break by earliestconfirmed_at. - Anti-sniping: any bid inside the final 10 minutes pushes
end_timeby 10 minutes, capped at three extensions per auction.
Auction invariants
Escrowed WETH for outbid users is released automatically when a higher bid confirms. Winner escrow remains locked until SETTLED. Settlement price equals winning bid amount, not a hidden reserve unless reserve is unmet.
Failure modes
- Treating mempool bids as final before escrow tx confirms
- Double-settlement if settlement worker lacks idempotency on
auction_id - Leaderboard drift if Redis high bid diverges from Postgres source of truth
Interview checkpoint (sec-01)
When interviewers from OpenSea or Foundation probe this area, cite 120k bids/day, p99 bid ack 300ms, and escrow + Seaport settlement—not a generic marketplace diagram.
Staff+ talking point
Frame auctions as competing escrow transactions with a single serializable winner write, not as a chat app with optimistic UI.
1 public record BidIntent1(String idempotencyKey, long auctionId, java.math.BigInteger wei) {}
1 def anti_snipe_extend(end_ts: int, bid_ts: int, window_sec: int = 600) -> int: 2 return end_ts + window_sec if end_ts - bid_ts < window_sec else end_ts # sec-1
1 export function minNextBid(current: bigint, incrementBps: number): bigint { 2 return current + (current * BigInt(incrementBps)) / 10000n; // auction sec-1 3 }
Operational notes
Capacity planning for sec-1: partition hot auction_id keys, keep bid ingestion idempotent, and never delete bid rows—use VOID after chain reorg beyond confirmation depth.
Why interviewers care
NFT Auction System interviews reward crisp scope, explicit trade-offs, and failure stories—not generic microservice diagrams.
Interview checkpoint
Name one failure story for Problem Statement: Timed NFT Auctions with Escrow Settlement that proves you understand real outages, not happy-path diagrams.
Key Highlights
- •English auction with ascending bids and WETH escrow until settlement
Section Rescue Kit
Buzzwords to use:
Safe statements:
- "For Problem Statement: Timed NFT Auctions with Escrow Settlement, I'll separate mempool hints from confirmed escrow before updating high bid."
- "I'll walk bid → extend → settle when stuck on databases."