# 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-теста.