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
Скрипт:
- переключает
solana configнаhttp://127.0.0.1:8899; - запускает
solana-test-validatorс программой (--bpf-program E7Hg55...); - проверяет, что программа поднята под 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 |
экспирация (сек) |