Hermes Agent 101a4b60a9 docs(sec): SEC-16 — безвозвратная утечка ренты PDA-ставки с кошелька игрока
Найдено при приёмке боевого домена smart-updown.binom.pw (симптом «SOL не обновляется»).

- SEC-16: при create_bet ренту PDA-аккаунта ставки (1 559 040 lamports = (96+32+128)*6960)
  платит БЕТТОР, а не шлюз; баланс шлюза-админа при этом не меняется (замер whose-fee.cjs).
  Аккаунт не закрывается никогда (в контракте 9ALs четыре инструкции, ни одной close = bettor)
  → рента теряется безвозвратно. В цепи 75 аккаунтов = 0.116928 SOL заперто, растёт линейно.
  Вердикт: на тестах терпимо (маскируется краном, 5 SOL = ~3207 раундов), перед mainnet — блокер.
- TASKS.md: фича «если цена не изменилась — подождать ещё 15 с» (НЕ доделана), заметка про
  боевой домен на общем TS-шлюзе и лаг крана 8–13 с.
- tools: доказательные скрипты (whose-fee, bet-pda-rent, faucet-latency, sol-balance-cycle,
  settle-math-test, backend-full-test) + README с питфоллами замера.
- k8s/smart-updown-api-ingress.yaml: /api,/ws вынесены вне helm (релиз игры их сносил).
2026-09-15 05:57:34 +03:00

pump-game-ops — мета-репозиторий проекта «Бинарная ракета» (Binary Rocket)

Единая точка для сервисной документации, принятых решений и списка задач проекта мемкойн-игры на pump.fun. Кода тут нет — только то, что связывает компоненты между собой (индексация), и что не живёт в конкретных репозиториях.

Что это и зачем

У нас много компонентов (фронт, бэкенд, контракт, релейер). Здесь мы ведём:

  • карту репозиториев (кто за что отвечает, где какая часть),
  • журнал решений (почему так, а не иначе — ADR),
  • экономику токена (свой мемкойн, курс, decimals, mint-адреса),
  • список задач/статусы (трекаем весь проект тут — включая задачи, встающие на кросс-компонентные решения: forkable/pivotable и т.п.).

Карта репозиториев

# Компонент Репозиторий Путь (локально) Язык/стек Роль
1 Смарт-контракт (оригинал) akovalenko/Smart-game ~/WORK/games/Smart-game Rust/Anchor (Solana) игровая логика ставок вверх/вниз, ваулт, выплата (SOL, не трогаем)
1b Смарт-контракт (фантики) subochev/smart-updown-token ~/WORK/games/smart-updown-token Rust/Anchor (Solana) копия Smart-game для перевода на наши фантики (SPL-токен) — работаем тут
2 Бэкенд (релейер) subochev/smart-updown-server ~/WORK/games/smart-updown-server Kotlin/Spring Boot + solanaj ретрансляция ставок, свап-клиент к pump.fun, релейер
3 Фронт (Unity) subochev/fun-game-front2 ~/WORK/games/fun-game-front2 Unity WebGL + Phantom UI, кошелёк, подпись create_bet
4 Тестовый фронт subochev/test-front ~/WORK/games/test-front HTML/JS + Phantom технический дашборд для ручного теста экономики (пополнение/ставка/вывод) без Unity
5 Мета-репо (этот) subochev/pump-game-ops ~/WORK/games/pump-game-ops Markdown документация, решения, задачи

Примечания:

  • 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. Ключевое:

  • Свой токен на pump.fun (мемкойн Binary Rocket), не чужой.
  • Курс — живой рыночный (Способ 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).

Статус проекта (сводка)

Задачи и статусы — в TASKS.md (или docs/TASKS.md). Здесь — только верхи:

  • Фаза 0 — экономика (токен, курс, mint) — в работе
  • Фаза 1 — контракт на токене — не начато
  • Фаза 4 — задействовать свап-клиент — клиент готов
  • Фаза 5 — фронт (баланс/пополнение/вывод) — не начато
  • Интеграция с binance-market (NATS/WS-клиент PriceSource) — см. ADR-007

Безопасность

Открытый чек-лист — docs/SECURITY.md (пункты SEC-1…SEC-15, аудит живого стенда 2026-09-13). Критично на сегодня (SEC-1…SEC-6): у контракта нет верхней границы окна закрытия ставки и нет серверного авто-закрытия — момент расчёта выбирает клиент, что даёт безрисковый арбитраж. Плюс открытые наружу /bet, /close, /faucet без авторизации.

Прочее

  • Ночная экономика и mint-адреса: docs/ECONOMY.md (создаётся в Фазе 0).
  • Разделы задач общего характера (например, мок/деплой/стабильность) — в TASKS.md.
S
Description
Мета-репозиторий Binary Rocket: карта репозиториев, решения (ADR), экономика токена, трекер задач
Readme 381 KiB
Languages
JavaScript 88.2%
Shell 11.8%