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)

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 (админ + закрытие ставок)

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. Деплой в новом окружении (если уже есть валидатор, без перезапуска)

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. (Опционально) Пересборка программы из исходников + тесты

Та же команда, что использовалась для сборки:

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 экспирация (сек)
S
Description
Смарт-контракт Binary Rocket: игра вверх/вниз, валюту ставок переводим на наши фантики (SPL-токен). Копия Smart-game, не трогаем оригинал.
Readme 663 KiB
Languages
TypeScript 81.8%
Rust 16.6%
Shell 0.9%
Go Template 0.6%
Dockerfile 0.1%