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