Files
smart-updown-token/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

3.7 KiB
Raw Blame History

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