Разработка Telegram Mini App слотов
Игроки жалуются на нечестные слоты? Мы гарантируем честность с помощью верифицируемой случайности на TON и публичных контрактов. Требуется обеспечить случайность, интеграцию кошелька и быстрые транзакции. TMA — это WebApp внутри мессенджера с аудиторией 900M+ пользователей. TON blockchain нативно интегрирован с Telegram через @wallet бот и TON Connect протокол. Разберём полный стек: от TMA API до смарт-контракта на TON. Мы имеем многолетний опыт в блокчейн-разработке и готовы поделиться ноу-хау.
Почему Tact лучше FunC для слотов на TON?
Tact — современный язык для смарт-контрактов TON, похожий на TypeScript. Он снижает количество ошибок на 40% по сравнению с FunC за счёт строгой типизации и встроенных проверок. FunC требует ручного управления памятью и склонен к багам вроде неправильного преобразования типов. Для слотов, где каждая транзакция на вес золота, надёжность контракта критична.
Как Telegram Mini App обрабатывает транзакции?
TMA — обычное веб-приложение (React/Vue), открывающееся во встроенном браузере Telegram. Взаимодействие с Telegram через window.Telegram.WebApp объект:
import WebApp from "@twa-dev/sdk";
WebApp.ready();
WebApp.expand();
const user = WebApp.initDataUnsafe.user;
const isValid = await verifyTelegramData(WebApp.initData, BOT_TOKEN);
WebApp.HapticFeedback.impactOccurred("medium");
WebApp.MainButton.setText("КРУТИТЬ");
WebApp.MainButton.show();
WebApp.MainButton.onClick(() => spinReels());
Верификация initData на бэкенде
import crypto from "crypto";
function verifyTelegramWebAppData(initData: string, botToken: string): boolean {
const urlParams = new URLSearchParams(initData);
const hash = urlParams.get("hash");
urlParams.delete("hash");
const dataCheckString = Array.from(urlParams.entries())
.sort(([a], [b]) => a.localeCompare(b))
.map(([key, value]) => `${key}=${value}`)
.join("\n");
const secretKey = crypto
.createHmac("sha256", "WebAppData")
.update(botToken)
.digest();
const computedHash = crypto
.createHmac("sha256", secretKey)
.update(dataCheckString)
.digest("hex");
return computedHash === hash;
}
TON смарт-контракт для слотов
Механизм честной случайности с серверной подписью
Случайность генерируется на сервере и подписывается приватным ключом. Контракт верифицирует подпись перед выплатой. Дополнительно можно подключить Chainlink VRF для децентрализованной проверки. Но для TMA слотов серверной подписи достаточно при условии, что сервер доверенный. Пример контракта слотов на Tact:
import "@stdlib/deploy";
struct SpinResult {
reel1: Int as uint8;
reel2: Int as uint8;
reel3: Int as uint8;
payout: Int as coins;
}
contract SlotMachine with Deployable {
owner: Address;
houseBalance: Int as coins = 0;
const MIN_BET: Int = ton("0.1");
const MAX_BET: Int = ton("10");
serverPublicKey: Int as uint256;
init(owner: Address, serverPublicKey: Int) {
self.owner = owner;
self.serverPublicKey = serverPublicKey;
}
receive("spin") {
let ctx: Context = context();
require(ctx.value >= self.MIN_BET, "Bet too small");
require(ctx.value <= self.MAX_BET, "Bet too large");
emit(SpinRequested{player: ctx.sender, betAmount: ctx.value, nonce: now()}.toCell());
self.houseBalance += ctx.value;
}
receive(msg: ClaimWin) {
let hash: Int = beginCell()
.storeAddress(msg.player)
.storeCoins(msg.betAmount)
.storeUint(msg.nonce, 64)
.storeUint(msg.reel1, 8)
.storeUint(msg.reel2, 8)
.storeUint(msg.reel3, 8)
.endCell()
.hash();
require(checkSignature(hash, msg.signature, self.serverPublicKey), "Invalid signature");
let payout: Int = self.calculatePayout(msg.reel1, msg.reel2, msg.reel3, msg.betAmount);
if (payout > 0) {
require(self.houseBalance >= payout, "Insufficient house balance");
self.houseBalance -= payout;
send(SendParameters{to: msg.player, value: payout, mode: SendIgnoreErrors});
}
}
fun calculatePayout(r1: Int, r2: Int, r3: Int, bet: Int): Int {
if (r1 == 7 && r2 == 7 && r3 == 7) { return bet * 100; }
if (r1 == r2 && r2 == r3) { return bet * 10; }
if (r1 == r2 || r2 == r3 || r1 == r3) { return bet * 2; }
if (r1 == 6 && r2 == 6) { return bet * 3; }
return 0;
}
receive("deposit") {
self.houseBalance += context().value;
}
get fun balance(): Int { return self.houseBalance; }
}
TON Connect: подключение кошелька
import TonConnect from "@tonconnect/sdk";
const connector = new TonConnect({
manifestUrl: "https://yourapp.com/tonconnect-manifest.json",
});
const walletsList = await connector.getWallets();
connector.connect({ universalLink: walletsList[0].universalLink, bridgeUrl: ... });
connector.onStatusChange((wallet) => {
if (wallet) {
console.log("Connected:", wallet.account.address);
initGame(wallet.account.address);
}
});
async function placeBet(amount: number) {
await connector.sendTransaction({
validUntil: Math.floor(Date.now() / 1000) + 300,
messages: [{
address: SLOT_CONTRACT_ADDRESS,
amount: String(amount * 1e9),
payload: "spin",
}],
});
}
Игровой процесс и анимация
Слоты — это анимация барабанов. Используем CSS/Canvas animation или Pixi.js:
- Игрок нажимает "Крутить" → отправляется TON транзакция.
- Пока идёт транзакция → барабаны крутятся в ожидающей анимации.
- Game server замечает транзакцию → генерирует случайный результат → подписывает → вызывает
ClaimWinна контракте. - Фронтенд получает event через TON Center API или тонсдк → барабаны останавливаются на финальных символах.
- Если выигрыш — haptic feedback + эффект монет.
async function watchSlotEvents(contractAddress: string) {
const client = new TonClient({ endpoint: "https://toncenter.com/api/v2/jsonRPC" });
setInterval(async () => {
const transactions = await client.getTransactions(Address.parse(contractAddress), { limit: 10 });
for (const tx of transactions) {
if (tx.inMessage?.body) {
const result = parseSpinResult(tx.inMessage.body);
if (result && result.player === currentPlayerAddress) {
animateReels(result.reel1, result.reel2, result.reel3);
}
}
}
}, 2000);
}
Монетизация и TON экосистема
TON обеспечивает несколько преимуществ для TMA слотов:
- @wallet integration — пользователи Telegram часто уже имеют TON кошелёк через встроенный @wallet.
- Комиссии — транзакции в TON стоят ~$0.003–0.01, что в 10 раз дешевле, чем на Ethereum L2. Экономия на каждой ставке может достигать $0.05.
- TON Stars — внутренняя валюта Telegram (для non-crypto пользователей).
- Viral mechanics — нативный шаринг результатов в чаты через
WebApp.openTelegramLink.
| Параметр | TON | Ethereum (L2) |
|---|---|---|
| Скорость транзакции | ~3-5 сек | ~2-10 сек (Arbitrum) |
| Средняя комиссия | $0.003 | $0.01-0.05 |
| Интеграция с Telegram | Нативная | Через Web3 |
Мы гарантируем стабильную экономику с RTP 95–97%. House edge 3–5% обеспечивает устойчивую экономику при достаточном объёме игр.
Что входит в разработку TMA слотов
- Документация архитектуры и API для серверной части.
- Исходный код смарт-контракта на Tact с открытым доступом.
- Развёртывание контракта в тестовой сети и основной сети TON.
- Web-приложение на React/Next.js с анимацией барабанов.
- Интеграция TON Connect и @wallet для пополнения/ставок.
- Тестирование безопасности (аудит логики).
- Инструкции по администрированию.
Процесс разработки TMA слотов
Мы работаем по этапам, чтобы минимизировать риски и уложиться в сроки:
- Аналитика — согласование механик, RTP, дизайна символов.
- Проектирование — архитектура смарт-контракта, схемы TMA.
- Реализация — написание контракта на Tact, фронтенда на React, серверной части.
- Тестирование — unit-тесты сцены (выигрыш, проигрыш, бонусы), fuzzing на Tenderly.
- Деплой — развёртывание тестнет, затем mainnet с мультисигом.
| Этап | Длительность |
|---|---|
| Аналитика | 1-2 дня |
| Проектирование | 2-3 дня |
| Реализация | 2-3 недели |
| Тестирование | 1 неделя |
| Деплой | 2-3 дня |
Какие риски мы устраняем?
- Reentrancy: TON асинхронный, но мы используем паттерн проверки после эффекта в контракте.
- Манипуляции с RNG: подпись сервера + открытый ключ в контракте исключает подтасовку.
- Переполнение баланса: минимальная и максимальная ставки, проверка houseBalance перед выплатой.
Мы гарантируем безопасность через проверенные паттерны и аудит кода.
Свяжитесь с нами, чтобы обсудить вашу идею и получить детальную смету. Закажите разработку слотов TON — мы запустим проект за 4 недели.







