# ТЗ: дописать тесты для 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 недостающих тестов, сохранив РОВНО их исходную игровую логику: 1. `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. 2. `close_bet_user_wins_up` — close UP после expiry, exit>entry: bettor получает payout=amount*MULTIPLIER_BPS/10000 (1.3x), статус=1, exit_price установлен. Перед этим айрдроп на global-pda ≥10*amount (для выплаты из vault). 3. `close_bet_house_wins_down` — side=DOWN, exit>entry (проиграл): баланс не меняется, статус=2. 4. `close_bet_equal_price_stays_open` — exit==entry: статус остаётся 0, баланс не меняется. 5. `close_bet_already_finalized` — повторный close после успешного: вторая транзакция падает (err), статус остаётся 1. 6. `close_bet_before_expiry_rejected` — close до expiry: падает, статус 0. 7. `close_bet_wrong_relayer_rejected` — close не-релейером: падает, статус 0. 8. `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::(&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 (ожидаемые ошибки — как задумано). - Отчёт: какие тесты добавил, что чинит, какие остались красными (если есть).