9f100ee122
- 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)
56 lines
3.8 KiB
Markdown
56 lines
3.8 KiB
Markdown
# ТЗ: дописать тесты для 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::<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 (ожидаемые ошибки — как задумано).
|
|
- Отчёт: какие тесты добавил, что чинит, какие остались красными (если есть). |