45d64d45a7
- 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)
79 lines
5.6 KiB
Markdown
79 lines
5.6 KiB
Markdown
# 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, ваулт). |