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)
This commit is contained in:
2026-09-03 05:27:34 +03:00
parent 2133f65e21
commit 9f100ee122
13 changed files with 5784 additions and 1395 deletions
+56
View File
@@ -0,0 +1,56 @@
# ТЗ: дописать тесты для 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 (ожидаемые ошибки — как задумано).
- Отчёт: какие тесты добавил, что чинит, какие остались красными (если есть).