Разработка системы резолвинга исходов для prediction markets
Prediction market — это рынок ставок на реальные события: «Выиграет ли команда A матч?», «Достигнет ли ETH $5000 до конца года?», «Будет ли принят законопроект X?». Вся токеномика работает только если исход определяется правильно и честно. Система резолвинга — критический компонент.
Типы событий и их резолвинг
Price-based: «Будет ли BTC выше $100K к 31 декабря?»
- Резолвится автоматически через Chainlink/Pyth price feed на дату экспирации
- Наименее спорно, полностью on-chain
Sports/Political: «Кто выиграет выборы?»
- Требует внешние данные
- Оракулы типа Augur, UMA, API3, Kleros
Subjective: «Выполнил ли проект обещанное?»
- Требует human judgment
- Клейм-чэлдж системы, коллективное голосование
Оракул-based автоматический резолвинг
Для объективно верифицируемых событий — автоматический резолвинг через оракул.
contract PriceMarket {
AggregatorV3Interface public priceOracle;
uint256 public resolutionTimestamp;
uint256 public targetPrice; // в USD * 10^8
bool public resolved;
bool public outcomeYes;
function resolve() external {
require(block.timestamp >= resolutionTimestamp, "Too early");
require(!resolved, "Already resolved");
// Проверить staleness оракула
(,int256 price,,uint256 updatedAt,) = priceOracle.latestRoundData();
require(updatedAt >= resolutionTimestamp - 3600, "Oracle stale at resolution");
require(updatedAt <= resolutionTimestamp + 3600, "Oracle updated too late");
resolved = true;
outcomeYes = uint256(price) >= targetPrice;
emit MarketResolved(outcomeYes, uint256(price));
}
}
Ключевые нюансы:
- Какую именно цену брать? Цену точно в момент экспирации, или TWAP за последний час?
- Что делать если оракул обновился задолго до экспирации? Брать историческое значение через roundId.
Исторические данные через roundId
function getHistoricalPrice(uint256 targetTimestamp) internal view returns (int256) {
uint80 roundId = oracleFeed.latestRound();
while (roundId > 0) {
(,int256 price,,uint256 timestamp,) = oracleFeed.getRoundData(roundId);
if (timestamp <= targetTimestamp) {
return price;
}
roundId--;
}
revert("No historical price found");
}
UMA Optimistic Oracle
UMA's Optimistic Oracle — популярный выбор для prediction markets (Polymarket использует UMA).
Mechanism:
- Proposer предлагает результат + bond
- Dispute window (2 часа): кто угодно может оспорить + counter-bond
- При отсутствии dispute — результат принят
- При dispute → UMA DVM voting (token holders голосуют)
interface IOptimisticOracle {
function requestPrice(
bytes32 identifier,
uint256 timestamp,
bytes memory ancillaryData,
IERC20 currency,
uint256 reward
) external returns (uint256 totalBond);
function proposePrice(
address requester,
bytes32 identifier,
uint256 timestamp,
bytes memory ancillaryData,
int256 proposedPrice
) external;
function settleAndGetPrice(
bytes32 identifier,
uint256 timestamp,
bytes memory ancillaryData
) external returns (int256 price);
}
UMA оптимистичен: 95% запросов резолвятся без споров. Это делает его дешёвым и быстрым.
Reality.eth для субъективных событий
Reality.eth — escalation game для субъективных вопросов:
- Любой задаёт вопрос + bond
- Любой отвечает + bond (перебивает предыдущий ответ)
- При каждом оспаривании bond удваивается, таймаут увеличивается
- Финальный ответ через Kleros arbitration при слишком высоком bond
Rational behavior: если ты знаешь правильный ответ — выгодно оспаривать неправильный (получишь bond проигравшего). Это создаёт правдивый результат.
Система паузы при спорных исходах
Даже с автоматическим резолвингом бывают edge cases: oracle возвращает явно неправильное значение, событие отменено, форс-мажор.
address public guardian; // multisig DAO
function disputeResolution() external {
require(msg.sender == guardian, "Not guardian");
require(block.timestamp < resolutionTimestamp + DISPUTE_WINDOW, "Too late");
resolved = false; // Сброс
emit ResolutionDisputed(msg.sender, block.timestamp);
// Триггер manual resolution process
}
Система резолвинга prediction market — 4-8 недель разработки плюс Legal review для compliance с gambling regulations в целевых юрисдикциях.







