- 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.8 KiB
ТЗ: дописать тесты для smart-updown под Anchor 0.31.1 / Solana 2.x
Контракт уже переведён на anchor-lang 0.31.1 + solana 2.x и .so собран в SBPFv3.
Всё в program/programs/smart-updown/, ветка extract-sources.
Текущее состояние тестов
Файл tests/test_smart_updown.rs сейчас содержит ТОЛЬКО первый тест
(initialize_creates_global) полностью + каркас (setup, read_account, helpers).
Остальные 8 тестов НАДО дописать по original-логике (см. ниже). Файл уже
переведён на solana-program-test + tokio::test + async BanksClient.
Задача
Дописать в tests/test_smart_updown.rs все 8 недостающих тестов, сохранив
РОВНО их исходную игровую логику:
create_bet_escrows_sol— create_bet (UP, side=0): эскроу на global-pda, read_bet: bettor, side=0, amount, entry_price, bet_time=1_700_000_000, expire_time=+EXPIRY_SECONDS, status=0; counter становится 1.close_bet_user_wins_up— close UP после expiry, exit>entry: bettor получает payout=amountMULTIPLIER_BPS/10000 (1.3x), статус=1, exit_price установлен. Перед этим айрдроп на global-pda ≥10amount (для выплаты из vault).close_bet_house_wins_down— side=DOWN, exit>entry (проиграл): баланс не меняется, статус=2.close_bet_equal_price_stays_open— exit==entry: статус остаётся 0, баланс не меняется.close_bet_already_finalized— повторный close после успешного: вторая транзакция падает (err), статус остаётся 1.close_bet_before_expiry_rejected— close до expiry: падает, статус 0.close_bet_wrong_relayer_rejected— close не-релейером: падает, статус 0.close_bet_replay_rejected— close после уже закрытого: падает.
Плюс тест create_bet_rejects_out_of_range (amount=1 < MIN_AMOUNT) — падает.
Критичные API-условия (solana-program-test 2.x)
setup()возвращает(ProgramTestContext, Keypair); первый тест уже это делает.- Airdrop любому аккаунту:
system_instruction::transfer(&ctx.payer.pubkey(), to, lamports)в транзакции от payer. - Системные часы: получить
Clockчерезctx.banks_client.get_sysvar().await, изменитьunix_timestamp, затемctx.set_sysvar(&clk). - Читать аккаунт:
ctx.banks_client.get_account(pubkey).await.unwrap().unwrap()(Account), данные черезbytemuck::from_bytes::<Global/Bet>(&data[8..]). - Проверка баланса:
ctx.banks_client.get_balance(pubkey).await.unwrap(). - Все тесты
#[tokio::test] async fn, всегда первая строкаlet (mut ctx, admin) = setup().await;.
Как исполнять
Дописать тесты, затем ЗАПУСТИТЬ:
cd program && cargo test -p smart-updown 2>&1 | tail -40
Добиться, чтобы ВСЕ тесты прошли зелёными (а те, что ожидают ошибку, получали её). Устранить ошибки компиляции (импорты, типы). НЕ менять игровую логику в src.
Критерии
cargo test -p smart-updown→ все 9+ тестов green (ожидаемые ошибки — как задумано).- Отчёт: какие тесты добавил, что чинит, какие остались красными (если есть).