fix: распаковать источник из обёртки smart-updown в корень ветки

This commit is contained in:
2026-09-02 15:36:21 +03:00
parent a9d54feab6
commit 5cf3a7a8d1
35 changed files with 0 additions and 0 deletions
+136
View File
@@ -0,0 +1,136 @@
# Smart-Updown — пакет развёртывания (localnet)
Бинарная игра UP/DOWN на цену SOL. Пользователь ставит на направление (UP/DOWN)
на 15 секунд; при выигрыше получает ставку + 30% (1.3x). Дом (контракт) — оппонент.
Цена берётся off-chain релеером (он же админ) с вашей БД; SOL хранится в ваулте (PDA `global`).
Программа: **Anchor v2 (fork `otter-sec/anchor`, ветка `anchor-next`)**, Solana, Rust.
---
## Состав пакета
```
smart-updown/
├── deploy/
│ ├── smart_updown.so # скомпилированная программа (SBF-байткод, кроссплатформенный)
│ └── smart_updown-keypair.json # authority-ключар программы (ID = E7Hg55...)
├── idl/
│ ├── smart_updown.json # IDL (для клиента)
│ └── smart_updown.ts # типы TypeScript для клиента
├── relayer/ # off-chain релеер (админ + закрытие ставок)
│ ├── package.json
│ ├── tsconfig.json
│ ├── .env.example
│ ├── idl/ # копия IDL для клиента
│ └── src/
│ ├── index.ts # главный цикл
│ ├── ops.ts # initialize / createBet / closeBet / fundVault
│ ├── pda.ts # вывод PDA
│ ├── program.ts # клиент из IDL
│ ├── priceSource.ts # ЗАГЛУШКА цены SOL (вставить свой запрос к БД)
│ └── frontStub.ts # ЗАГЛУШКА фронта (откуда приходит выбор пользователя)
├── program/ # исходники контракта (опционально, для пересборки)
│ ├── Anchor.toml
│ ├── Cargo.toml / Cargo.lock
│ ├── rust-toolchain.toml # пинит Rust 1.89.0
│ └── programs/smart-updown/{src,tests}
├── deploy-localnet.sh # развёртывание на localnet
└── README.md
```
---
## 1. Требования (Linux x86_64)
- **Solana CLI (Agave)** — даёт `solana-test-validator`, `solana program deploy`,
`cargo build-sbf`, `solana-keygen`. Установка:
`sh -c "$(curl -sSfL https://release.anza.xyz/stable/install)"`
- **Node.js 18+ / npm** — для relayer.
- (опционально) **Rust 1.89.0** через rustup — только если пересобираете программу.
> **Важно про `.so`**: это SBF-байткод и он не зависит от архитектуры хоста,
> поэтому `deploy/smart_updown.so`, собранный на macOS, **работает на Linux-валидаторе**
> как есть — пересобирать не нужно.
## 2. Развёртывание (localnet)
```bash
chmod +x deploy-localnet.sh
./deploy-localnet.sh
```
Скрипт:
1. переключает `solana config` на `http://127.0.0.1:8899`;
2. запускает `solana-test-validator` с программой (`--bpf-program E7Hg55...`);
3. проверяет, что программа поднята под ID `E7Hg55ywRDKRZJ35rDMJGC3YFThQbh6nAK9GDayG4sr3`.
Подытог — программа доступна на localnet под тем же адресом, что зашит в IDL.
## 3. Relayer (админ + закрытие ставок)
```bash
cd relayer
npm install
cp .env.example .env # при желании поправить значения
# инициализация контракта (ваулт/Global):
npm run init
# один прогон ставки:
npm run run
# непрерывный цикл:
npm run loop
```
`init` создаёт `Global` (админ + релеер = keypair из `SMART_ADMIN_KEYPAIR`,
по умолчанию `~/.config/solana/id.json`). На localnet скрипт сам делает airDrop
bettor'ам и догружает ваулт банка. На mainnet airDrop выключите
(`SMART_ALLOW_AIRDROP=0`) и пополняйте ваулт переводами с админа.
> AirDrop на localnet выполняется от keypair, настроенного в `solana config`.
> Убедитесь, что он существует и имеет SOL (в скрипте деплоя это `id.json`,
> см. `solana config get`).
## 4. Заглушки — куда вставить реальное
- `relayer/src/priceSource.ts` — функция `getPrice()`. **Замените** на запрос цены
SOL из вашей БД. Единицы любые, главное согласованность между entry и exit.
- `relayer/src/frontStub.ts` — функция `nextBetRequest()`. **Замените** на приём
со стороны фронта: направление (UP/DOWN) и сумма, которые выбрал пользователь.
## 5. Деплой в новом окружении (если уже есть валидатор, без перезапуска)
```bash
solana config set --url http://127.0.0.1:8899
solana program deploy --program-id deploy/smart_updown-keypair.json deploy/smart_updown.so
```
## 6. (Опционально) Пересборка программы из исходников + тесты
Та же команда, что использовалась для сборки:
```bash
cd program
rustup toolchain install 1.89.0 # если нет
# собрать .so:
cargo build-sbf --manifest-path programs/smart-updown/Cargo.toml
# артефакт появится в program/target/deploy/smart_updown.so
# интеграционные тесты (LiteSVM), без валидатора:
cargo test -p smart-updown
```
Если пересобираете, IDL не меняется, пока не меняете layout аккаунтов/инструкций.
После изменения контракта: пересоберите `.so`, перегенерируйте IDL
(`anchor build`, при наличии anchor-cli 2.0.0-rc.1) и обновите `relayer/idl/`
и `idl/`.
## 7. Переменные окружения relayer (см. .env.example)
| Переменная | По умолчанию | Описание |
|---|---|---|
| `SMART_RPC_URL` | `http://127.0.0.1:8899` | RPC кластера |
| `SMART_ALLOW_AIRDROP` | `1` | airDrop bettors/ваулта (localnet) |
| `SMART_ADMIN_KEYPAIR` | `~/.config/solana/id.json` | keypair админа/релеера |
| `SMART_MIN_AMOUNT` | `100000000` | мин. ставка (лампорты) |
| `SMART_MAX_AMOUNT` | `10000000000` | макс. ставка (лампорты) |
| `SMART_MULTIPLIER_BPS` | `13000` | выплата 1.3x (bps) |
| `SMART_EXPIRY_SECONDS` | `15` | экспирация (сек) |