Files
Smart-game/MIGRATION_TASK.md
T
subochev 9f100ee122 feat: миграция smart-updown на anchor 0.31.1 + solana 2.x (SBPFv3)
- anchor-lang 0.31.1 вместо 2.0-rc/anchor-next (git)
- Address -> Pubkey (state/events/instructions)
- убран #[discrim], добавлен #[derive(InitSpace)] + space=8+INIT_SPACE
- тесты переписаны на solana-program-test 2.x (10 passed)
- сборка SBPFv3 через cargo build-sbf --tools-version v1.57
- deploy успешен в нашу сеть (agave 4.2.2, SBPFv3)
2026-09-03 05:27:34 +03:00

51 lines
3.7 KiB
Markdown
Raw 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.
# ТЗ: перевод смарт-контракта smart-updown на Anchor 0.31.1 + Solana 2.x (SBPFv3)
Цель: контракт собирается под SBPFv3 и успешно деплоится в наш прод-блокчейн
(агave 4.2.2 / feature-set 565236538 = mainnet). Логика игры сохраняется 100%.
Рабочая ветка: `extract-sources`. Репо: ~/WORK/games/Smart-game (push в git.binom.pw).
## Что сделать
1. **Cargo.toml** (`program/programs/smart-updown/Cargo.toml`):
- `anchor-lang = "0.31.1"` (crates.io), убрать git-зависимость otter-sec/anchor branch anchor-next.
- Убрать `anchor-v2-testing` из dev-deps (git).
- `solana-clock`/`solana-pubkey` dev-deps → версии 2.x (совместимы с solana-program ^2).
- Оставить остальные зависимости как есть, если они совместимы с 0.31.1.
2. **Типы**: заменить `Address` на `Pubkey` во всех state/events/instructions
(state.rs: admin, relayer, bettor; events.rs: bet, bettor; update.rs: new_relayer).
Тип `Pubkey` — из `solana_program::pubkey::Pubkey` (доступен через anchor prelude).
3. **Убрать `#[discrim = N]`** со всех 4 инструкций в lib.rs (initialize/create_bet/close_bet/update).
Anchor 0.31 генерирует дискриминатор автоматически. **Перегенерить IDL** (idl/smart_updown.json, .ts;
relayer/idl/*) — дискримы могут измениться, клиенты должны использовать новый IDL.
4. **Математика payout (1.3x) — НЕ менять**: `(amount as u128).checked_mul(multiplier_bps as u128) / BPS_DIVISOR`
через checked_mul/checked_div, BPS_DIVISOR=10000. Никаких других формул/округлений.
5. **Логика НЕ менять**: seeds (`GLOBAL_SEED`=b"global", `BET_SEED`+id), статусы, paused-проверки, админ/релейер-проверки, события — как есть.
6. **API-адаптация под 0.31** (если что-то из 2.0-rc синтаксиса недоступно):
- `ctx.accounts.admin.address()` → использовать `.key()` или `*ctx.accounts.admin.key`
- `cpi_handle_mut()` → `to_account_info()` (классический CpiContext::cpi_accounts)
- `.view().lamports()` → `.to_account_info().lamports()`
- `address_eq` → сравнение через `==` на Pubkey
- аккаунты: `space` НЕ задавать явно (авто-вывод 8-байт дискриминатора) — не ломать авто-аллокацию.
7. **Тесты** (`program/programs/smart-updown/tests/test_smart_updown.rs`):
перевести на Rust API Anchor 0.31 (НЕ JS). Убрать `anchor_v2_testing`, `Address`.
9 тестов долube зелёные (`cargo test`). Не использовать хардкод-дискриминаторы —
использовать генерируемые данные из `smart_updown::instruction::*`.
## Критерии приёмки
- `anchor build` (агave 4.2.2 CI, `--arch v3`) → успешно, `.so` собран.
- `cargo test` → 9 тестов зелёные.
- IDL перегенерён, дискримы согласованы.
- Деплой в нашу сеть (http://192.168.76.181:8899, агave 4.2.2) успешен.
## Запрещено
- Менять игровую логику (правила, множитель, статусы, seeds, проверки).
- Ломать явные ошибки компиляции скрытием (`#[allow]`, unwrap без причины).