Розробка Telegram Mini App для tap-to-earn
Notcoin у 2024 показав, що Telegram Mini App може зібрати аудиторію в десятки мільйонів користувачів через найпростішу механіку: нажимати кнопку, заробляти монети. Після нього хвиля: Hamster Kombat, Blum, Major — кожен зі своїми варіаціями. Tap-to-earn — це не про глибоку геймплей механіку, це про virality, retention та ефективний onboarding у TON екосистему.
Технічно: React додаток всередину Telegram WebApp, backend на Node.js/Go, TON Connect для кошелька, off-chain зберігання монет з on-chain конвертацією при лістингу.
Telegram Mini App: технічний фундамент
Telegram надає window.Telegram.WebApp — об'єкт з даними користувача і методами управління інтерфейсом. Аутентифікація через initData — рядок, який Telegram передає в момент відкриття додатку.
const tg = window.Telegram.WebApp
tg.ready() // повідомляємо Telegram, що app готовий
tg.expand() // розворачиваємо на весь екран
const user = tg.initDataUnsafe.user
// { id: 123456789, first_name: "Ivan", username: "ivan_user", ... }
// ВАЖЛИВО: initDataUnsafe — непровірені дані на клієнті
// Для backend запитів передаємо tg.initData (рядок з підписом)
Backend верифікація:
import { createHmac } from 'crypto'
function verifyTelegramAuth(initData: string, botToken: string): boolean {
const params = new URLSearchParams(initData)
const hash = params.get('hash')
params.delete('hash')
// Сортуємо і конкатенуємо
const dataCheckString = Array.from(params.entries())
.sort(([a], [b]) => a.localeCompare(b))
.map(([k, v]) => `${k}=${v}`)
.join('\n')
const secretKey = createHmac('sha256', 'WebAppData').update(botToken).digest()
const expectedHash = createHmac('sha256', secretKey)
.update(dataCheckString).digest('hex')
return hash === expectedHash
}
Ця верифікація обов'язкова на кожному backend запиті. Без неї будь-який користувач може підробити user.id і вкрасти чужі монети.
Tap механіка і оптимізація продуктивності
Tap = подія на frontend → відправити монети на backend. Наївний підхід: кожний tap = HTTP запит. При 10 tap/сек × 100k одночасних = 1M RPS. Це нереально.
Batching тапів. Клієнт накопичує тапи локально, відправляє батч кожні 2-5 секунд:
class TapBatcher {
private pendingTaps = 0
tap(count: number = 1) {
this.pendingTaps += count
// Immediate optimistic UI update
}
async flush() {
if (this.pendingTaps === 0) return
const toSend = this.pendingTaps
this.pendingTaps = 0
try {
await api.post('/taps', { userId: this.userId, count: toSend })
} catch {
this.pendingTaps += toSend
}
}
}
Optimistic UI. Монети оновлюються одразу, без очікування backend. Feel критичний.
Energy система. Обмеження тапів через energy pool: 1 energy за tap, N energy regen/годину. Одночасно game mechanic і rate limiter.
Backend архітектура під високу нагрузку
Тисячі одночасних користувачів при запуску.
Redis для real-time стану. Всі ігрові дані в памяті: balance:{userId}, energy:{userId}, lastTap:{userId}. Lua script для атомарного оновлення:
local energy = tonumber(redis.call('GET', KEYS[1])) or 1000
local taps = tonumber(ARGV[1])
local energyCost = taps
if energy < energyCost then
return {0, energy}
end
redis.call('DECRBY', KEYS[1], energyCost)
redis.call('INCRBY', KEYS[2], taps * tonumber(ARGV[2]))
return {1, energy - energyCost}
Lua виконується атомарно в Redis — race condition виключений.
PostgreSQL для persistence. Періодично (кожні N хвилин або по подієї) записуємо Redis дані в PostgreSQL. При перезавантажуванні — восстановлюємо з БД в Redis.
TON Connect і конвертація монет
Click-монети існують off-chain. Конвертація у реальні TON токени — при TGE або по розписанню.
import { TonConnectUI } from '@tonconnect/ui-react'
const tonConnect = new TonConnectUI({
manifestUrl: 'https://your-app.com/tonconnect-manifest.json'
})
async function claimTokens(userId: number) {
const claimData = await api.post('/prepare-claim', { userId })
await tonConnect.sendTransaction({
validUntil: Math.floor(Date.now() / 1000) + 300,
messages: [{
address: CLAIM_CONTRACT_ADDRESS,
amount: '50000000',
payload: claimData.payload,
}]
})
}
TON Jetton (ERC-20 аналог) — стандарт для fungible токенів. Claim контракт верифікує підпис backend, мінтить Jettons.
Вірусні механіки і реферальна система
Tap-to-earn без virality вмирає швидко. Реферальна система обов'язкова:
Реферальний код: deep link https://t.me/YourBot?startapp=ref_userId. При першому запуску з цим параметром: користувач пов'язаний з рефереру, обидва отримують бонус.
Багаторівневі реферальні програми. Hamster Kombat: 25k монет за друга, 10% за кожний tap друга. Експоненціальний ріст, але і експоненціальна інфляція.
Daily missions + combo. Щоденні задання (підписка на канал, упоминання, запросити X друзів) дають бонусні монети. Combo — вгадати правильну комбінацію карточок за бонус.
Безпека і anti-cheat
Rate limiting по userId. Максимум N батчів/сек. Навіть з batching, автоматизація може відправляти занадто часто.
Energy ceiling. Сервер зберігає timestamp останнього energy update. Максимальна накопичена енергія обмежена фізично. Клієнт не може заявити більше ніж дозволяє час.
Підозрілі паттерни. Якщо tap rate > фізично можливого (>15 tap/сек стабільно) → флаг. Ботів виявляють і банять.
Bot detection через Telegram дані. Аккаунти без username, без фото, створені недавно — зважуються нижче.
Стек
| Компонент | Технології |
|---|---|
| Frontend | React + TypeScript + Vite |
| UI | Tailwind + Framer Motion |
| Backend | Node.js (Fastify) або Go |
| Real-time стан | Redis + Lua scripts |
| Database | PostgreSQL |
| TON інтеграція | TON Connect UI + @ton/core |
| Smart contracts | Tact (FunC wrapper) |
| Deploy | Docker + Nginx / Coolify |
Процес розробки
Game design + tokenomics (1 тиждень). Energy система, reward per tap, реферальна структура, вірусні механіки.
Backend + Telegram auth (1-2 тижні). initData верифікація, Redis tap pipeline, енергія, реферальна.
Frontend Mini App (1-2 тижні). Tap інтерфейс з анімаціями, energy індикатор, leaderboard, referral onboarding.
TON інтеграція (1 тиждень). TonConnect підключення, Jetton контракт, claim.
Тестування і launch (1 тиждень). Нагрузкове тестування Redis pipeline, anti-cheat тест, soft launch.
Мінімальний tap-to-earn без TON — 3-4 тижні. З TON токеном, реферальною системою та повним anti-cheat — 6-8 тижнів.







