137 lines
7.0 KiB
Markdown
137 lines
7.0 KiB
Markdown
# 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` | экспирация (сек) |
|