- 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)
3.7 KiB
ТЗ: перевод смарт-контракта 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).
Что сделать
-
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-pubkeydev-deps → версии 2.x (совместимы с solana-program ^2).- Оставить остальные зависимости как есть, если они совместимы с 0.31.1.
-
Типы: заменить
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). -
Убрать
#[discrim = N]со всех 4 инструкций в lib.rs (initialize/create_bet/close_bet/update). Anchor 0.31 генерирует дискриминатор автоматически. Перегенерить IDL (idl/smart_updown.json, .ts; relayer/idl/*) — дискримы могут измениться, клиенты должны использовать новый IDL. -
Математика payout (1.3x) — НЕ менять:
(amount as u128).checked_mul(multiplier_bps as u128) / BPS_DIVISORчерез checked_mul/checked_div, BPS_DIVISOR=10000. Никаких других формул/округлений. -
Логика НЕ менять: seeds (
GLOBAL_SEED=b"global",BET_SEED+id), статусы, paused-проверки, админ/релейер-проверки, события — как есть. -
API-адаптация под 0.31 (если что-то из 2.0-rc синтаксиса недоступно):
ctx.accounts.admin.address()→ использовать.key()или*ctx.accounts.admin.keycpi_handle_mut()→to_account_info()(классический CpiContext::cpi_accounts).view().lamports()→.to_account_info().lamports()address_eq→ сравнение через==на Pubkey- аккаунты:
spaceНЕ задавать явно (авто-вывод 8-байт дискриминатора) — не ломать авто-аллокацию.
-
Тесты (
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 без причины).