Creating a Market
Market creation is fully permissionless. Any wallet with sufficient USDC or EURC can deploy a new prediction market on any question. The market is a standalone smart contract — once created, it operates autonomously.
Requirements
- Wallet connected to Arc Testnet (chainId 5042002)
- Sufficient balance: creation fee (5 USDC/EURC) + initial liquidity (≥10 USDC/EURC). Minimum total: 15 USDC/EURC.
- A resolution date in the future
- A resolver address — typically the PredictOracle proxy
Step-by-Step
- Go to Create. Click the Create button in the Predict nav bar or navigate to
/predict/create. - Fill in the market details:
- Question — the yes/no question (e.g. "Will ETH reach $5,000 before August 2026?")
- Description — resolution criteria, data source, edge cases
- Category — Crypto, Macro, Governance, Energy, FX, or Sports
- Tags — up to 5 searchable tags
- Currency — USDC or EURC
- Resolution date — the deadline for the outcome to be known
- Initial liquidity — the seed amount you provide (minimum 10 USDC/EURC)
- Approve. The factory needs approval to spend
initialLiquidity + 5 USDCfrom your wallet. - Confirm creation. The factory deploys a new
PredictMarketcontract, seeds the YES and NO pools equally (50/50 split of your initial liquidity), and registers the market. The new market appears on the markets page immediately.
What Happens to Your Initial Liquidity
Your initial liquidity is split 50/50 into yesPool and noPool, setting the opening odds at exactly 50/50. This liquidity stays in the market and is distributed to winners at resolution — the creator does not receive it back.
Resolution
When you create a market, the resolver field determines who can resolve it. There are two options:
- PredictOracle proxy (
0xc40E6653D3a76FAA8F3F68060f1D09AEB5153A15) — the oracle owner or authorized resolvers propose the outcome, a 24-hour dispute window opens, then anyone finalizes. This is the recommended option. - Your own address — you resolve the market yourself by calling
resolveMarket(outcome)directly on the market contract. No dispute window. Use this only for markets you fully control.
Market Parameters
| Field | Type | Constraint |
|---|---|---|
| question | string | Non-empty |
| description | string | Non-empty |
| category | string | Non-empty |
| tags | string[] | Up to 10 |
| currency | address | USDC or EURC only |
| resolutionDate | uint256 | Must be in the future |
| resolver | address | Non-zero |
| oracleSource | string | Description of data source |
| initialLiquidity | uint256 | ≥ 10 USDC/EURC (10e6) |
On-Chain Market ID
Each market is assigned a deterministic bytes32 ID derived from the question, currency, resolution date, and creator address. This ID is used as the CREATE2 salt, making the market contract address predictable before deployment.
marketId = keccak256(abi.encodePacked( question, currency, resolutionDate, msg.sender ))