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