docs: привести README и API.md в соответствие с живым стендом
Оба файла описывали состояние, которого больше нет, и содержали ошибки, из-за которых внешний разработчик не собрал бы рабочий фронт: - README описывал Phantom, swap ввод/вывод (POST /api/pump/swap), STUB-ключи и Фазу 1 — ничего этого в index.html нет. Указан нерабочий API base (smart-updown.binom.pw вместо testfront.binom.pw) и адрес контракта FMM…. «Ставка через поллинг» — поллинга нет, события по WS. - API.md держал раздел «часть ставок зависает без исхода» со статусом «не исправлено» — баг закрыт 14.09.2026 в контракте. По этой доке писали бы обходной код под проблему, которой нет. README переписан под фактический index.html: HTTP-шлюз без Phantom, сценарий кошелёк→фаусет→ставка→WS-исход, три исхода, правило 409. Секция API.md заменена на «Ничья при exitPrice == entryPrice» (штатный исход, доля ~трети), историческая сноска на SEC-9 сохранена. Проверено: полный сценарий снаружи по новой доке проходит (кошелёк → фаусет 10000 → ставка id=44 → исход по балансу).
This commit is contained in:
@@ -144,27 +144,20 @@ await fetch(`${BASE}/bet`, {
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ Известная проблема: часть ставок зависает без исхода
|
||||
## Ничья при `exitPrice == entryPrice`
|
||||
|
||||
**Симптом:** пришло `bet_open`, а `bet_closed` не приходит вообще; повторная ставка с того же
|
||||
адреса вечно отвечает `409`.
|
||||
Если цена на момент экспирации в точности равна цене входа, ставка **не зависает**:
|
||||
контракт возвращает игроку **ровно сумму ставки без множителя**, ставка переходит в
|
||||
статус `3`, по WS уходит `bet_closed` со `statusName: "refunded"`.
|
||||
|
||||
**Причина:** если цена на момент экспирации в точности равна цене входа, контракт
|
||||
(`close_bet.rs:66`) молча выходит `return Ok(())` — статус остаётся `open`, ставка не
|
||||
финализируется. А поскольку цена выхода берётся по **фиксированному** моменту экспирации,
|
||||
повторные попытки планировщика получают ту же самую пару значений — и цикл не заканчивается
|
||||
никогда (лог: `settle: #N still open (exit==entry at …), will retry`).
|
||||
Доля таких окон — около **трети** ставок (замер 33.6 % на 34 769 окнах). Это **нормальный
|
||||
штатный исход**, а не ошибка: клиенту надо просто показать третий вид результата.
|
||||
|
||||
**Масштаб (замер на 580 минутах живой истории, 34 769 окон):** **33.6 %** ставок попадают в
|
||||
равные цены — **примерно каждая третья**.
|
||||
Рекомендация фронту: обрабатывать **три** исхода `bet_closed` (`payout_done` / `house_won`
|
||||
/ `refunded`) и не показывать `refunded` как проигрыш.
|
||||
|
||||
**Что это значит для фронта:** каждая третья ставка не завершится, а игрок потеряет
|
||||
возможность играть с этого адреса (правило «одна открытая ставка» + `409`).
|
||||
**Обходите:** для каждого игрока используйте новый адрес на ставку, либо показывайте
|
||||
«ставка в ожидании».
|
||||
|
||||
**Статус:** не исправлено, ждёт решения владельца (политика ничьей / закрытие соседней ценой
|
||||
из истории). Подробности — `pump-game-ops/docs/SECURITY.md`, пункт **SEC-9**.
|
||||
> Исторически (до 14.09.2026) такие ставки зависали навсегда; разбор —
|
||||
> `pump-game-ops/docs/SECURITY.md`, пункт `SEC-9`.
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user