# 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, ваулт).