How Toilet works.
A location game. Fractions of real tokenized stocks spawn at real public toilets. Walk there, take a live picture of the toilet, get paid. This page is the whole system, no marketing.
Status: testnet beta
Everything runs on Robinhood Chain Testnet (chain id 46630). The stocks in the vault are the testnet stock tokens; they track nothing and are worth nothing. The point of the beta is to prove the loop end to end — GPS, camera, verification, payout — before the same code points at mainnet tokens.
Spawn points
1143 curated public toilets in 103 cities, taken from OpenStreetMap (amenity=toilets) and scored on being public, mapped, and open. Private and customers-only facilities are excluded. We don't try to cover every toilet on earth; we pick established ones and grow the list city by city. Anyone can suggest one on the homepage; suggestions are reviewed, never auto-published.
Each spawn carries one stock. Right now: TSLA, AMZN, PLTR, NFLX, AMD, 0.01 share each per catch.
A claim, step by step
- Sign in. Email, Google, passkey, or an existing wallet, through Privy. First sign-in creates an embedded wallet for you. No seed phrase.
- Hold $TOILET. At least 10,000 in that wallet — or any Chungo NFT, which waives it.
- Be there. The app watches your GPS. You have to be within 120 m of the spawn with a fix better than ±100 m, and it needs 4 readings over 8 s before the shutter unlocks.
- Take the picture. Live camera only — no uploads, no gallery. A detector on your phone has to see a toilet before the shutter enables. The shutter records a short burst, not one frame.
- The server checks. Every check below runs on the server against the frames it actually received. Pass them all and the vault sends the fraction to your wallet on the spot.
The trust model
There is no pre-seeded reference photo of any toilet. The question a claim has to answer isn't is this the toilet — it's can this scene pay twice. Every claim must pass:
- GPS — distance, accuracy, travel speed since your last catch (walking pace inside a city, flight time between cities), one city per hour per phone.
- Liveness — the frames of the burst must differ (a static image gives exactly zero), and the accelerometer must have moved while the camera was open.
- A toilet in the picture — the same object detector runs on the server. The phone's copy only gates the shutter.
- Never seen before — a perceptual hash of your frames is checked against every prior capture, globally. Re-encoded, resized, or screenshotted, the same picture never pays twice.
- Not your own bathroom again — a feature matcher (SIFT + geometric verification with a planarity gate) compares your frames against your own earlier captures at other spawns. One bathroom can't be in two places.
- Caps — 15 min between catches, 4 per wallet per day, 8 per drop, 6 per spot, plus per-device and per-network limits that a fresh wallet doesn't reset.
Captures at a spawn accumulate into a crowd-built reference. Once a spawn has 2+ paid captures from other people, a new capture that matches none of them is held instead of paid. It pays automatically when a later paid capture there matches it, or when held captures from 3 different phones on 3 different networks all match each other (public restrooms have more than one stall). Held captures can't vouch for each other.
What this buys: a spoofed GPS plus a photo of your own toilet earns at most one claim, ever, and once the spawn has real captures it earns nothing. What it doesn't: a browser can't detect a mock location provider outright, so the GPS layer is heuristic. A native app with device attestation is the next step as stakes go up.
Privacy: no photos are stored
Frames are checked in memory and discarded at the end of the request. What a capture leaves behind is two fingerprints — keypoint coordinates and descriptors the matcher can compare but nobody can view — three perceptual hashes, and a small record (spawn, time, distance, scores). Wallets, devices and networks are stored as one-way hashes. Nothing is ever shown to another user; the live feed shows a pseudonym, the stock and the toilet.
$TOILET, fees and the vault
You need $TOILET to play. Claiming requires holding at least 10,000 $TOILET in the wallet you claim with, checked on-chain at the moment you claim. $TOILET is the fee token — it is never dropped and never given away; a share of every fee buys the real tokenized stock that goes into the vault.
Chungo holders are exempt. Hold a Chungo from either collection and you skip the $TOILET requirement entirely, and every catch pays double. Checked on-chain the same way, on the wallet you claim with.
The vault is one public address on the chain; the homepage reads its balances live. Nothing is minted: a drop only spawns where the vault can pay it.
For brands
Sponsor a spawn and we put fractions of your stock on your restrooms. You pay per verified human at the stall, not per impression. Email us from the homepage.
Not financial advice
Toilet is not affiliated with Robinhood Markets or any company whose stock appears here. Drops are ERC-20 transfers on a public chain; what you may hold where you live is yours to know. It's a game about going outside.
Map tiles: OpenFreeMap © OpenMapTiles, data from OpenStreetMap contributors.