Files
smart-updown-token/TASK-relayer-token.md
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

4.0 KiB
Raw Permalink Blame History

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.
  • Логи/цикл работают с токен-единицами.