
BrandMyStuff
A marketplace for ad space on everyday objects: AI-verified, investor-owned, settled on Sui.
Demo
About
BrandMyStuff is a marketplace that turns everyday objects into ad space. Anyone can rent out the space on things they own, like a laptop lid, a car, a helmet or a shop window, to brands that want real-world attention. Great spots can also be tokenised, so investors can own a share of their future ad income. The problem: In 2026, viral posts showed huge demand for this. A developer sold every sticker spot on his MacBook lid to 64 bidding brands, Solana sold ad spots on its own logo, and a groom sold ad space on his wedding tuxedo. Small and mid-size brands loved it because billboards and transit ads are priced for big budgets, and this was real-world advertising they could finally afford. But the market broke on trust. 30% of the MacBook winners never paid, there was no way to judge whether a spot was any good, no proof the ad ever went up, and copycat marketplaces were left with 98%of their spots empty. How brandmystuff works: 1. List: an owner photographs an object with the in-app camera, via a phone link or QR code, and marks the spots where an ad could go. 2. Score: an AI judge (Gemini vision plus measured image metrics) gives every spot a transparent Ad-Space Quality Score out of 100, based on visibility, legibility, surface, context and durability. The score is written on-chain. 3. Lease: a brand books weeks on a spot. The full payment in USDC is locked in an escrow smart contract on Sui, so owners are always paid. 4. Prove and earn: each week the owner photographs the ad in place. The AI checks it against the listing and the approved design, and every accepted proof releases that week's payment automatically. Missed proofs are refunded to the brand, and disputes are handled on-chain. Tokenisation: An owner can split a spot into 10,000 revenue shares and sell them to identity-verified investors, with a generated legal pack signed on-chain. Every time the spot earns rent, holders receive their share. They can trade shares on a built-in order book, and if a spot goes viral and brands pile in, early holders earn more. Investors can get paid on Sui or, through Circle CCTP and Curvegrid MultiBaas, as native USDC on Ethereum, Base, Arbitrum or Optimism. AI agents as buyers: Each brand gets Scout, an AI agent that reads the brand, discovers spaces through ENS, scores them for fit and books the best one. It pays through x402 (HTTP-native payments on Sui) from an on-chain budget mandate that caps what it can spend, and the brand can pause or revoke it at any time. Outside AI agents can also discover, quote and buy ad space through our MCP server and x402 endpoints, with no account needed. Built on: - Sui (Move): escrow and weekly payments, fee splits (the owner keeps 88%), the KYC registry, revenue shares, the order book, sponsorships, cross-chain payout routes and agent budget mandates. That's 10 Move modules, upgraded live twice. Photos, reports and legal documents are stored on Walrus. - ENSv2 (Sepolia): every account, object, space, lease and agent gets a readable name, like lid-center.macbook.sam.brandmystuff.eth. Its records publish the quality score, price and status, and are verified both ways against Sui. With Enhanced Access Control, owners can edit their own profile records but never their score. Lease names are held by the advertiser and expire with the lease. Agents get their own namespace, scout.<brand>.brandmystuff.eth, and register receipts for their purchases themselves. - Curvegrid MultiBaas: runs every EVM step of cross-chain payouts across four testnets: deploying our payout relayer, building and submitting transactions, indexing delivery events, querying lifetime totals, reading balances and sending signed webhooks. Everything runs end to end on public testnets with test USDC.
How it's made
Architecture: A Next.js 16 app (App Router, React 19, Tailwind v4) serves both the UI and all API routes, including our own x402 facilitator and an MCP server. A long-running Node worker does three things: - it polls Sui for events; - it runs a retrying job queue (ENS writes, cross-chain payouts, AI score writes); - it enforces on-chain deadlines. Supabase Postgres holds a read model rebuilt from Sui events, so the chain stays the source of truth and the database is a cache. Walrus stores photos, AI score reports, proof photos and legal PDFs. Gemini (gemini-3.1-flash-lite) does all the vision work. Sign-in uses Privy (email with embedded Sui and Ethereum wallets) or any Sui wallet through dApp Kit. Sui: One package with 9 modules, plus a separate mandate package: - asset: objects, ad spaces and a per-space week calendar that makes double booking impossible. - lease: escrow and proof-gated weekly payments. - The full USDC amount is locked upfront and paid out in "weeks + 1" instalments. - A payment is released only when the AI proof scores at least 80% on both checks, a floor enforced in Move itself. - Each payment is split 12% to the platform, then the investor share, then the owner. - After a deadline passes, anyone can trigger refunds for missed proofs. - Offering: 10,000 revenue units per space, with income spread by a pull-based accumulator that carries rounding dustcforward. - kyc: an ERC-3643-style registry that gates every purchase, transfer and trade. - market: asks, escrowed bids and expiry sweeps. - sponsor: paid "Sponsored" tags. - payout: holder-signed cross-chain payout routes. - mandate (separate package): budget caps for AI agents. - Two capabilities split authority: AdminCap for governance and OperatorCap for the backend. Display objects plus Walrus blob IDs make every space, object and lease render with its real photo in any wallet. On testnet, week_ms is 10 minutes, so a full lease runs in under an hour. The AI judge: - Measured metrics: sharp computes sharpness, noise, exposure clipping, luminance contrast and pixels per cm, combined into an evidence-quality index. A 64-bit perceptual hash catches reused photos. - Sampled judgements: Gemini grades 11 fixed criteria on a 0–4 scale in 3 independent samples (5 if they disagree), and code takes the medians and computes the score. - Measured size: an ID card in the photo gives the real scale, so a space whose claimed size is more than 20% off is rejected. - Gates: eight checks reject AI-generated or stock photos, prompt-injection text, a close-up that doesn't match the object, and more. - Provenance: photos can only come from a live camera through one-time links with a QR code, and the server confirms the bytes match what that link captured. x402 on Sui (hacky, and our own). x402 is usually shown on EVM chains, so we wrote a self-hosted facilitator for the exact scheme on sui:testnet: - it verifies the payer's signature and rejects replayed payments; - it dry-runs the transaction to prove the treasury receives exactly the quoted amount; - it settles the payment, then books through lease::book_for on the payer's behalf; - any failure is refunded on-chain. Quotes use Sui's on-chain clock, not server time, because the contracts check deadlines against it. The Scout agent. Each brand gets an agent with its own Sui and EVM keys, encrypted at rest. - Leash: it spends through a Move BudgetMandate that fixes one agent, one payee, a per-payment cap, a total budget and an expiry. The brand can pause or revoke it. - The payment is the mandate: its x402 payment transaction is a mandate::spend, so the facilitator sees an ordinary USDC transfer while the agent can never exceed what the brand allowed. - Choosing an ad: it reads space data from live ENS records through the Universal Resolver, verifies each name against Sui, scores fit with Gemini, and only buys ENS-verified spaces within budget. ENSv2 (Sepolia): We registered brandmystuff.eth through the ETHRegistrar's commit-reveal flow and deploy a subregistry on demand for each parent name. A relayer turns Sui events into ENS writes: register, records, renew, unregister. - Lease labels from Move: lease::book_internal builds the l-<seq> label on-chain, so Sui and ENS always agree on lease names. - One resolver per identity. ENSv2 resolver roles apply per record key across the whole resolver, never per name. So each user and each agent gets their own Permissioned Resolver: - the owner's wallet may write only profile keys; - attested.aqs, price and status stay platform-only. - Safe migration: existing names move to the new resolver by copying records first and repointing second, then the holder's SET_RESOLVER role is revoked so no one can repoint to a forged score. - Leases: lease names are held by the advertiser and expire with the lease. - Agents: each gets scout.<brand>.brandmystuff.eth with REGISTRAR rights on its own subregistry only, and registers a buy-<n> receipt after every purchase. Its roles are removed the moment the brand revokes the mandate on Sui. - Verification: a two-way Sui ↔ ENS check (a sui.object record) backs every name. Sui addresses are stored as coin type 784, so names resolve to Sui addresses natively. - Proving the permissions: gas-free eth_call probes show an owner's attempt to write attested.aqs reverting with EACUnauthorizedAccountRoles. Curvegrid MultiBaas + Circle CCTP (cross-chain payouts): Investors choose a payout chain at onboarding. That choice is added to the same Sui transaction that creates their profile, so it costs one signature. - One transaction on Sui: it calls payout::release_routed (the Move function returns the holder's USDC) and passes that coin into Circle's deposit_for_burn_with_caller. Release and burn are atomic. - Circle attestation: Circle attests the burn in about 5 seconds. - Only our relayer can mint: our relayer, deployed through MultiBaas on 4 EVM testnets, is the only contract allowed to complete the mint, and the USDC goes straight to the investor. What MultiBaas does: - holds the contract library and address aliases; - builds every transaction (nonce, gas, EIP-1559 fees), which our key only signs; - submits it and tracks the receipt; - indexes PayoutDelivered events; - runs event queries that total each holder's delivered USDC; - reads contract balances; - sends HMAC-signed webhooks. It replaced an RPC node, nonce management and a log indexer we would otherwise have had to build and run for four chains. Other notable hacks: Wallet-free onboarding with Privy: users sign in with Google, Apple, X, email or a passkey, and Privy gives them an embedded Ethereum wallet while our server creates their Sui wallet. A custom PrivySuiSigner lets that embedded wallet sign the Sui transactions our app builds (it only signs the raw hash). So a brand or owner who has never touched crypto can list an object, pay into escrow, own ENS names and get paid, without installing a wallet or saving a seed phrase. Experienced users can still bring Slush, Suiet or Phantom through Sign in with Sui.