Skip to main content

Market types

Financial (price predictions)
  • Any TradFi (traditional finance) or DeFi asset that already has a Pyth price feed can be listed as an Outcome.
  • What is Pyth Network? A high-frequency, first-party price oracle that publishes real-time feeds (crypto, equities, FX, commodities) to multiple chains so markets can settle on objective prices.
Real-World Events (RWE)
  • Any real-world event with a verifiable data point can be listed as an Outcome via SEDA.
  • What is the SEDA protocol? A decentralized oracle framework that turns off-chain data (from APIs/web sources) into on-chain feeds to resolve event outcomes.
  • We use our own SEDA program deployed on the SEDA chain, and it can be verified. In practice, a set of executors calls the API in a decentralized manner and reaches consensus on the result. In addition, we use SEDA Fast to ensure the market is resolved in under 5 seconds.

Market format

  • Binary options: Yes / No
  • Custom options (when appropriate): e.g., Up / Down, Over / Under
  • Multi-Option: One contract, Multiple outcomes

Who can create markets?

  • Admins currently curate and list the highest-quality markets.
  • Users can also propose (and in some cases create) markets.
  • Roadmap: listing will become more decentralized over time.

Roles & interactions

Creation flow

  1. Community suggests an idea in #market-requests (Discord).
  2. Admin reviews for clarity, resolution source, and oracle availability (Pyth/SEDA).
  3. Smart-contract factory mints the market; the UI auto-indexes it.
Want a new market? Post a concise statement with a verifiable outcome (e.g. “BTC closes ≥ $120 k on 31 Dec 2025”).

Listing criteria

Events must meet these guidelines before being listed:
  1. Provide a clear, unambiguous statement with a verifiable outcome.
  2. Reference a reliable data source for resolution.
  3. Have an available oracle capable of monitoring that source.
  4. Specify start and end times that avoid overlap or ambiguity.
  5. Avoid duplicating existing markets and comply with platform rules.

Behind the scenes

  /**
     *@notice Deploy a Pyth-enabled market that stores trigger conditions.
     */
    function createPythMarket(
        address _admin,
        address _oracle,
        address _collateralToken,
        address _outcomeToken1155,
        address _walletFactory,
        uint256 _marketId,
        uint256 _startTime,
        uint256 _endTime,
        uint256 _chainId,
        IMarket.TriggerCondition calldata tc
    ) external onlyRelayer returns (address) {
        _validateCommon(_admin, _oracle, _collateralToken, _outcomeToken1155, _walletFactory, _startTime, _endTime);
        if (marketAddress[_marketId] != address(0)) revert MarketIdExists();
        // Deploy a fresh Pyth-enabled market
        PythMarket market = PythMarket(Clones.clone(pythImplementation));
        // Initialize
        market.initialize(
            _admin,
            _oracle,
            _collateralToken,
            _outcomeToken1155,
            _walletFactory,
            _marketId,
            _startTime,
            _endTime,
            _chainId,
            matchingEngine,
            tc,
            relayerManager
        );
        // Authorize the new market to mint from the outcome token (if needed).
        OutcomeToken1155(_outcomeToken1155).setMinter(address(market), true);
        allMarkets.push(address(market));
        marketAddress[_marketId] = address(market);
        emit MarketCreated(address(market), _marketId, _admin, _oracle);
        return address(market);
    }
    /**
     * @notice Deploy a market without trigger-condition storage (e.g., football oracle).
     */
    function createFootballMarket(
        address _admin,
        address _oracle,
        address _collateralToken,
        address _outcomeToken1155,
        address _walletFactory,
        uint256 _marketId,
        uint256 _startTime,
        uint256 _endTime,
        uint256 _chainId
    ) external onlyRelayer returns (address) {
        _validateCommon(_admin, _oracle, _collateralToken, _outcomeToken1155, _walletFactory, _startTime, _endTime);
        if (marketAddress[_marketId] != address(0)) revert MarketIdExists();
        MarketCore market = MarketCore(Clones.clone(footballImplementation));
        market.initialize(
            _admin,
            _oracle,
            _collateralToken,
            _outcomeToken1155,
            _walletFactory,
            _marketId,
            _startTime,
            _endTime,
            _chainId,
            matchingEngine,
            relayerManager
        );
        OutcomeToken1155(_outcomeToken1155).setMinter(address(market), true);
        allMarkets.push(address(market));
        marketAddress[_marketId] = address(market);
        emit MarketCreated(address(market), _marketId, _admin, _oracle);
        return address(market);
    }