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

79 lines
5.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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, ваулт).