
ScalpLess
Bot-proof Shopify drops: one human, one entry, fair onchain draws and resale capped at 110%
Demo
About
Scalpless is a Shopify plugin and onchain protocol for hype launches like consoles, GPUs, sneakers and collectibles. When demand spikes, bots running thousands of accounts sweep the inventory in seconds and relist it at 2 to 5 times the price. CAPTCHAs, purchase limits and raffle apps don't stop them, because they are keyed to things bots can create for free: emails, cards, accounts and IP addresses. Real fans see "sold out", merchants take the blame, and resellers take the profit. Scalpless gives any Shopify merchant a fair drop in a few clicks: 1. One human, one entry. Every entrant verifies with World ID. A uniqueness proof can only be made once per human, so each person gets one Credit Passport and one entry per drop, no matter how many wallets they use. 2. Provably fair draw. Entrants lock a 10% refundable deposit. When entries close, a three-round weighted draw runs on Sui using onchain randomness. Losers are refunded in the same transaction and form a random waitlist. 3. Winners must be human to claim. Winners re-confirm with World ID before claiming, so a bot that somehow farmed a win can't collect it. 4. Flexible payment. Winners can pay in full, start a zero-default layaway (25% now plus 3 installments; a missed payment refunds 95% and passes the unit to the waitlist), or "borrow on yourself" with an uncollateralized loan backed by their World ID passport. Because the passport can't be reset, a defaulter can't escape with a new wallet: they lose access to future loans and drops. Credit limits start small and grow with on-time repayments, resale proceeds repay loans first, and lenders choose a senior or first-loss junior tranche. 5. Resale without scalping. Each win is a claim on a real unit of the merchant's inventory, held as a non-transferable Sui object. It can't be sent to a bot or listed on an outside marketplace. Resale happens only inside Scalpless, capped at 110% of face value, and only to another verified human. 6. Normal fulfillment. When a winner redeems, a paid Shopify order is created and the merchant ships it as usual. Every unit's lifecycle (won, paid, layaway, financed, resold, redeemed, shipped) is recorded on a public ledger and shown in the merchant dashboard. Shoppers can also pair an AI shopping agent that enters drops for them. The agent is tied to their one human identity and can enter, but only the human can claim a win.
How it's made
Scalpless is a pnpm monorepo with a Next.js web app, an Express backend, a Shopify app, a Move package on Sui testnet and a Solidity ledger on Base Sepolia. World ID (identity and agents): Shoppers verify with IDKit in the web app. On first use they create a session proof plus a one-time uniqueness proof, which mints a Credit Passport on Sui keyed to the human rather than the wallet. Winners re-verify before claiming. World ID for Agents and AgentKit let a person pair an AgentBook-registered shopping agent that can enter drops but can't claim wins. World ID is what makes uncollateralized lending viable: the "respawn problem" (default, then make a new wallet) disappears when identity can't be reset. Bridging World ID to Sui (the hacky part): Sui has no World ID verifier, so the backend verifies each proof with World's API and signs an Ed25519 attestation over a BCS payload shared between the backend and Move tests. Onchain, registry::verify checks the signature and returns an Attested "hot potato", a struct with no abilities that the protocol function must consume in the same transaction, scoped to one action on one object. This means an attestation can't be stored, replayed or reused elsewhere. The verifier key is rotatable via a script. Verifying Groth16 proofs directly onchain is on our roadmap to remove this trust assumption. Sui (draws, custody, payments, lending): The Move package handles the passport registry, drops, claims, market and lending pool, with 24 Move tests. The three-round weighted draw uses sui::random inside a private entry function, so nobody (including us) can reroll results, and losers are refunded in the draw transaction. Claims are key-only objects with no store ability, so they can only move through our module's functions; that is how the 110% resale cap and one-resale-per-human rule are enforced by the type system rather than by policy. During layaway and resale the protocol holds claims via transfer-to-object. The lending pool is a single shared object issuing SENIOR_LP and JUNIOR_LP coins, with installment repayment, an income router that applies resale proceeds and refunds to loans first, and permissionless late marking and default. We keep the invariant senior_assets + junior_assets == cash + outstanding_principal. For live demos the testnet pool uses a 10-minute loan term and 2-minute grace period so a full borrow, repay and default cycle fits in the pitch. Curvegrid MultiBaas (RWA ledger): Each claim is a tokenized unit of real merchant inventory. A mirror service follows Sui events and records every claim step and credit event on our ScalplessRWALedger contract (Foundry, 5 tests) on Base Sepolia. We deployed the ledger through MultiBaas, and the backend builds, signs and submits transactions through it, then reads MultiBaas's indexed events for the merchant dashboard. MultiBaas saved us from writing our own EVM indexer and gave the underwriting agent a queryable credit history. AI agents: An underwriting agent (Gemini) reads the borrower's onchain passport and MultiBaas-indexed credit history and proposes loan terms. It can only tighten the policy-defined terms (fees, limits), never loosen them. A keeper agent enforces repayment schedules when onchain conditions are met and explains each action. Shopify: The Shopify app includes a "Scalpless fair drop" theme app extension. Added to the product template, it reads the live drop directly from Sui in the shopper's browser (verified entries, units, required World ID level, countdown) and replaces Add to cart and Buy it now, so checkout bots have nothing to hit. Merchants launch a drop from any catalog product; our script tags it, adds it to a Drops collection and menu, and creates the Sui drop. When a winner redeems with a shipping address, the claim is burned on Sui and the backend creates a paid Shopify order for that variant, decrementing inventory. The merchant fulfills in Shopify admin as usual, and the buyer sees tracking. Known shortcuts: prices are currently in SUI rather than a stablecoin, backend state is stored in JSON files, and the app runs against public testnets from a single development store. Stablecoin settlement, a public Shopify App Store listing and trust-minimized onchain World ID verification are next.