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)
5.6 KiB
5.6 KiB
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.
Требования (гейты)
- Каждый шаг компилируется:
anchor build(илиcargo build-sbf) — БЕЗ ошибок. - В конце:
anchor buildзелёный + обновлённый IDL. - Семантика: create_bet берёт фантики с bettor на ваулт; close_bet платит фантики с ваулта на bettor.
- Тесты (
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, ваулт).