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