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
+18
View File
@@ -28,6 +28,22 @@
> - Remote-адреса: `https://git.binom.pw/<owner>/<repo>.git`.
> - Ветки: `smart-updown-server` и `fun-game-front2` — `main`; `Smart-game` сейчас на `extract-sources`.
## Внешние зависимости (upstream)
binance-market — это **не часть игры**, а **общий инфраструктурный сервис инвест-кластера**,
который игра «Бинарная ракета» использует как **upstream-провайдер цены SOL**
(вместо заглушки `RandomPriceSource`, см. ADR-006 → ADR-007).
| Компонент | Репозиторий | Путь (локально) | Язык/стек | Роль для игры |
|---|---|---|---|---|
| **binance-market** (upstream цены) | `subochev/binance-market` | `~/common-projects/invest/binance-market` | Kotlin / Spring Boot 3.3.5 WebFlux | собирает рыночные данные с Binance (Binance WS: `depth@100ms` + `aggTrade`); выдаёт last-trade через `GET /ws/price?symbol=<sym>` (порт 8080) и через NATS-топик `market.price.<symbol>`; релейер использует это как **`PriceSource`** (см. ADR-007) |
Контракт между игрой и сервисом:
- **В кластере (предпочтительно):** подписка на NATS-топик `market.price.solusdt` (адрес задаётся
в релейере; прод-адрес см. в его конфиге).
- **Снаружи кластера / тест:** WebSocket `ws://<binance-market-хост>:8080/ws/price?symbol=solusdt`.
- Покрытие символов сейчас: `btcusdt,ethusdt,solusdt` (конфиг `binance.symbols` в values.yaml чарта).
## Принятые решения (сводка)
Ссылка на полный журнал — `docs/DECISIONS.md`. Ключевое:
@@ -35,6 +51,7 @@
- **Курс — живой рыночный** (Способ 1): ставки в фантиках, ввод/вывод через swap.
- **decimals = 6**, токен через **Token-2022** (по доке pump.fun `create_v2`).
- Ставки идут **фантиками через контракт** → контракт переводить с SOL на SPL-токен (это ядро).
- **Цена SOL** — от внешнего upstream `binance-market` (ADR-007), не своя оракуль-логика.
Как ходят данные (кто кому что шлёт, включая согласие/подпись игрока) — `docs/FLOW.md`
(sequence-диаграммы: текущий localnet-режим без Phantom и целевой боевой с pump.fun+Phantom).
@@ -46,6 +63,7 @@
- [ ] Фаза 1 — контракт на токене — **не начато**
- [ ] Фаза 4 — задействовать свап-клиент — **клиент готов**
- [ ] Фаза 5 — фронт (баланс/пополнение/вывод) — **не начато**
- [ ] Интеграция с `binance-market` (NATS/WS-клиент `PriceSource`) — **см. ADR-007**
## Прочее
- Ночная экономика и mint-адреса: `docs/ECONOMY.md` (создаётся в Фазе 0).
+4 -4
View File
@@ -21,14 +21,14 @@
- **Фаза 2 (активная):** релейер перевести с SOL на токен (ops/pda/config). После неё + E2E на localnet.
- **Веха «первый щуп»:** 👉 *как только релейер на фантиках + E2E на localnet прогнаны — через `test-front` вы самостоятельно щупаете: пополнить фантики → ставка → результат.* Это первый реальный user-тест (без Unity).
**Параллельные TODO (не блокируют Фазу 2):** реальная цена (вместо RandomPriceSource), эмиссия, ликвидность/комиссии swap.
**Параллельные TODO (не блокируют Фазу 2):** реальная цена (вместо `RandomPriceSource` — источник выбран: `binance-market`, ADR-007, остаётся интеграция), эмиссия, ликвидность/комиссии swap.
---
## Фаза 0 — Экономика и спека (кросс)
- [ ] **TODO** ADR-002 зафиксирован, документировать `ECONOMY.md`: токен, курс (Способ 1), decimals=6, mint-адреса — `[pump.meta]`
- [x] **DONE** Решить «вверх/вниз» — предмет ставки = цена SOL (ADR-006), валюта = фантики
- [ ] **TODO** Цена SOL: реальный источник вместо `RandomPriceSource` (оракул/провайдер) — не блокирует Фазу 1
- [ ] **IN_PROGRESS** Цена SOL: реальный источник (ADR-007) — `subochev/binance-market` (NATS `market.price.solusdt` или WS `/ws/price?symbol=solusdt`); остаётся интеграция `PriceSource` в релейере
- [ ] **TODO** Кто держит ликвидность swap и комиссии — `[pump.meta]`
- [ ] **TODO** Эмиссия: разовая vs постоянная — `[pump.meta]`
@@ -43,7 +43,7 @@
## Фаза 2 — Релейер и цена (АКТИВНАЯ — следующий шаг)
- [ ] **IN_PROGRESS** SolanaClient/ops: подписывать/отправлять токеновую ставку (ATA + ваулт) — перевести релейер с SOL на токен
- [ ] **TODO** readGlobal: баланс vault_token вместо SOL; ensureVaultFunded — наливать токен в vault
- [ ] **TODO** PriceSource: реальная цена (вместо RandomPriceSource)
- [ ] **IN_PROGRESS** PriceSource: реальная цена (вместо `RandomPriceSource`) — интеграция с `binance-market` (ADR-007); реализация NATS-консьюмера `market.price.solusdt`
- [ ] **TODO** Интеграционный тест релейера на токеновом флоу
## Фаза 4 — Бэкенд: задействовать swap
@@ -60,7 +60,7 @@
- [x] **DONE** Каркас: Phantom, балансы (фантики+SOL), swap пополнение/вывод через `/api/pump/swap`
- [x] **DONE** Ставка вверх/вниз через контракт с поллингом до SETTLED
- [ ] **TODO** Перевести подпись под токеновую версию контракта (после Фазы 1)
- [ ] **TODO** Реальный провайдер цены вместо RandomPriceSource (за нами)
- [ ] **TODO** Реальный провайдер цены вместо RandomPriceSource (за нами) → `binance-market` (ADR-007)
- [ ] **TODO** Развернуть / дать постоянный URL (nginx/podman) — удобно открывать
## Фаза 6 — E2E и деплой
+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`.