UnitFlow LogoUnitFlow Docs

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

  1. Go to Create. Click the Create button in the Predict nav bar or navigate to /predict/create.
  2. 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)
  3. Approve. The factory needs approval to spend initialLiquidity + 5 USDC from your wallet.
  4. Confirm creation. The factory deploys a new PredictMarket contract, 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.

ℹ️
The initial liquidity determines the market's depth. A deeper market (more liquidity) means individual stakes move the odds less. Shallow markets (10 USDC) will see large odds swings on small stakes.

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 callingresolveMarket(outcome) directly on the market contract. No dispute window. Use this only for markets you fully control.

Market Parameters

FieldTypeConstraint
questionstringNon-empty
descriptionstringNon-empty
categorystringNon-empty
tagsstring[]Up to 10
currencyaddressUSDC or EURC only
resolutionDateuint256Must be in the future
resolveraddressNon-zero
oracleSourcestringDescription of data source
initialLiquidityuint256≥ 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
))