Files

43 lines
3.0 KiB
Markdown

# TASK — HTTP-шлюз поверх релейера (чтобы пульт ставил ставки без Phantom)
## Контекст
`smart-updown-token` — контракт на SPL-токене (фантики) + релейер (`relayer/`), который
**уже умеет** на localnet (RPC 8890): `initialize`, `createBet`, `closeBet`, фандинг
ваулта и беттора. Релейер — CLI скрипт (`npm run run`/`--once`), автономный (сам генерирует
ставки через frontStub), **без HTTP-входа**.
Хочется: статичный веб-пульт (`test-front/index.html`, лежит на `game2.binom.pw`) мог
присылать команду «поставить фантиками от адреса X» на маленький HTTP-шлюз, который
вызывает функции релейера и исполняет ставку на localnet — БЕЗ Phantom.
## РЕАЛИЗАЦИЯ (выполни)
Создай в `relayer/` HTTP-шлюз `gateway.ts` (node http, БЕЗ express, только stdlib),
который:
- `POST /bet {address, side, amountUnits}`:
- derives ATA беттора от `address` и mint
- вызывает существующую функцию `createBet` (не переписывай уже готовую логику,
переиспользуй из `ops.ts`/`index.ts`, если нужно — слегка вынеси)
- фандит беттора если надо (как в `fundBettor`)
- возвращает `{tx, id}` (id нового bet) — id вычислить из Global.counter
- `POST /close {id}`: вызывает `closeBet`
- `GET /balance/{address}`: возвращает `{sol, tokenUnits, tokenHuman}` (SOL-баланс +
токен-баланс по ATA беттора). Токен-баланс — через `getTokenAccountBalance` по ATA.
- `GET /state`: вернуть Global (min/max/expiry, counter) — реюз там же.
- CORS: `Access-Control-Allow-Origin: *` (фронт на другом домене/порту может).
- Порт — из env `GW_PORT` (default 8895). Слушать на 0.0.0.0.
- Логирование запросов в stdout.
Запуск: `npm run gateway` → `ts-node src/gateway.ts`. Проверь `npm run typecheck` и
`npm test` — не ломать существующий релейер.
## НЕ делать
- Не менять контракт `program/`.
- Не переписывать саму логику ставки — только дёргать готовые функции.
- Не коммитить.
## Гейт
- `npm run typecheck` 0 ошибок, `npm test` зелёный.
- Шлюз стартует и отвечает на `GET /state` и `POST /bet` (проверь на localnet 8890:
init уже выполнен).
Отчитайся: какие файлы создал/изменил, как запускать, результат smoke-теста.