Разработка пулов ликвидности для ставок на блокчейне
Централизованные беттинговые платформы работают по простой модели: дом принимает все риски и устанавливает odds с маржой в свою пользу. В децентрализованном беттинге риск распределяется между провайдерами ликвидности — они берут на себя роль «дома» и получают доходность от маржи, принимая возможность убытков при нестандартных исходах.
Протоколы типа Azuro строят именно такую инфраструктуру. Провайдер добавляет USDC в пул, ставки идут против этого пула, odds корректируются динамически в зависимости от объёма ставок и текущего exposure.
Ключевая проблема: управление exposure
Дисбаланс ставок
Если 90% ставок идёт на одну сторону события (например, на победу Реала в дерби), пул несёт огромный directional risk. Один результат — провайдеры ликвидности теряют значительную часть пула, другой результат — зарабатывают.
Динамические odds как решение: при превышении exposure threshold на одну сторону odds на эту сторону автоматически снижаются (делая ставку менее привлекательной), odds на противоположную сторону растут. Это балансировочный механизм без централизованного маркет-мейкера.
function calculateOdds(
uint256 eventId,
uint8 outcomeId
) public view returns (uint256 odds) {
ExposureData memory data = exposures[eventId];
uint256 totalPool = data.lpLiquidity;
uint256 sideExposure = data.outcomeExposure[outcomeId];
// Чем выше exposure на сторону, тем ниже odds
uint256 adjustedPool = totalPool - sideExposure * MARGIN_FACTOR / 1e18;
odds = (adjustedPool * 1e18) / (adjustedPool - sideExposure);
}
Это упрощённая формула. Реальные системы используют более сложные модели с учётом correlated events (несколько матчей в одном турнире), liquidity depth и market maker oracle для начальных odds.
Оракул результатов и манипуляция
Это самая уязвимая точка любого беттинг-протокола. Кто определяет результат матча? Централизованный оратор — точка отказа и доверия одновременно. Компрометация оракула = дренаж всей ликвидности.
Несколько подходов:
Chainlink Functions / Any API — Chainlink запрашивает данные с нескольких спортивных API (Sportradar, API-Football), агрегирует результат через threshold consensus. Атаковать нужно одновременно несколько источников.
UMA Optimistic Oracle — результат публикуется провайдером, есть период оспаривания. Если никто не оспорил — считается достоверным. Если оспорили — UMA-стейкеры голосуют. Медленнее, но более децентрализован.
Kleros — децентрализованный арбитраж для спорных случаев, не для каждого матча.
Для продакшн-системы — комбинация: автоматическое разрешение через Chainlink для очевидных результатов, Kleros для edge cases (матч прерван, технические инциденты).
Архитектура контрактов
Структура пула ликвидности
Пул похож на Uniswap LP, но с несколькими отличиями:
- LP-токен представляет долю в пуле (аналог LP-токена AMM)
- Ликвидность заблокирована на период активных событий (нельзя withdraw пока есть открытые ставки)
- Withdrawal queue при массовом выводе
struct LiquidityPool {
uint256 totalLiquidity; // USDC в пуле
uint256 lockedLiquidity; // заблокировано для покрытия открытых ставок
uint256 totalShares; // LP-токены
mapping(address => uint256) shares;
}
function addLiquidity(uint256 amount) external {
// shares рассчитываются пропорционально текущей стоимости пула
uint256 newShares = totalShares == 0
? amount
: amount * totalShares / totalLiquidity;
// ...
}
lockedLiquidity — максимально возможная выплата по всем открытым ставкам. LP не может вывести ликвидность ниже этого порога. Это инвариант безопасности: пул всегда способен рассчитаться по текущим ставкам.
Ставки как NFT или fungible?
Два подхода: ставка как ERC-721 NFT (уникальна, может торговаться на вторичном рынке) или как запись в маппинге контракта.
ERC-721 открывает возможность ставочного маркетплейса — пользователь может продать выигрышную ставку до завершения события. Это дополнительная ликвидность для пользователей и дополнительный revenue для протокола (комиссия с вторичных сделок). Azuro использует именно этот подход через betting ERC-721.
Трейдоффы: чуть выше gas на создание ставки (~50k gas vs ~30k для маппинга), сложнее аудируется.
Экономика провайдеров ликвидности
Доходность LP = маржа беттинговой платформы - выплаты по выигрышным ставкам. При марже 5% и сбалансированных ставках — LP зарабатывает ~5% годовых плюс дополнительный yield от неиспользованной ликвидности (стейкинг USDC в Aave, пока события не закрыты).
Риск: при серии крупных upset-результатов (все андердоги выигрывают) — LP теряет. Insurance fund из части комиссий частично буферизует эти потери.
Ориентиры по срокам
Базовый беттинговый пул с фиксированными odds и centralized оракулом — 1-2 недели. Полноценный протокол с динамическими odds, оракулом Chainlink, LP-токеномикой и вторичным рынком ставок — 6-10 недель.
Стоимость рассчитывается после обсуждения архитектуры и источников данных о результатах.







