Pull game
Pull is the buyer-curated mystery-stack game. Buyer picks 2-5 cards themselves, pays a price set by the average, and the server randomly picks ONE of those cards to ship. The buyer assembles their own pool of "things they'd be happy with" and takes their shot.
The math
Pull pricing is averaged across the buyer's stack:
stack= buyer-selected cards (2 to 5, configurable)avgMarket= mean ofcard.marketValueacross the stackbuyerDiscount=avgMarket × PULL_BUYER_DISCOUNT(default 15% off — the buyer's incentive)pullPrice=avgMarket - buyerDiscount + PULL_HOUSE_FEE(default $1 fee)
Example: stack of 5 cards at $40 / $50 / $60 / $30 / $20:
- avgMarket = $40
- buyerDiscount = $6 (15%)
- pullPrice = $40 - $6 + $1 = $35
- Buyer pays $35, server picks ONE of the five cards (1-in-5 odds each), that card ships
Why buyers love it
- They control the pool — every outcome is something they wanted
- Average price is cheaper than buying any one card direct
- Suspense — they don't know which one until reveal
- Provably fair — same crypto guarantees as Flip
The provably-fair flow
- Buyer commits a stack via
/api/play/pull - Server generates seed (32 bytes random)
- Server hashes seed (SHA-256) + anchors on Solana
- Server reveals seed + computes winner:
seed[0] % stackSize - UI animates a card-shuffle reveal, lands on the winner
- Stripe captures
pullPrice - Order created for the winning card; the other cards in the stack stay in inventory
Eligibility rules
| Rule | Default | Why |
|---|---|---|
| Stack size min | 2 | 1-card stack is just a direct buy with extra steps |
| Stack size max | 5 | Above 5 the odds get too dilute to feel exciting |
| Stack avg floor | $15 | Shipping economics — server's fee + USPS floor |
| Per-card pullEligible | true (default) | Operator can opt a specific card out of Pull via Strategist |
Sub-$5 cards drag the average DOWN sharply. To include a $1 card in a 5-card stack averaging ≥$15, the other four cards need to total ≥$74 (avg $18.50). That's why city lots exist as the better path for low-value bulk inventory — the operator pre-bundles them so the math works.
Sub-$15 cards in Pull
Sub-$15 cards CAN appear in Pull stacks — they just need higher-value partners. A buyer building a 2-card stack with one $5 + one $25 card averages $15, clears the floor. The Pull-tray drawer in ToT shows the running average live as the buyer adds cards.
Lots in Pull
Pull-eligibility on lots is gated by pull_lots_max_eligible (default 5). A lot of 6+ cards
is too unwieldy to be a single Pull "option" — buyer can't process "I'm picking from 6 lots, each
of which has its own card mix." Lots ≤ 5 cards are eligible; bigger lots are flip-only.
Operator settings
In SlabTrack Strategist commit, three knobs control Pull behavior:
| Field | Default | What it does |
|---|---|---|
pull_singles_eligible | true | Whether new singles default to pullEligible |
pull_lots_max_eligible | 5 | Lots up to this size are pull-eligible; bigger are flip-only |
flip_eligible_floor | 15 | Sub-floor singles route as Pull-only (no solo flip) |
Code references
- Game logic:
thisorthat/src/lib/games/pull.ts - Play endpoint:
thisorthat/src/app/api/play/pull/route.ts - Pull store (zustand):
thisorthat/src/lib/pull-store.ts - Pull tray UI:
thisorthat/src/components/pull/PullTrayDrawer.tsx - Constants:
PULL_MIN_CARDS,PULL_MAX_CARDS,PULL_BUYER_DISCOUNT,PULL_HOUSE_FEE,PULL_MIN_AVGin pull-store.ts