Decentralized event reasoning

The Truth Layer for Prediction Markets on BNB Chain

The Truth Layer for Prediction Markets on BNB Chain

OMEN is a decentralized oracle network that powers fair, transparent, and trustless event resolution for every prediction market on BNB Chain.

OMEN is a decentralized oracle network that powers fair, transparent, and trustless event resolution for every prediction market on BNB Chain.

Prediction markets are only as strong as their oracle. We’re giving BNB Chain a native oracle built for speed, fairness, and true decentralization.

Prediction markets are only as strong as their oracle. We’re giving BNB Chain a native oracle built for speed, fairness, and true decentralization.

Our oracle is open source, and live on BNB chain

Our oracle is open source, and live on BNB chain

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";

contract AIOracle is Ownable, ReentrancyGuard {

    uint256 public constant QUERY_FEE = 0.01 ether;

    struct Answer {
        string answer;
        uint8 confidence;
        string reasoning;
        uint256 timestamp;
        bool exists;
    }

    mapping(bytes32 => Answer) public answers;
    mapping(address => bytes32[]) public userQuestions;
    uint256 public totalQuestions;
    uint256 public totalFeesCollected;

    event QuestionAsked(
        bytes32 indexed questionId,
        address indexed asker,
        string question,
        uint256 fee,
        uint256 timestamp
    );

    event AnswerProvided(
        bytes32 indexed questionId,
        string answer,
        uint8 confidence,
        string reasoning,
        uint256 timestamp
    );

    event FeesWithdrawn(
        address indexed owner,
        uint256 amount,
        uint256 timestamp
    );

    /**
     * @dev Constructor sets the deployer as the owner
     */
    constructor() Ownable(msg.sender) {}

    function askOracle(string memory question)
        external
        payable
        nonReentrant
        returns (bytes32 questionId)
    {
        require(msg.value >= QUERY_FEE, "Insufficient fee: 0.01 BNB required");
        require(bytes(question).length > 0, "Question cannot be empty");
        require(bytes(question).length <= 500, "Question too long (max 500 chars)");

        questionId = keccak256(
            abi.encodePacked(
                msg.sender,
                question,
                block.timestamp,
                totalQuestions
            )
        );

        userQuestions[msg.sender].push(questionId);
        totalQuestions++;
        totalFeesCollected += msg.value;

        emit QuestionAsked(
            questionId,
            msg.sender,
            question,
            msg.value,
            block.timestamp
        );

        return questionId;
    }

    function provideAnswer(
        bytes32 questionId,
        string memory answer,
        uint8 confidence,
        string memory reasoning
    )
        external
        onlyOwner
    {
        require(!answers[questionId].exists, "Answer already provided");
        require(bytes(answer).length > 0, "Answer cannot be empty");
        require(confidence <= 100, "Confidence must be 0-100");

        answers[questionId] = Answer({
            answer: answer,
            confidence: confidence,
            reasoning: reasoning,
            timestamp: block.timestamp,
            exists: true
        });

        emit AnswerProvided(
            questionId,
            answer,
            confidence,
            reasoning,
            block.timestamp
        );
    }

    function getAnswer(bytes32 questionId)
        external
        view
        returns (
            string memory answer,
            uint8 confidence,
            string memory reasoning,
            uint256 timestamp
        )
    {
        require(answers[questionId].exists, "Answer not yet provided");

        Answer memory ans = answers[questionId];
        return (ans.answer, ans.confidence, ans.reasoning, ans.timestamp);
    }

    function hasAnswer(bytes32 questionId) external view returns (bool) {
        return answers[questionId].exists;
    }

    function getUserQuestions(address user)
        external
        view
        returns (bytes32[] memory)
    {
        return userQuestions[user];
    }

    function withdraw() external onlyOwner nonReentrant {
        uint256 balance = address(this).balance;
        require(balance > 0, "No fees to withdraw");

        emit FeesWithdrawn(msg.sender, balance, block.timestamp);

        (bool success, ) = payable(owner()).call{value: balance}("");
        require(success, "Withdrawal failed");
    }

    function getBalance() external view returns (uint256) {
        return address(this).balance;
    }

    function getStats()
        external
        view
        returns (
            uint256 questions,
            uint256 fees,
            uint256 balance
        )
    {
        return (totalQuestions, totalFeesCollected, address(this).balance);
    }
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";

contract AIOracle is Ownable, ReentrancyGuard {

    uint256 public constant QUERY_FEE = 0.01 ether;

    struct Answer {
        string answer;
        uint8 confidence;
        string reasoning;
        uint256 timestamp;
        bool exists;
    }

    mapping(bytes32 => Answer) public answers;
    mapping(address => bytes32[]) public userQuestions;
    uint256 public totalQuestions;
    uint256 public totalFeesCollected;

    event QuestionAsked(
        bytes32 indexed questionId,
        address indexed asker,
        string question,
        uint256 fee,
        uint256 timestamp
    );

    event AnswerProvided(
        bytes32 indexed questionId,
        string answer,
        uint8 confidence,
        string reasoning,
        uint256 timestamp
    );

    event FeesWithdrawn(
        address indexed owner,
        uint256 amount,
        uint256 timestamp
    );

    /**
     * @dev Constructor sets the deployer as the owner
     */
    constructor() Ownable(msg.sender) {}

    function askOracle(string memory question)
        external
        payable
        nonReentrant
        returns (bytes32 questionId)
    {
        require(msg.value >= QUERY_FEE, "Insufficient fee: 0.01 BNB required");
        require(bytes(question).length > 0, "Question cannot be empty");
        require(bytes(question).length <= 500, "Question too long (max 500 chars)");

        questionId = keccak256(
            abi.encodePacked(
                msg.sender,
                question,
                block.timestamp,
                totalQuestions
            )
        );

        userQuestions[msg.sender].push(questionId);
        totalQuestions++;
        totalFeesCollected += msg.value;

        emit QuestionAsked(
            questionId,
            msg.sender,
            question,
            msg.value,
            block.timestamp
        );

        return questionId;
    }

    function provideAnswer(
        bytes32 questionId,
        string memory answer,
        uint8 confidence,
        string memory reasoning
    )
        external
        onlyOwner
    {
        require(!answers[questionId].exists, "Answer already provided");
        require(bytes(answer).length > 0, "Answer cannot be empty");
        require(confidence <= 100, "Confidence must be 0-100");

        answers[questionId] = Answer({
            answer: answer,
            confidence: confidence,
            reasoning: reasoning,
            timestamp: block.timestamp,
            exists: true
        });

        emit AnswerProvided(
            questionId,
            answer,
            confidence,
            reasoning,
            block.timestamp
        );
    }

    function getAnswer(bytes32 questionId)
        external
        view
        returns (
            string memory answer,
            uint8 confidence,
            string memory reasoning,
            uint256 timestamp
        )
    {
        require(answers[questionId].exists, "Answer not yet provided");

        Answer memory ans = answers[questionId];
        return (ans.answer, ans.confidence, ans.reasoning, ans.timestamp);
    }

    function hasAnswer(bytes32 questionId) external view returns (bool) {
        return answers[questionId].exists;
    }

    function getUserQuestions(address user)
        external
        view
        returns (bytes32[] memory)
    {
        return userQuestions[user];
    }

    function withdraw() external onlyOwner nonReentrant {
        uint256 balance = address(this).balance;
        require(balance > 0, "No fees to withdraw");

        emit FeesWithdrawn(msg.sender, balance, block.timestamp);

        (bool success, ) = payable(owner()).call{value: balance}("");
        require(success, "Withdrawal failed");
    }

    function getBalance() external view returns (uint256) {
        return address(this).balance;
    }

    function getStats()
        external
        view
        returns (
            uint256 questions,
            uint256 fees,
            uint256 balance
        )
    {
        return (totalQuestions, totalFeesCollected, address(this).balance);
    }
}

How It Works

Our Oracle Workflow

Our Oracle Workflow

Ask, research, answer intelligent and automatic.

Ask, research, answer intelligent and automatic.

Ask, research, answer intelligent and automatic.

STEP 1

Ask Question

Any smart contract calls oracle.askOracle() with their question and and our fee agreeable through B2B conversations whilst at a standard rate of 0.001BNB.

STEP1

Ask Question

Any smart contract calls oracle.askOracle() with their question and and our fee agreeable through B2B conversations whilst at a standard rate of 0.001BNB.

STEP 1

Ask Question

Any smart contract calls oracle.askOracle() with their question and and our fee agreeable through B2B conversations whilst at a standard rate of 0.001BNB.

STEP 2

AI Research + Deep Data Analytics

Automatically searches trusted sources, cross-references data, and builds high-confidence answers with reasoning.

STEP1

AI Research + Deep Data Analytics

Automatically searches trusted sources, cross-references data, and builds high-confidence answers with reasoning.

STEP 2

AI Research + Deep Data Analytics

Automatically searches trusted sources, cross-references data, and builds high-confidence answers with reasoning.

STEP 3

On-Chain Answer

The oracle writes the answer, confidence score, and reasoning back to the blockchain.

STEP1

On-Chain Answer

The oracle writes the answer, confidence score, and reasoning back to the blockchain.

STEP 3

On-Chain Answer

The oracle writes the answer, confidence score, and reasoning back to the blockchain.

STEP 4

Consume Result

Your contract reads the answer via oracle.getAnswer() and executes your business logic - immutable proof that an event did or did not occur

STEP1

Consume Result

Your contract reads the answer via oracle.getAnswer() and executes your business logic - immutable proof that an event did or did not occur

STEP 4

Consume Result

Your contract reads the answer via oracle.getAnswer() and executes your business logic - immutable proof that an event did or did not occur

SECURITY & TRUST

Trust built into every result

Open processes. On-chain guarantees. Proven fairness.

Open processes. On-chain guarantees. Proven fairness.

Open processes. On-chain guarantees. Proven fairness.

Two-source pricing via Chainlink and PancakeSwap TWAP

Staking and slashing to secure truthful reporting

Commit-reveal for sensitive events

Dispute & arbitration modules

Governance and upgrade timelocks

FEATURES

Built for Developers

Built for Developers

Everything you need for reliable event resolution.

Everything you need for reliable event resolution.

Everything you need for reliable event resolution.

Multi-event support

Binary, scalar, and categorical outcomes

Multi-event support

Binary, scalar, and categorical outcomes

Multi-event support

Binary, scalar, and categorical outcomes

On-chain finality

No centralized decision-making

On-chain finality

No centralized decision-making

On-chain finality

No centralized decision-making

Staking & slashing

Economic guarantees for reporters

Staking & slashing

Economic guarantees for reporters

Staking & slashing

Economic guarantees for reporters

TWAP & Chainlink pricing

Reliable price-based event resolution

TWAP & Chainlink pricing

Reliable price-based event resolution

TWAP & Chainlink pricing

Reliable price-based event resolution

Dispute resolution

Escalation to arbitration DAO

Dispute resolution

Escalation to arbitration DAO

Dispute resolution

Escalation to arbitration DAO

Easy integration

Plug n' play smart contracts for PM apps

Easy integration

Plug n' play smart contracts for PM apps

Easy integration

Plug n' play smart contracts for PM apps

Any question type

Binary (YES/NO), factual, price queries, event verification

Binary (YES/NO), factual, price queries, event verification

Binary (YES/NO), factual, price queries, event verification

Fast responses

30-60 second turnaround from question to on-chain answer

30-60 second turnaround from question to on-chain answer

30-60 second turnaround from question to on-chain answer

Simple integration

import interface, connect, ask

import interface, connect, ask

import interface, connect, ask

Confidence scoring

0-100% confidence with full reasoning for every answer

0-100% confidence with full reasoning for every answer

0-100% confidence with full reasoning for every answer

Transparent Pricing

0.01 BNB per question, no hidden fees

0.01 BNB per question, no hidden fees

0.01 BNB per question, no hidden fees

Everything devs need to get started

Everything devs need to get started

Omen, a single source of truth

> BNB Chain has dozens of prediction market projects.

> We’re building the shared oracle layer that connects them all.