Files
smart-updown-token/TESTS_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.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 недостающих тестов, сохранив РОВНО их исходную игровую логику:

  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=amountMULTIPLIER_BPS/10000 (1.3x), статус=1, exit_price установлен. Перед этим айрдроп на global-pda ≥10amount (для выплаты из 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::<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 (ожидаемые ошибки — как задумано).
  • Отчёт: какие тесты добавил, что чинит, какие остались красными (если есть).