Інтеграція TON Connect для мобільних гаманців
TON Connect — протокол взаємодії між dApp і гаманцем у екосистемі TON Blockchain. На відміну від WalletConnect (EVM-світ), тут власний протокол поверх HTTP-bridge з push-сповіщеннями через SSE. Реалізація в мобільному додатку вимагає розуміння не лише SDK, але й того, як працює транспортний рівень.
Як влаштований транспорт TON Connect
Протокол працює через bridge-сервер (bridge.tonapi.io або самостійно розгорнутий). Гаманець і dApp обмінюються зашифрованими повідомленнями через цей bridge — прямого з'єднання нема. Шифрування — NaCl box (X25519 + XSalsa20-Poly1305).
Мобільний додаток-гаманець підключається до bridge через SSE (Server-Sent Events): GET /bridge/{clientId}/events. Це довгоживуче HTTP-з'єднання, яке утримує з'єднання відкритим. На iOS — проблема: URLSession не підтримує SSE нативно, потрібна бібліотека EventSource або кастомна реалізація через URLSessionDataDelegate. На Android з OkHttp — також немає вбудованої SSE-підтримки, але EventSource від OkHttp team (com.squareup.okhttp3:okhttp-sse) вирішує задачу.
Альтернативний транспорт — deeplink. dApp кодує tc:// або https://ton.app/... посилання, користувач клікає, гаманець відкривається й отримує connect request з URL-параметрів. Це синхронний flow без bridge — працює простіше, але вимагає, щоб dApp і гаманець були на одному пристрої.
Обробка connect request в гаманці
При отриманні запиту на підключення гаманець повинен:
- Декодувати
ConnectRequestз зашифрованого payload (або з deeplink-параметраr). - Показати користувачу: який dApp запрашує підключення, які
itemsпотрібні (ton_addr,ton_proof). - Отримати схвалення користувача.
- Сформувати
ConnectResponseз адресою гаманця, мережею (mainnet/testnet), публічним ключем іton_proofякщо запрошений.
ton_proof — криптографічне доказ володіння гаманцем без підписування транзакції. Формат: ton-proof-item-v2/<wc>:<addr_bytes>/<app_domain>/<timestamp>/<payload>. Підписується приватним ключем гаманця через Ed25519. dApp верифікує підпис через TON API, не довіряючи гаманцю на слово.
Типова помилка реалізації: неправильна серіалізація addr_bytes — потрібен raw-формат (workchain + 32 байти hash), не user-friendly bounce/non-bounce адреса.
Підписування транзакцій
Після підключення dApp відправляє SendTransactionRequest з BOC (Bag of Cells) — бінарним представленням TON-транзакції. Гаманець:
- Декодує BOC через
ton-coreабо@ton/ton. - Показує деталі транзакції користувачу: одержувач, сума, коментар.
- Підписує транзакцію приватним ключем.
- Відправляє підписаний BOC у TON мережу через
tonapi.ioабоtoncenter.com. - Повертає
SendTransactionResponseз хешем транзакції dApp.
Декодування BOC для відображення в UI — нетривіальна задача. BOC може містити виклики smart-контрактів з довільними payload'ами. Для стандартних jetton-переводів є парсер OP-кодів (0xf8a7ea5 — jetton transfer), для решти — показуємо raw hex і попередження.
TON Connect SDK для мобіля
Офіційний @tonconnect/sdk написаний для JavaScript/TypeScript — у React Native працює з polyfills (react-native-crypto, buffer). Для нативних платформ офіційного SDK немає — реалізуємо протокол самостійно по специфікації або використовуємо community-бібліотеки (TonSdk.NET для MAUI, ton-kotlin для Android).
Tonkeeper — open source, відмінна референція для розуміння реальної реалізації TON Connect на мобілі.
Орієнтири за часом
Інтеграція TON Connect в існуючий гаманець (лише підключення та підпис транзакцій) — 3–5 тижнів. Повноцінний TON-гаманець з нуля (управління seed, деривація ключів, jetton-підтримка, NFT, staking) — 4–6 місяців.







