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)
This commit is contained in:
Caffeine
2026-09-09 22:00:41 +03:00
parent ff2289e68d
commit 45d64d45a7
10 changed files with 1106 additions and 120 deletions
+79
View File
@@ -0,0 +1,79 @@
# 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, ваулт).