# TASK — Фаза 2: перевести релейер с SOL на фантики (SPL-токен) Репозиторий: `smart-updown-token` (тот, где контракт уже на токене). Работаем ТОЛЬКО в `relayer/`. Контракт уже переведён (Фаза 1, коммит 45d64d4) — релейер теперь должен звать его токеновые инструкции. ## Контекст - Контракт переведён: `create_bet` escrow'ит фантики bettor→vault; `close_bet` платит vault→bettor. - Новые аккаунты в инструкциях: `bettor_token`, `vault_token`, `token_program`. IDL уже содержит их (в `relayer/idl/smart_updown.json` — регенерирован). - Сейчас `relayer/` заточен под SOL: `readGlobal` берёт `getBalance(global)`, `ensureVaultFunded` airdrop'ит SOL, `createBet/closeBet` не передают токен-аккаунты. ## Что сделать (в `relayer/src/` и `relayer/`) ### 1. `pda.ts` - Добавить `vaultPda(programId): PublicKey` — PDA по седам `[b"global", b"vault"]` (совпадает с контрактом). - (Убедиться, что `globalPda` и `betPda` соответствуют контракту.) ### 2. `config.ts` - Добавить `tokenMint: PublicKey` (mint наших фантиков) в конфиг/cfg, с default-плейсхолдером. - Проверить `.env.example` — добавить переменную для mint (напр. `TOKEN_MINT`). ### 3. `ops.ts` - **`readGlobal`**: вместо `getBalance(global)` (SOL) — читать **баланс `vault_token`** (PDA `vaultPda`), через connection/getTokenAccountBalance (или через spl-token). Поле, что возвращаем, переименовать/пометить как `vaultBalance` (в токен-единицах). - **`createBet`**: в `.accounts` добавить `bettor_token` (ATA bettor), `vault_token` (vaultPda), `token_program`. `min/amount` — уже в токен-единицах (не lamports), логировать в токене. - **`closeBet`**: в `.accounts` добавить `bettor_token` (ATA bettor по адресу из bet), `vault_token`, `token_program`. - **`ensureVaultFunded`**: теперь не airDrop SOL в global, а **наливать токен в vault_token** — на localnet можно mint'ить mint-авторити (токен создать/налить). Либо вызывать mint по необходимости. Не SOL. ### 4. `index.ts` (главный цикл) - Привести в соответствие: вызовы `readGlobal`/`createBet`/`closeBet`/`ensureVaultFunded` — с новыми сигнатурами. - Логирование: суммы в токене, а не в SOL. ### 5. Тесты - Обновить интеграционный тест релейера на токеновом флоу (если есть в `relayer/`): создать mint/ATA, налить токен, прогнать create→close. `npm test` / `ts-node` зелёный. ## Гейты (после каждого шага) - `npm run build` (или `tsc`) — компилируется без ошибок. - В конце: релейер собирается, сигнатуры соответствуют новому IDL. ## ЧЕГО НЕ ДЕЛАТЬ - Не трогать контракт (`program/`). - Не коммитить — всё в рабочем дереве до приёмки человеком. - Не менять `program/` и `deploy/`. - Логику игры (вверх/вниз, статусы) не менять. ## Проверка (что релеер готов) - `npm run build` — 0 ошибок. - Сигнатуры `createBet`/`closeBet` передают `bettor_token`/`vault_token`/`token_program`. - `ensureVaultFunded` наливает токен, а не SOL. - Логи/цикл работают с токен-единицами.