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:
Caffeine
2026-09-14 02:24:53 +03:00
parent 30a17f7d99
commit b8c040dedc
2 changed files with 41 additions and 48 deletions
+10 -17
View File
@@ -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`.
---