18ecbb42b3
15 пунктов, отмечаются [ ]/[x]. Критичное найдено воспроизведением на testfront.binom.pw, не чтением кода: - close_bet проверяет только нижнюю границу окна (now >= expire_time) — верхней нет, ставка висит open бесконечно, момент расчёта выбирает вызывающий /close; - в шлюзе нет авто-закрытия (единственный setInterval — WS-heartbeat); - /bet, /close, /faucet открыты наружу без авторизации; faucet выдал 5 SOL + 10000 фантиков при SMART_ALLOW_AIRDROP=1 в боевом поде; - эксплойт воспроизведён: ставка DOWN (entry=9998000000) висела open >2 мин после экспирации 15с и закрыта при exitPrice=9997000000 -> payout_done. Плюс: множитель 1.3x требует 77% винрейта, запертые средства в ваулте, равные цены не финализируют ставку, NATS без auth, релейер — точка доверия.
9.2 KiB
9.2 KiB
TASKS.md — список задач (трекер проекта)
Здесь живёт весь список задач — не только мои. Трекаем проект целиком. Бинарные составляющие:
- фаркул/pivotable-задачи (что можно отложить или развернуть иначе) помечаются
[pivotable]; - общие/инфра (деплой, стабильность, мок) —
[pump.meta].
Статусы: TODO / IN_PROGRESS / DONE / BLOCKED.
⭐ Актуальное состояние (2026-09-13)
Где мы: цена SOL — реальная, из NATS, шлюз и тестовый фронт крутятся в k3s на
testfront.binom.pw. Первый щуп экономики закрыт: ставка → раунд → результат считается
по живой рыночной цене.
Новое (2026-09-13):
- Цена SOL берётся из NATS (
market.price.solusdt), заглушка удалена — ADR-007, детали вdocs/PRICE-NATS.md. - Шлюз раздаёт цену фронту по WebSocket:
wss://testfront.binom.pw/api/ws. test-frontпоказывает живую цену SOL.- Оба контейнера (статика + шлюз) — в k3s, ns
game, один домен через ингресс. - Solana localnet пересобрана с нуля, контракт задеплоен (
9ALs…).
⭐ Предыдущее состояние (2026-09-09)
Где мы: Фаза 1 (контракт переведён на фантики) — DONE. Сейчас вход в Фазу 2 (релейер под токен).
Готово:
- Контракт
smart-updown-token— переведён на SPL-токен (фантики), IDL+тесты обновлены. Коммит45d64d4. - Ktor swap-клиент в бэкенде (ввод/вывод) — заготовка.
- Тестовый фронт
test-front— каркас (Phantom, балансы, пополнение/вывод).
В работе / вперёд:
- Фаза 2 (активная): релейер перевести с SOL на токен (ops/pda/config). После неё + E2E на localnet.
- Веха «первый щуп»: 👉 как только релейер на фантиках + E2E на localnet прогнаны — через
test-frontвы самостоятельно щупаете: пополнить фантики → ставка → результат. Это первый реальный user-тест (без Unity).
Параллельные TODO (не блокируют Фазу 2): реальная цена (вместо RandomPriceSource — источник выбран: binance-market, ADR-007, остаётся интеграция), эмиссия, ликвидность/комиссии swap.
Фаза 0 — Экономика и спека (кросс)
- TODO ADR-002 зафиксирован, документировать
ECONOMY.md: токен, курс (Способ 1), decimals=6, mint-адреса —[pump.meta] - DONE Решить «вверх/вниз» — предмет ставки = цена SOL (ADR-006), валюта = фантики
- DONE Цена SOL: реальный источник (ADR-007) —
subochev/binance-marketчерез NATSmarket.price.solusdt; интеграцияPriceSourceв релейере сделана (ADR-008, 2026-09-13) - TODO Кто держит ликвидность swap и комиссии —
[pump.meta] - TODO Эмиссия: разовая vs постоянная —
[pump.meta]
Фаза 1 — Контракт на токене (ядро) — репо smart-updown-token (копия Smart-game)
- DONE Создана копия контракта
smart-updown-token(ветка main, чистый) — работаем тут - DONE Перевести
create_betс SOL (lamports) на SPL-токен: приём фантиков с ATA игрока на ваулт - DONE Выплата в
close_betфантиками из ATA-ваулта на ATA игрока - DONE
state/constants: единицы = token units (decimals=6), + VAULT_SEED - DONE Обновить IDL (idl/ + relayer/idl/) + Anchor-тесты (10/10) — коммит 45d64d4
- DONE Localnet стенд поднят заново (ledger пересобран), контракт задеплоен, mint создан,
initпрогнан (2026-09-13) - DONE E2E живьём: ставка → close по реальной цене из NATS (
entryPrice=10195000000при курсе 101.95)
Фаза 2 — Релейер и цена (АКТИВНАЯ — следующий шаг)
- IN_PROGRESS SolanaClient/ops: подписывать/отправлять токеновую ставку (ATA + ваулт) — перевести релейер с SOL на токен
- TODO readGlobal: баланс vault_token вместо SOL; ensureVaultFunded — наливать токен в vault
- DONE PriceSource: реальная цена (вместо
RandomPriceSource) — интеграция сbinance-market(ADR-007), NATS-консьюмерmarket.price.solusdtвsrc/natsPrice.ts, цена ×1e8 (ADR-008) - TODO Интеграционный тест релейера на токеновом флоу
Фаза 4 — Бэкенд: задействовать swap
- DONE Ktor
PumpApiClient+POST /agents/swap+ DTO + заготовка (вsmart-updown-server) - TODO Проверить реальный swap на devnet (не мок)
- TODO Обвязать
GameService: ввод/вывод фантиков через swap
Фаза 5 — Фронт (Unity)
- TODO Кнопки «Пополнить»/«Вывести», баланс в фантиках
- TODO SolanaBridge.jslib: подпись токеновой create_bet (ATA игрока в ключах)
- TODO Wallet.cs: баланс в фантиках (ATA + getTokenAccountBalance), CanAfford по токену
Фаза 5b — Тестовый фронт (test-front, для ручной гонки экономики без Unity)
- DONE Каркас: Phantom, балансы (фантики+SOL), swap пополнение/вывод через
/api/pump/swap - DONE Ставка вверх/вниз через контракт с поллингом до SETTLED
- TODO Перевести подпись под токеновую версию контракта (после Фазы 1)
- DONE Реальный провайдер цены вместо RandomPriceSource (за нами) →
binance-marketчерез NATS (ADR-007/ADR-008) - DONE Живая цена SOL по WebSocket (
wss://testfront.binom.pw/api/ws), вывод на странице — релиз 2 - DONE Развернуть / дать постоянный URL —
https://testfront.binom.pw(k3s, nsgame, ингресс; релиз 2)
Фаза 6 — E2E и деплой
- TODO Полный круг на devnet: создать токен → swap ввод → ставка токеном → раунд → вывод
- TODO Обновить
API.md/INTEGRATION.md, развернуть на mainnet - TODO Стабильность: версионировать конфиги, mint-адрес в конфиге
Ссылки
- Решения/экономика:
docs/DECISIONS.md,docs/ECONOMY.md - Карта репозиториев:
README.md
Фаза 7 — Цена из NATS и деплой в куб (2026-09-13)
- DONE ADR-007: цена SOL из NATS (
market.price.solusdt), заглушка удалена - DONE
natsPrice.ts— подписка NATS, последняя цена,waitForPrice, ×1e8 строковым парсером - DONE
gateway.ts— WS/ws,GET /price, нормализация/api/...→/... - DONE
test-front— блок «Цена SOL (WebSocket)»: цена, статус, автопереподключение - DONE Dockerfile + helm для шлюза и фронта; деплой в k3s ns
game - DONE Роут
testfront.binom.pwпереведён с 76.199 на куб 76.120 (Traefik VDS) - DONE Релизы:
smart-updown-token7,test-front2 - DONE Документация:
docs/PRICE-NATS.md,docs/diagrams/price-flow.puml, ADR-007 - TODO Пилот: смена
entry_priceна «реальный источник как оракул» до боя (Pyth/Switchboard) - TODO Деградация при отсутствии цены: отдельное решение (бэкфилл/остановка приёма ставок)
Ссылки (дополнено 2026-09-13)
- Цена:
docs/PRICE-NATS.md, диаграммаdocs/diagrams/price-flow.puml - Безопасность:
docs/SECURITY.md— чек-лист (15 открытых пунктов, аудит живого стенда 2026-09-13)