Design NFT Auction System

Medium40 min
1 / 30
understanding7 min read

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 earliest confirmed_at.
  • Anti-sniping: any bid inside the final 10 minutes pushes end_time by 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.

javaOne Dark Pro
1public record BidIntent1(String idempotencyKey, long auctionId, java.math.BigInteger wei) {}
pythonOne Dark Pro
1def 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
typescriptOne Dark Pro
1export 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
Mention this
Tie problem statement to settlement price truth and WETH escrow reads.
Pro tip
Quantify escrow rows/day before naming problem statement infrastructure.

Section Rescue Kit

Buzzwords to use:

WETH escrowAnti-sniping

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."
Design NFT Auction System - System Design | WinJob | WinJob