Files
smart-updown-token/TASK-token-migration.md
Caffeine 45d64d45a7 feat: migrate smart-updown contract to SPL-token (фантики)
- create_bet: escrow фантиков с bettor на vault (PDA[global,vault]) через anchor_spl::token
- close_bet: выплата фантиков из vault на bettor (CPI с signer_seeds vault)
- state/constants: comments про единицы (token units decimals=6), + VAULT_SEED
- IDL регенерирован (idl/ + relayer/idl/) с аккаунтами bettor_token/vault_token/token_program
- тесты обновлены под токен (10/10 + doctest)
2026-09-09 22:00:41 +03:00

5.6 KiB
Raw Permalink Blame History

TASK — перевод смарт-контракта smart-updown на фантики (SPL-токен)

Репозиторий: smart-updown-token (копия Smart-game, ветка main). Оригинал НЕ трогаем.

Работаем ТОЛЬКО program/programs/smart-updown/src/**. Остальное (relayer, deploy) не менять в этом проходе.

Цель

Контракт сейчас принимает/выплачивает нативный SOL (lamports) через system_program и add/sub_lamports. Перевести на наши фантики = SPL-token (обычный SPL Token, НЕ Token-2022 — для MVP берём простой стандарт; swap на pump.fun конвертит SOL↔фантики безотносительно стандарта).

Логика игры не меняется: ставка вверх/вниз по цене SOL, entry_price/exit_price — обычные u64 и сравниваются как раньше. Меняется ТОЛЬКО норма расчётов (валюта): с lamports на токен-единицы.

Что изменится

1. state.rs

  • Поля Global остаются (counter, min/max_amount, multiplier_bps, expiry_seconds, paused, admin, relayer). min_amount/max_amount теперь = токен-единицы, не lamports. (decimals=6; логика количеств не меняется, просто ценовая шкала).
  • Bet — без изменений (amount = токен-единицы).

2. create_bet.rs

  • Добавить аккаунты (через anchor_spl::token::Token):
    • bettor_token: Account<'info, TokenAccount> (ATA игрока, #[account(mut)]) — откуда списываем фантики.
    • vault_token: Account<'info, TokenAccount> (ATA на global, #[account(seeds=[GLOBAL_SEED], bump)], mut) — куда кладём.
    • token_program: Program<'info, Token>.
  • Заменить блок system_program::transfer(...) на anchor_spl::token::transfer(...): из bettor_token в vault_token, amount.
  • bettor остаётся Signer, но теперь просто auth (токен-подпись).

3. close_bet.rs

  • Добавить:
    • vault_token: Account<'info, TokenAccount> (mut, seeds GLOBAL_SEED) — источник фантиков.
    • bettor_token: Account<'info, TokenAccount> (mut) — куда платим.
    • token_program: Program<'info, Token>.
  • Заменить ваулт-логику: вместо add/sub_lamports у global — token::transfer из vault_token в bettor_token на payout.
  • global больше НЕ касса SOL — убрать SystemAccount-требование; bettor в close_bet можно убрать из аккаунтов (адрес в bet.bettor уже есть), но для обратной совместимости можно оставить как SystemAccount (не мутируя).
  • Проверка global.get_lamports() >= payout заменяется на проверку баланса vault_token.amount >= payout (или просто положиться на token::transfer failure — но лучше явно проверить InsufficientVault).

4. initialize.rs / update.rs

  • Убедиться, что min/max_amount интерпретируются как токен-единицы. Если в initialize передаются как lamports — просто поменять смысл (или оставить, числа вводим в токен-единицах). Логику не трогаем.

5. Cargo.toml

  • Добавить зависимость: anchor-spl = "0.31.1" (даёт anchor_spl::token).

6. IDL (idl/*.json)

  • Обновить после сборки (anchor build регенерит). Новые аккаунты в create_bet/close_bet.

Требования (гейты)

  1. Каждый шаг компилируется: anchor build (или cargo build-sbf) — БЕЗ ошибок.
  2. В конце: anchor build зелёный + обновлённый IDL.
  3. Семантика: create_bet берёт фантики с bettor на ваулт; close_bet платит фантики с ваулта на bettor.
  4. Тесты (program/tests/) — обновить под токен (создать mint, ATA, задеплоить), прогнать anchor test.

Порядок работы (шаг за шагом, компиляз после каждого)

  • Шаг 1 — Cargo.toml: + анchor-spl.
  • Шаг 2 — state.rs: только комментарий (min/max = токен-единицы), без изменения полей.
  • Шаг 3 — create_bet.rs: добавить токен-аккаунты + token::transfer.
  • Шаг 4 — close_bet.rs: добавить токен-аккаунты + token::transfer из ваулта на bettor.
  • Шаг 5 — IDL реген + тесты.
  • Шаг 6 — финальный anchor test зелёный.

ЧЕГО НЕ ДЕЛАТЬ

  • Не трогать логику «вверх/вниз», entry/exit_price, статусы.
  • Не менять relayer/скрипты деплоя.
  • Не коммитить (всё остаётся в рабочем дереве до приёмки человеком).

Проверка

  • anchor build — 0 ошибок.
  • anchor test (или cargo test в program) — зелёный.
  • Все новые аккаунты корректно работают с токен-кейсами (mint, ATA, ваулт).