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:
@@ -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, ваулт).
|
||||
Reference in New Issue
Block a user