TON Connect в Mini App
Интеграция TON Connect в Mini App — это ключ к полноценному Web3-опыту внутри Telegram. Без подключения кошелька пользователь не сможет взаимодействовать со смарт-контрактами или подписывать транзакции. Особенность TON Connect в Mini App — возможность использования встроенного кошелька Telegram (TON Space), что устраняет барьер «установи внешний кошелёк».
Mini App внутри Telegram может подключаться к блокчейну TON через TON Connect — тот же протокол, что мы изучали в M07. Но внутри Telegram работа с кошельками имеет важные особенности: два режима моста и комбинированная авторизация.
Два режима моста
В обычном dApp (веб-сайт в браузере) TON Connect работает через HTTP Bridge — QR-код или deeplink для подключения внешнего кошелька. Внутри Mini App появляется второй вариант: JS Bridge.
HTTP Bridge (стандартный)
Тот же механизм, что и в обычных dApp:
HTTP Bridge используется когда кошелёк — отдельное приложение (Tonkeeper, MyTonWallet и др.).
JS Bridge (встроенные кошельки)
Когда кошелёк встроен в Telegram (например, Wallet in Telegram), он инъектирует JavaScript-провайдер прямо в WebView:
Преимущества JS Bridge:
- Мгновенное подключение — нет сканирования QR или перехода по ссылке
- Нет сетевого round-trip — прямой вызов метода в том же процессе
- Бесшовный UX — пользователь не покидает Telegram
Приоритет: JS Bridge, затем HTTP Bridge
В Mini App сначала проверяйте доступность JS Bridge. Если встроенный кошелёк есть — подключение мгновенное. Если нет — fallback на HTTP Bridge с QR-кодом.
Определение доступного моста
// Проверка наличия JS Bridge
function detectBridge(): 'js' | 'http' {
// JS Bridge: кошелёк инъектирует провайдер в window
if (window.tonconnect) {
return 'js';
}
// Fallback на HTTP Bridge
return 'http';
}
SDK @tonconnect/ui-react определяет доступный мост автоматически — вам не нужно писать эту логику вручную:
import { TonConnectUIProvider, TonConnectButton } from '@tonconnect/ui-react';
function App() {
return (
// SDK автоматически определяет JS или HTTP Bridge
<TonConnectUIProvider manifestUrl="https://your-app.com/tonconnect-manifest.json">
<TonConnectButton />
{/* ... */}
</TonConnectUIProvider>
);
}
Комбинированная авторизация
Внутри Mini App у вас два источника идентификации:
| Источник | Что доказывает | Как получить |
|---|---|---|
initData | Telegram-аккаунт пользователя | Автоматически при запуске Mini App |
ton_proof | Владение TON-кошельком | При подключении через TON Connect |
Комбинированный паттерн:
Это позволяет:
- Показывать персонализированный контент по Telegram-аккаунту
- Выполнять блокчейн-операции от имени подтверждённого кошелька
- Предотвращать подмену адресов (ton_proof подписан приватным ключом кошелька)
Серверная валидация: двойная проверка
- Валидация initData — HMAC-SHA256 с bot_token (как в уроке 02)
- Валидация ton_proof — Ed25519 подпись, доказывающая владение кошельком (как в M07 урок 04)
- Создание сессии — связка Telegram user_id и TON address
Обе валидации обязательны
initData без ton_proof = знаем пользователя Telegram, но не знаем его кошелёк. ton_proof без initData = знаем кошелёк, но не знаем пользователя. Только комбинация даёт полную картину.
TON Address Explorer
Используйте виджет для исследования форматов TON-адресов — вставьте адрес кошелька и увидите его декодированную структуру:
TON-адрес в user-friendly формате — это 48 символов base64url, кодирующих 36 байт:
- 1 байт — флаг (bounceable/non-bounceable, mainnet/testnet)
- 1 байт — workchain ID (0 = basechain, -1 = masterchain)
- 32 байта — hash аккаунта
- 2 байта — CRC16-CCITT контрольная сумма
Полный пример: Mini App с TON Connect
import { TonConnectUIProvider, useTonWallet } from '@tonconnect/ui-react';
function WalletInfo() {
const wallet = useTonWallet();
if (!wallet) {
return <p>Подключите кошелёк для продолжения</p>;
}
return (
<div>
<p>Кошелёк: {wallet.account.address}</p>
<p>Chain: {wallet.account.chain}</p>
</div>
);
}
function App() {
return (
<TonConnectUIProvider
manifestUrl="https://your-app.com/tonconnect-manifest.json"
>
<div style={{
backgroundColor: 'var(--tg-theme-bg-color)',
color: 'var(--tg-theme-text-color)',
}}>
<h1>TON Connect в Mini App</h1>
<WalletInfo />
</div>
</TonConnectUIProvider>
);
}
Связь с M07
Этот урок развивает концепции из модуля M07:
| M07 Урок | Концепция | Применение в Mini App |
|---|---|---|
| 01: Протокол | Bridge, SSE, шифрование | HTTP Bridge работает так же |
| 02: Интеграция | Manifest, TonConnectButton | Те же компоненты |
| 04: ton_proof | Ed25519, серверная валидация | Комбинация с initData |
| 05: React SDK | Хуки, провайдер | Внутри Mini App WebView |
Новое в Mini App: JS Bridge, комбинированная авторизация, интеграция с темой Telegram.
Итоги
| Параметр | JS Bridge | HTTP Bridge |
|---|---|---|
| Когда | Встроенный кошелёк в Telegram | Внешний кошелёк (Tonkeeper и др.) |
| Подключение | Мгновенное | QR-код / deeplink |
| Сеть | Не нужна | Bridge server (SSE) |
| UX | Бесшовный | Переключение между приложениями |
| SDK | Автоматическое определение | Автоматическое определение |
В следующем уроке разберём интеграцию с ботом — как бот и Mini App обмениваются данными.
Частые ошибки
- Не учитывают встроенный кошелёк TON Space и показывают только внешние кошельки, хотя большинство пользователей Telegram уже имеют TON Space.
- Открывают QR-код для подключения внутри мобильного Telegram: в Mini App на мобильном устройстве QR-код бесполезен; нужен deep link.
- Не адаптируют UI подключения кошелька под контекст Mini App: кнопки и модалки должны учитывать ограниченный viewport.
- Забывают передавать ton_proof при подключении кошелька в Mini App: без proof серверная аутентификация невозможна.
Проверка знанийВ чём преимущество JS Bridge перед HTTP Bridge для TON Connect в Mini App?
Проверьте понимание
Закончили урок?
Отметьте его как пройденный, чтобы отслеживать свой прогресс
Войдите чтобы оценить урок