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:
@@ -28,6 +28,22 @@
|
|||||||
> - Remote-адреса: `https://git.binom.pw/<owner>/<repo>.git`.
|
> - Remote-адреса: `https://git.binom.pw/<owner>/<repo>.git`.
|
||||||
> - Ветки: `smart-updown-server` и `fun-game-front2` — `main`; `Smart-game` сейчас на `extract-sources`.
|
> - Ветки: `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`. Ключевое:
|
Ссылка на полный журнал — `docs/DECISIONS.md`. Ключевое:
|
||||||
@@ -35,6 +51,7 @@
|
|||||||
- **Курс — живой рыночный** (Способ 1): ставки в фантиках, ввод/вывод через swap.
|
- **Курс — живой рыночный** (Способ 1): ставки в фантиках, ввод/вывод через swap.
|
||||||
- **decimals = 6**, токен через **Token-2022** (по доке pump.fun `create_v2`).
|
- **decimals = 6**, токен через **Token-2022** (по доке pump.fun `create_v2`).
|
||||||
- Ставки идут **фантиками через контракт** → контракт переводить с SOL на SPL-токен (это ядро).
|
- Ставки идут **фантиками через контракт** → контракт переводить с SOL на SPL-токен (это ядро).
|
||||||
|
- **Цена SOL** — от внешнего upstream `binance-market` (ADR-007), не своя оракуль-логика.
|
||||||
|
|
||||||
Как ходят данные (кто кому что шлёт, включая согласие/подпись игрока) — `docs/FLOW.md`
|
Как ходят данные (кто кому что шлёт, включая согласие/подпись игрока) — `docs/FLOW.md`
|
||||||
(sequence-диаграммы: текущий localnet-режим без Phantom и целевой боевой с pump.fun+Phantom).
|
(sequence-диаграммы: текущий localnet-режим без Phantom и целевой боевой с pump.fun+Phantom).
|
||||||
@@ -46,6 +63,7 @@
|
|||||||
- [ ] Фаза 1 — контракт на токене — **не начато**
|
- [ ] Фаза 1 — контракт на токене — **не начато**
|
||||||
- [ ] Фаза 4 — задействовать свап-клиент — **клиент готов**
|
- [ ] Фаза 4 — задействовать свап-клиент — **клиент готов**
|
||||||
- [ ] Фаза 5 — фронт (баланс/пополнение/вывод) — **не начато**
|
- [ ] Фаза 5 — фронт (баланс/пополнение/вывод) — **не начато**
|
||||||
|
- [ ] Интеграция с `binance-market` (NATS/WS-клиент `PriceSource`) — **см. ADR-007**
|
||||||
|
|
||||||
## Прочее
|
## Прочее
|
||||||
- Ночная экономика и mint-адреса: `docs/ECONOMY.md` (создаётся в Фазе 0).
|
- Ночная экономика и mint-адреса: `docs/ECONOMY.md` (создаётся в Фазе 0).
|
||||||
|
|||||||
@@ -21,14 +21,14 @@
|
|||||||
- **Фаза 2 (активная):** релейер перевести с SOL на токен (ops/pda/config). После неё + E2E на localnet.
|
- **Фаза 2 (активная):** релейер перевести с SOL на токен (ops/pda/config). После неё + E2E на localnet.
|
||||||
- **Веха «первый щуп»:** 👉 *как только релейер на фантиках + E2E на localnet прогнаны — через `test-front` вы самостоятельно щупаете: пополнить фантики → ставка → результат.* Это первый реальный user-тест (без Unity).
|
- **Веха «первый щуп»:** 👉 *как только релейер на фантиках + E2E на localnet прогнаны — через `test-front` вы самостоятельно щупаете: пополнить фантики → ставка → результат.* Это первый реальный user-тест (без Unity).
|
||||||
|
|
||||||
**Параллельные TODO (не блокируют Фазу 2):** реальная цена (вместо RandomPriceSource), эмиссия, ликвидность/комиссии swap.
|
**Параллельные TODO (не блокируют Фазу 2):** реальная цена (вместо `RandomPriceSource` — источник выбран: `binance-market`, ADR-007, остаётся интеграция), эмиссия, ликвидность/комиссии swap.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Фаза 0 — Экономика и спека (кросс)
|
## Фаза 0 — Экономика и спека (кросс)
|
||||||
- [ ] **TODO** ADR-002 зафиксирован, документировать `ECONOMY.md`: токен, курс (Способ 1), decimals=6, mint-адреса — `[pump.meta]`
|
- [ ] **TODO** ADR-002 зафиксирован, документировать `ECONOMY.md`: токен, курс (Способ 1), decimals=6, mint-адреса — `[pump.meta]`
|
||||||
- [x] **DONE** Решить «вверх/вниз» — предмет ставки = цена SOL (ADR-006), валюта = фантики
|
- [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** Кто держит ликвидность swap и комиссии — `[pump.meta]`
|
||||||
- [ ] **TODO** Эмиссия: разовая vs постоянная — `[pump.meta]`
|
- [ ] **TODO** Эмиссия: разовая vs постоянная — `[pump.meta]`
|
||||||
|
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
## Фаза 2 — Релейер и цена (АКТИВНАЯ — следующий шаг)
|
## Фаза 2 — Релейер и цена (АКТИВНАЯ — следующий шаг)
|
||||||
- [ ] **IN_PROGRESS** SolanaClient/ops: подписывать/отправлять токеновую ставку (ATA + ваулт) — перевести релейер с SOL на токен
|
- [ ] **IN_PROGRESS** SolanaClient/ops: подписывать/отправлять токеновую ставку (ATA + ваулт) — перевести релейер с SOL на токен
|
||||||
- [ ] **TODO** readGlobal: баланс vault_token вместо SOL; ensureVaultFunded — наливать токен в vault
|
- [ ] **TODO** readGlobal: баланс vault_token вместо SOL; ensureVaultFunded — наливать токен в vault
|
||||||
- [ ] **TODO** PriceSource: реальная цена (вместо RandomPriceSource)
|
- [ ] **IN_PROGRESS** PriceSource: реальная цена (вместо `RandomPriceSource`) — интеграция с `binance-market` (ADR-007); реализация NATS-консьюмера `market.price.solusdt`
|
||||||
- [ ] **TODO** Интеграционный тест релейера на токеновом флоу
|
- [ ] **TODO** Интеграционный тест релейера на токеновом флоу
|
||||||
|
|
||||||
## Фаза 4 — Бэкенд: задействовать swap
|
## Фаза 4 — Бэкенд: задействовать swap
|
||||||
@@ -60,7 +60,7 @@
|
|||||||
- [x] **DONE** Каркас: Phantom, балансы (фантики+SOL), swap пополнение/вывод через `/api/pump/swap`
|
- [x] **DONE** Каркас: Phantom, балансы (фантики+SOL), swap пополнение/вывод через `/api/pump/swap`
|
||||||
- [x] **DONE** Ставка вверх/вниз через контракт с поллингом до SETTLED
|
- [x] **DONE** Ставка вверх/вниз через контракт с поллингом до SETTLED
|
||||||
- [ ] **TODO** Перевести подпись под токеновую версию контракта (после Фазы 1)
|
- [ ] **TODO** Перевести подпись под токеновую версию контракта (после Фазы 1)
|
||||||
- [ ] **TODO** Реальный провайдер цены вместо RandomPriceSource (за нами)
|
- [ ] **TODO** Реальный провайдер цены вместо RandomPriceSource (за нами) → `binance-market` (ADR-007)
|
||||||
- [ ] **TODO** Развернуть / дать постоянный URL (nginx/podman) — удобно открывать
|
- [ ] **TODO** Развернуть / дать постоянный URL (nginx/podman) — удобно открывать
|
||||||
|
|
||||||
## Фаза 6 — E2E и деплой
|
## Фаза 6 — E2E и деплой
|
||||||
|
|||||||
+32
-1
@@ -64,5 +64,36 @@
|
|||||||
сравнивает entry/exit_price цены SOL.
|
сравнивает entry/exit_price цены SOL.
|
||||||
- **Цена SOL сейчас** — случайная заглушка (`RandomPriceSource`). Позже заменяется на реальную
|
- **Цена SOL сейчас** — случайная заглушка (`RandomPriceSource`). Позже заменяется на реальную
|
||||||
(провайдер/оракул). Это отдельная задача, не блокирует Фазу 1 (контракт от способа получения цены не зависит).
|
(провайдер/оракул). Это отдельная задача, не блокирует Фазу 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
@@ -21,7 +21,10 @@
|
|||||||
|
|
||||||
## Курс и балансы
|
## Курс и балансы
|
||||||
- **Валюта ставки:** наши фантики (токен Binary Rocket).
|
- **Валюта ставки:** наши фантики (токен 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; баланс игрока — в фантиках.
|
- **Курс:** живой рыночный (ADR-002). Ввод/вывод через swap pump.fun; баланс игрока — в фантиках.
|
||||||
- **Фантик = 1 токен-единица/10^6.**
|
- **Фантик = 1 токен-единица/10^6.**
|
||||||
- **Баланс игрока:** в ATA (Associated Token Account) на mint; читается `getTokenAccountBalance`.
|
- **Баланс игрока:** в ATA (Associated Token Account) на mint; читается `getTokenAccountBalance`.
|
||||||
|
|||||||
Reference in New Issue
Block a user