ADR-007: источник цены SOL = upstream binance-market (NATS / WS)

- README: новая секция «Внешние зависимости» — binance-market как общий
  инфраструктурный upstream, а не часть игры (~/common-projects/invest/binance-market,
  контракт: NATS market.price.solusdt или WS /ws/price).
- docs/DECISIONS: добавлен ADR-007 с обоснованием; ADR-006 получил апдейт-сноску.
- docs/ECONOMY: «Курс и балансы» — указано, откуда берётся реальная цена SOL.
- TASKS: задачи «Цена SOL: реальный источник» (Фаза 0) и «PriceSource: реальная
  цена» (Фаза 2) переведены из TODO в IN_PROGRESS, со ссылкой на ADR-007 и
  binance-market; test-front задача тоже помечена.
This commit is contained in:
2026-09-12 01:10:09 +03:00
parent ba14806e6c
commit 6e54e9ef4b
4 changed files with 58 additions and 6 deletions
+32 -1
View File
@@ -64,5 +64,36 @@
сравнивает entry/exit_price цены SOL.
- **Цена SOL сейчас** — случайная заглушка (`RandomPriceSource`). Позже заменяется на реальную
(провайдер/оракул). Это отдельная задача, не блокирует Фазу 1 (контракт от способа получения цены не зависит).
**→ Обновление 2026-09-11:** реальный источник выбран — см. ADR-007.
- **Следствие:** фантики = касса/валюта ввода-вывода; контракт оперирует токеном, но исход считает
по цене SOL. Экономика токена (ADR-002 живой курс) не влияет на логику «вверх/вниз».
по цене SOL. Экономика токена (ADR-002 живой курс) не влияет на логику «вверх/вниз».
---
## ADR-007 — Источник цены SOL = upstream-сервис `binance-market`
- **Дата:** 2026-09-11
- **Статус:** принято
- **Суть:** цена SOL для `PriceSource` берётся из уже работающего в инвест-кластере сервиса
`binance-market` (репо `subochev/binance-market`), а не из своей оракуль-логики и не из прямого
опроса Binance. Контракт между игрой и сервисом — публичный:
- **NATS-подписка** на топик `market.price.solusdt` (предпочтительно, в кластере); либо
- **WebSocket** `ws://<binance-market>:8080/ws/price?symbol=solusdt` (fallback / внешние сети).
Источник цены внутри `binance-market` — last-trade (`aggTrade.p` с биржи Binance), тики идут
на каждой сделке → фактически real-time.
- **За:**
- Уже работает и развёрнут в кластере `kube` (ns `invest`), chart `binom/binance-market`,
последний релиз v10. Не надо поднимать ещё один процесс ради цены.
- Есть и NATS, и WS-контракт — обе формы потребления готовы.
- Покрытие `solusdt` уже в списке символов; дополнительных подписок не требуется.
- Цена приходит в тиках сделок (не сэмплинг раз в N секунд) — лучшее разрешение для
сравнения entry/exit в round-based игре.
- Общий сервис инвест-кластера, используется не только этой игрой; его судьба — не наша забота.
- **Против:**
- Один источник (Binance). Если Binance недоступен — игра без цены. Заглушка-fallback
на `RandomPriceSource` остаётся как dev-only.
- Зависимость по латентности от стороннего сервиса. В кластере это несколько мс,
приемлемо.
- **Результат:** задачи «TODO Цена SOL: реальный источник» (Фаза 0) и «PriceSource: реальная цена
(вместо RandomPriceSource)» (Фаза 2) переводятся в `IN_PROGRESS` со ссылкой на это решение.
Никаких новых подписок/оракулов не делаем — только интеграция в релейере (`smart-updown-token`/
`relayer` или `smart-updown-server`). Внешний статус сервиса см. README → «Внешние зависимости».
+4 -1
View File
@@ -21,7 +21,10 @@
## Курс и балансы
- **Валюта ставки:** наши фантики (токен Binary Rocket).
- **Предмет ставки:** направление цены SOL (вверх/вниз) — ADR-006. Сейчас цена SOL — случайная заглушка, позже — реальная.
- **Предмет ставки:** направление цены SOL (вверх/вниз) — ADR-006. **Источник реальной цены SOL**
— upstream-сервис `binance-market` (см. ADR-007 и README → «Внешние зависимости»). Потребление:
NATS-топик `market.price.solusdt` (предпочтительно) или WS `ws://<binance-market>:8080/ws/price?symbol=solusdt`.
В dev/test допускается оставить `RandomPriceSource`-заглушку.
- **Курс:** живой рыночный (ADR-002). Ввод/вывод через swap pump.fun; баланс игрока — в фантиках.
- **Фантик = 1 токен-единица/10^6.**
- **Баланс игрока:** в ATA (Associated Token Account) на mint; читается `getTokenAccountBalance`.