fb9a7f4e8b
- 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
56 lines
4.0 KiB
Markdown
56 lines
4.0 KiB
Markdown
# 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.
|
||
- Логи/цикл работают с токен-единицами. |