Files
smart-updown-token/TASK-relayer-token.md
T
Caffeine fb9a7f4e8b feat(relayer): migrate to SPL-token (фантики)
- ops: readGlobal читает vaultBalance (getTokenAccountBalance), createBet/closeBet передают bettorToken/vaultToken/tokenProgram, ensureVaultFunded наливает токен (mintTo, allowOwnerOffCurve)
- pda: vaultPda([global,vault]), config:.env.new SMART_TOKEN_MINT, суммы в токен-единицах
- check.ts: 14 проверок сигнатур создания create/close под новым токеновым IDL
- @solana/spl-token dependency; .gitignore + node_modules/dist
2026-09-10 00:19:21 +03:00

56 lines
4.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.
- Логи/цикл работают с токен-единицами.