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)
This commit is contained in:
2026-09-03 05:27:34 +03:00
parent 2133f65e21
commit 9f100ee122
13 changed files with 5784 additions and 1395 deletions
+51
View File
@@ -0,0 +1,51 @@
# ТЗ: перевод смарт-контракта 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 без причины).