Clarity is a prediction market exchange. Markets are binary YES/NO contracts that resolve based on a published settlement source — a price level on Hyperliquid, an oil-price tick, daily Polymarket crypto-volume, etc. Settlement is on-chain: positions are recorded in a smart contract on Base mainnet and pay out in real USDC.
The matching engine is off-chain (a single Python service) for speed and zero-fee-per-trade economics. The contract is the source of truth for who owns what shares and what the resolution outcome was.
Every market resolves to exactly one of YES ($1 per share) or NO ($0 per share). To take a position you can:
p ¢ — you pay p × qty ¢ now and receive $1 × qty if the market resolves YES, $0 otherwise.p ¢ — equivalent to buying NO at (100 − p) ¢. You pay (100 − p) × qty ¢ as collateral and receive $1 × qty if the market resolves NO.There is one order book per market (the YES book). NO trading happens implicitly — selling YES @ 60 ¢ is buying NO @ 40 ¢.
The YES price in cents is the implied probability of YES resolution, in percent. A YES share trading at 67 ¢ implies the market believes there's a 67% chance of YES resolution. Buying at that price is profitable if the true probability is higher than 67%, accounting for fees.
The matching engine implements a price-time-priority order book — best price wins, ties broken by who arrived first. When two orders cross (your buy ≥ someone's resting sell), they match at the resting price. Both sides post collateral upfront equal to their maximum loss, so a settled trade always nets to exactly $1 per resolved share, distributed by outcome.
Prices are integers from 1 ¢ to 99 ¢. Quantities are positive integers. There's no leverage and no margin.
No stop-loss / IOC / FOK / iceberg orders yet.
Trading: a 5 bps (0.05%) taker fee on notional value, charged only to the order that crossed the book (the taker). Resting orders that get filled pay nothing. So a $100 trade costs the taker 5 ¢ in fees.
Custodial deposits: the actual gas the system spent to credit your deposit, with a floor of 1 ¢ (or 2 ¢ for gasless / EIP-3009 deposits, since they require an extra relay tx). Typical real cost on Base is well under 1 ¢, so most deposits land at the floor.
Withdrawals: the actual gas the system spends to send your USDC out, similarly with a small floor.
There is no deposit-to-trade conversion fee, no inactivity fee, no withdrawal-percentage fee.
The engine prevents self-fills. If you place an order that would match against your own resting order, the resting order is cancelled and your collateral is refunded — your new order is then placed normally. This is the "cancel-resting" variant of self-trade prevention.
Two paths, depending on whether your USDC is on Base and whether you have ETH for gas:
Wallet-mode users (signed in with MetaMask) can also deposit directly via the contract's deposit() function, but this is currently a less polished path.
When you sign up with email, the platform generates a fresh Ethereum keypair and stores the private key encrypted with AES-256-GCM under a master key on the server. The address derived from that key is your custodial deposit address. You don't see or hold the private key.
When USDC lands at that address on Base, a sweeper service polls Transfer events, sees the inbound, and runs:
Exchange.deposit(amount − fee)Your off-chain balance is credited when the on-chain Deposited event is observed by the watcher. Total time from external send to balance credit: typically 30-60 seconds on Base.
Native USDC on Base supports EIP-3009 — a signature-based transfer authorization. You sign a typed-data message that says "I authorize transfer of X USDC from me to recipient Y, valid until time T, with nonce N." No on-chain transaction, no gas.
The platform validates your signature, recipient (must be your own custodial address), time window, and (from, nonce) uniqueness, then submits an on-chain transferWithAuthorization(...) call from the treasury wallet. Treasury pays gas. The USDC lands at your custodial address; the existing sweeper then credits your balance with a 2 ¢ fee floor (vs 1 ¢ for direct deposits — the extra cent covers the relay tx).
This is the path to use if you have USDC on Base but no ETH to pay for a transfer.
Most deposits clear within 60 seconds. If yours is taking longer, here's what to check in order:
From the header, click Withdraw, enter an amount and a destination Base address. The platform:
Exchange.withdraw(amount + fee) from treasury, releasing USDC from the contractUSDC.transfer(destination, amount) from treasury to your addressTypical end-to-end time: 10-30 seconds. There's a per-user limit of 3 in-flight withdrawals to prevent runaway accidents.
You can withdraw to any Base address, not just the one you signed up with. The platform refuses obviously-wrong destinations (zero address, the Exchange contract itself, the address the platform is sending from).
Each market has a published resolution rule — for example, "settles YES if the SPX index closed above the strike price at 16:00 UTC." When the resolution time hits and the settlement source publishes a final value, the platform calls Exchange.resolveMarket(market_id, outcome) on-chain.
From that moment, your YES shares (if winning) become claimable as $1 per share, and any open orders on that market release their collateral. Resolved positions get auto-claimed into your off-chain balance — there's nothing to manually settle.
Markets that never had a real on-chain trade are resolved off-chain only — no gas wasted on contracts no one used.
Currently three:
Markets are auto-rolled by a manager service — when one expires, a fresh one opens with the next strike. No human intervention.
Currently Base mainnet only. Native USDC on Base is the deposit / settlement / withdrawal currency.
Multi-chain support (Ethereum L1, Arbitrum, Optimism, Polygon) via CCTP + EIP-3009 is on the roadmap — gasless from any source chain, automatically bridged to Base. Arbitrum is the planned first addition.
The Clarity Exchange contract on Base mainnet is at 0xb8734bc1bcc112183c7ce77cabbcae2c7e05dd20. Source is verified on Basescan — you can read the bytecode, ABI, and source side-by-side at:
basescan.org/address/0xb8734bc1bcc112183c7ce77cabbcae2c7e05dd20#code
Always confirm the contract address in your wallet's "approve" / "deposit" prompt matches this exactly before signing. Anything else is a phishing site.
The contract has not been formally audited.
To make trying the exchange frictionless. Wallet-only signup is a real onboarding cost for users who haven't held a non-custodial wallet before. The email flow generates a wallet for you under the hood, encrypted server-side. You can deposit via your dedicated address (or via gasless EIP-3009 from an external wallet), trade with no signing per-trade, and withdraw to any Base address you control. The custodial path is intentional — speed-of-onboarding traded against trust assumption.
Sign in via "Connect Wallet" instead of email. You'll trade as your own EOA — every order is signed by you, the platform doesn't hold a key for you. Same contract, same matching engine, same fees. Deposits go directly through the contract's deposit() function rather than via a custodial sweep.
Clarity runs on a single VPS with hourly database backups. The on-chain contract is the source of truth for positions and balances — if the off-chain service goes down, your USDC is still in the contract and recoverable.
Specific guarantees we don't make:
See the disclaimer for the full list of "what could go wrong."
Question not answered here? This is a personal project — reach out directly.