# ТЗ: перевод смарт-контракта 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 без причины).