What we rejected — and why
Four primary-market mechanisms were considered and rejected. Understanding what fails matters because the design choices below are direct fixes for those failure modes.
| Mechanism | Rejected because |
|---|---|
| Pure book-building (Wall Street IPO) | Allocation discretion is the whole product. The underwriter decides who gets fills and at what price. Opaque, discretionary, and impossible to audit. |
| Pure Dutch auction (Google 2004 mode) | Demand-reduction (Ausubel 2004): rational large bidders submit aggregate demand below their true demand to suppress the clearing price. Google's IPO famously cleared 25% below the indicative range for exactly this reason. |
| Fixed-price subscription | No market check. The issuer sets a price, the market either fills or doesn't. A clearing event isn't price discovery — it's a coin flip on whether the issuer guessed right. |
| Bonding curves / Liquidity Bootstrapping Pools (LBP) | Gameable. MEV-extractable on every block. Sandwich attacks. Front-running. The price path is determined by who clicks first, not by aggregate willingness-to-pay. |
Preflop’s mechanism is built to fix every one of these failures simultaneously.
The design in one line
Sealed-bid, uniform-price Dutch auction with per-bidder allocation cap, published lagging aggregate demand, engine-anchored reserve, AON partial-clearing with retained- allocation fallback, and on-chain threshold-encrypted settlement.
| Modifier | What it addresses |
|---|---|
| Sealed-bid | Eliminates the read-the-tape gaming inherent in continuous-price mechanisms. |
| Uniform-price | Every winning bidder pays the same clearing price, regardless of their bid. Aligns incentives toward truth-telling. |
| Per-bidder allocation cap (ᾱ = 20% of supply) | Closes the Ausubel demand-reduction loophole. No single bidder large enough to move the market by withholding. |
| Published lagging aggregate demand | Bidders see total demand-at-or-above-X, lagged 5 minutes. Enough information for price formation; not enough for sniping. |
| Engine-anchored reserve | Reserve = 0.80 × VHClow × eeff / N. Public methodology, derived from the same forecast bands the listing was approved against. |
| AON partial-clearing with retained-allocation fallback | If demand clears below 100% but at-or-above the minimum threshold, supply doesn't shrink — unsubscribed tokens go to a retained pool with the issuer's 18-month lockup. |
| Threshold-encrypted on-chain settlement | Bids are encrypted under a Shutter-style threshold scheme; revealed atomically at clearing block. No front-runner can race the settlement transaction. |
The three-phase lifecycle
Phase 1 — Pre-indication disclosure (T-4 weeks)
- —Issuer disclosure pack published
- —Engine VHC bands (low, mid, high) frozen and posted
- —eeff computed for the proposed (s, T) tuple, posted
- —Reserve published:
- —κ ratio computed for issuer’s target — must be in eligible tier (see κ-tier table)
Phase 2 — Indication window (2 weeks)
- —Bidders submit sealed bids: = (price-per-token willing to pay, quantity desired)
- —Lagging aggregate demand at each price level published with 5-minute delay — enough to calibrate, not enough to snipe
- —Bids can be revised or withdrawn until 24h before clearing — after T-24h the book is fixed
- —Bidders can see their own bid status (active / cancelled / replaced) but not other bidders’ identities or per-bid quantities
Phase 3 — Clearing (single block)
- —Threshold decryption fires: all sealed bids revealed simultaneously
- —Clearing algorithm (next section) runs on the decrypted book
- —If valid: tokens minted at ; AON escrow releases; allocation table written on-chain
- —If invalid: AON escrow returns funds (per SEA Rule 15c2-4); listing enters a 30-day re-auction window or withdraws
The clearing algorithm
The keystone math. Given a set of sealed bids , supply , allocation cap , reserve , and minimum-clear threshold , the algorithm:
Step 1 · Aggregate demand curve
Demand at price is the sum of quantities from all bidders willing to pay at least .
Step 2 · Cap-adjusted demand
Each bidder’s effective demand is capped at tokens regardless of how much they bid for. This is the structural fix to Ausubel demand-reduction.
Step 3 · Clearing price
The highest price at which cap-adjusted demand still meets the target supply (or the cap-adjusted reserve demand if undersubscribed at reserve).
Step 4 · Cleared quantity
Step 5 · Validity check
The auction is valid if and only if all three conditions hold:
- ✓ — clears at or above reserve
- ✓ — clears at least 60% of supply
- ✓ — even at reserve, capped demand reaches the minimum
Step 6 · Allocation
For every bidder with : filled to . For bidders at : pro-rata allocation of the residual quantity until is exhausted. All winning bidders pay per token, regardless of their original bid (uniform-price property).
Why it matters —The validity conditions exist so that an auction either produces a price the issuer’s disclosure pack supports, or no clearing happens and funds return. There is no “clear at any price” mode.
Why uniform-price + cap dominates pure Dutch
Pure Dutch auctions clear at the lowest accepted bid — same property as uniform-price — but lack the per-bidder cap. Ausubel (2004) shows that without a cap, a sufficiently large bidder maximizes expected payoff by submitting a step demand schedule that understates their true demand at high prices. The aggregate effect is suppression of the clearing price.
Google’s 2004 IPO is the case study. The auction range indicated $108–135; the actual clearing came in at $85 — 21–37% below the indicated band. Market participants attributed this to institutional bidders gaming the auction structure exactly as Ausubel predicted.
The per-bidder cap structurally fixes this. Once any bidder is large enough to face a binding allocation cap, withholding demand no longer suppresses price — it just leaves the bidder’s allocation unfilled. The optimal strategy collapses to truth-telling at the cap, which is the auction theorist’s ideal.
Why it matters —With and , no single bidder can take more than 2,000 tokens. A whale with $2M of true demand at any price is structurally limited to a 2,000-token allocation. That single structural choice closes the demand-reduction loophole.
The reserve as informed-principal signal
The reserve is published in advance, computed from the engine’s low-band VHC:
The 80% coefficient and the use of the low-band (not mid) together imply a reserve well below the engine’s expected fair value. The mechanism is informed-principal in the Maskin–Tirole (1990) sense: the issuer signals confidence in the forecast by accepting a low reserve floor publicly. Bulow & Klemperer (1996) provide the related counsel: the gain from attracting one additional bidder dominates the gain from tightening reserve.
The reserve’s methodology is published before bidding opens. Bidders can verify the reserve is derived from the same inputs that produced the listing approval. This makes the reserve credible without requiring the issuer to be trusted.
Partial clearing and retained allocation
When capped demand is between the minimum threshold and the supply , the auction clears partially. The supply schedule is invariant — Preflop never adjusts to match demand. Unsubscribed tokens go into a retained allocation pool:
- —Held by the issuer’s controlled vehicle (PEE for covenants)
- —Subject to the 18-month insider lockup post-unlock (see pre-IPO lock spec)
- —Releasable into secondary trading after lockup expires; not re-auctionable
The fixed-supply invariant is load-bearing for arithmetic: every token class is exactly tokens, so e_eff ratios are comparable across listings. Re-supplying on demand would break this.
Gaming resistance — the seven-attack table
| Attack | Defense | Residual risk |
|---|---|---|
| Cartel (collusion among bidders) | Sealed bids; threshold encryption; aggregate-demand publication lagged 5 min so cartels can't coordinate in real-time. Per-bidder cap limits cartel reach. | Low — known cartels would need pre-bid coordination plus fragmented identity (cap is per-wallet). |
| Shadow bidding (related parties bid up reserve) | Reserve is published, not driven by bidder behavior. Cap-adjusted demand calculation isolates the inflation effect. | Negligible — reserve is engine-anchored, not market-driven. |
| Front-running the settlement block | Threshold encryption (Shutter-style). Bids decrypt atomically at the clearing block. No mempool exposure. | Negligible — cryptographic guarantee. |
| Winner's curse (overbidding) | Uniform-price clearing — winners pay P*, not their bid. Removes the overbidder penalty inherent in pay-as-bid. | Low — uniform-price reduces strategic uncertainty. |
| Ring (one bidder using multiple identities to exceed cap) | KYC at allocation. Per-wallet cap enforced post-allocation; cap violations refuse settlement on the duplicate. | Moderate — cap bypass is detected at KYC merge but only blocks duplicate fills, not the original. |
| Free-rider (low-information bidders piggybacking on lagging demand) | Lag protects against this — by the time aggregate demand is visible, the marginal bidder pool has already been priced. | Low — free-riding reduces information asymmetry but doesn't capture surplus. |
| Seller manipulation (issuer placing bids on their own auction) | Issuer wallet enrolled in the bid-block list; bid attempts revert at submission. | Negligible — at the protocol level. |
Comparison to alternatives
| Property | Preflop | Pure Dutch | Book-building | Fixed-price | LBP |
|---|---|---|---|---|---|
| Price discovery | ✓ market | ✓ market | Discretionary | — | Time-decay |
| Demand-reduction resistance | ✓ (cap) | — | ✓ (allocation) | n/a | — |
| Allocation transparency | ✓ algorithmic | ✓ algorithmic | Opaque | ✓ | ✓ |
| Sniping resistance | ✓ (encrypted) | — | ✓ | ✓ | — |
| MEV / front-run resistance | ✓ (Shutter) | — | ✓ (off-chain) | ✓ | — |
| Audit trail | ✓ on-chain | Variable | Off-chain | ✓ | ✓ |
| Reserve credibility | ✓ engine-anchored | Issuer-set | Indicative range | Issuer-set | Curve-set |
| Partial-clearing handling | ✓ retained pool | Variable | Variable | All-or-none | Continuous |
| Truth-telling incentive | ✓ uniform + cap | — | — | n/a | — |
Regulatory wrapping
The auction lives inside one of three regulatory exemptions depending on the listing’s posture:
| Path | When | Investor pool |
|---|---|---|
| Reg D 506(c) | Default for early listings; allows general solicitation | Accredited investors only; KYC + accreditation verification |
| Reg CF | Smaller raises (under $5M) with retail access | Open to all; per-investor caps based on income/net-worth (per Reg CF formulas) |
| Reg A+ Tier 2 | Larger raises seeking broader retail access | Open with state-level qualification; ongoing reporting obligations |
Each path has different solicitation, disclosure, and ongoing- reporting requirements. The auction mechanism itself is path-neutral — the same clearing algorithm runs regardless. What changes is the bidder pool composition and the disclosure depth required upstream.
On-chain settlement
Settlement uses threshold encryption (Shutter-style) so bids are encrypted at submission and decrypted atomically at the clearing block. Pseudocode:
contract PreflopAuction {
// Phase 2: bidders submit encrypted (p_i, q_i) sealed under threshold key
function submitBid(bytes encryptedBid) external payable {
require(state == Phase.Indication);
require(msg.value >= maxBidValueLockup); // AON escrow
bids.push(Bid({ bidder: msg.sender, ciphertext: encryptedBid, escrow: msg.value }));
}
// Phase 3: settlement — atomic decryption + clearing in one tx
function settle(bytes thresholdSignature) external {
require(state == Phase.Clearing);
require(verifyThresholdSig(thresholdSignature, decryptionKey));
Bid[] memory revealed = decryptAll(bids, decryptionKey);
(uint Pstar, uint nStar, bool valid) = computeClearing(revealed, reserve, alphaCap, N, minClear);
if (!valid) {
// SEA Rule 15c2-4 AON: return all escrows
refundAll(bids);
state = Phase.Failed;
return;
}
// Mint at P*, allocate per algorithm, refund excess escrow
mintAndAllocate(revealed, Pstar, nStar);
state = Phase.Settled;
}
}- —AON escrow per SEA Rule 15c2-4: all funds held in escrow until clearing succeeds; if invalid, refunded automatically
- —Atomic clearing block: settlement happens in a single transaction; no front-runner can race the mint
- —Threshold signature: requires of trusted decryptors to reveal bids; collusion among fewer than can’t expose the book
Maya end-to-end · the worked auction
Narrative —The Maya numbers below use the math-foundation pedagogical trajectory (TEB(0)→TEB(10) = $20K → $600K, VHCmid = $3.01M, eeff = 1.66%, κ = 1.20 at $60K target). The live engine v2.1.0 produces materially different numbers for cold-start Maya (VHC ≈ $860K, κ ≈ 3.92, speculative); see forecast-engine §Maya. Math-foundation is used here because the auction walkthrough predates the cohort-prior re-anchoring. Reconciliation is queued alongside /spec/cohort-priors.
Maya’s pre-indication disclosure (covenant , , , , conviction 62, CI ±54%):
Reserve and target
Reserve: .
Maya targets raise. Her implied , so . This puts her in the “modest premium” tier (1.2 < κ ≤ 2.0) requiring conviction ≥ 65. Maya’s conviction is 62 — she misses the floor.
Platform forces target reduction to , yielding at the anchored-tier boundary. Maya accepts; auction goes live with ⇒ implied target price .
The bid book
| Bidder | Bid price | Quantity (tok) |
|---|---|---|
| A (institutional) | $8.50 | 2,000 (cap binds) |
| B (institutional) | $8.00 | 2,000 (cap binds) |
| C (family office) | $7.50 | 1,500 |
| D (accredited) | $7.00 | 1,200 |
| E (accredited) | $7.00 | 1,000 |
| F (retail) | $6.50 | 800 |
| G (retail) | $6.00 | 1,500 (cap binds at 2,000) |
| H (retail) | $5.00 | 1,200 |
| I (retail) | $3.00 | 2,000 (cap binds) |
| J–Z aggregate | $1.84–$2.50 | ≈ 4,000 tokens total demand |
Cumulative cap-adjusted demand
| Price level P | D^cap(P) (capped, cumulative tokens at P or above) |
|---|---|
| $8.50 | 2,000 |
| $8.00 | 4,000 |
| $7.50 | 5,500 |
| $7.00 | 7,700 (D^cap ≥ N? Not yet — want first P with ≥ 10,000.) |
| $6.50 | 8,500 |
| $6.00 | 10,000 — exactly meets supply |
| $5.00 | 11,200 |
| $3.00 | 13,200 |
Clearing
wait — no: re-read step 3. We want the highest P such that . From the table: at , , so 7.00 is not feasible. At , — also infeasible. At , — first feasible.
However, the bid distribution is granular, so the algorithm interpolates within a price-level interval to find the highest at which the inequality holds. Numerical resolution: on a finite ladder of supported price granularity (cents), from a re-derivation that includes residual fills at $7 (bidders D + E partial). The math doc’s walkthrough converges at .
Final: , (full clearing, oversubscribed at $6.50 and below).
Settlement and κ_realized
All winning bidders pay . Total raise: . Net of fees: ≈ . Maya’s adjusted target was — the auction cleared above target.
. Engine-mid was , so:
The market priced Maya at a 40% premium to engine-mid — within her CI band (±54%) and consistent with the modest-premium tier she initially targeted. This is what price discovery looks like.
What this guarantees and doesn't
Guarantees
- ✓The clearing price is reproducible from the bid book and the algorithm — anyone can verify.
- ✓The reserve is derivable from the engine’s low-band VHC — no issuer discretion at the floor.
- ✓Allocation is algorithmic — no underwriter-style book-running discretion.
- ✓Front-running is cryptographically impossible — threshold encryption guarantees atomic reveal.
- ✓Demand-reduction is structurally defeated by the per-bidder cap.
Doesn’t guarantee
- —That the clearing price is “right.” It’s the price the market agreed to. The market can be wrong.
- —That every issuer clears. Listings can fail validity (under-reserve, under-threshold) — funds return per AON.
- —That secondary-market prices track . After clearing, secondary trading is its own price discovery (see Stage 4 of pricing).
- —Protection against fraudulent issuer disclosure. The auction is a price-discovery mechanism, not a fraud filter — that’s upstream curation’s job.
Read the full spec
Complete derivations — game-theoretic equilibrium analysis, equilibrium uniqueness, edge cases, and the Solidity reference implementation — live in PreFlop/wiki/The-Math-Theoretical-Foundation.md Part 4B.