> ## Documentation Index
> Fetch the complete documentation index at: https://whalescorp.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# TON/SOL Connect

# Какие протоколы подключения используются

В кошельке [Tonhub](https://tonhub.com/) подключение к веб-приложениям и dApp для сети [TON](https://ton.org/) выполняется через протокол [**TON Connect**](https://docs.ton.org/develop/dapps/ton-connect/overview). Для [Solana](https://solana.com/) отдельного протокола "Solana Connect" нет: подписание транзакций Solana в тех же приложениях работает через дополнительные методы, которые добавляются в ту же сессию TON Connect. Ниже описано, как это устроено.

# TON Connect

[TON Connect](https://docs.ton.org/develop/dapps/ton-connect/overview) — это протокол для подключения кошельков к приложениям, то есть dApp, в сети TON. Он позволяет:

* подключаться к приложению: приложение запрашивает разрешение на подключение, пользователь подтверждает его в кошельке, после чего приложение получает адрес TON-кошелька и при необходимости proof владения;
* отправлять транзакции: приложение создает транзакцию, кошелек показывает ее пользователю и подписывает после подтверждения;
* подписывать данные через `signData`: любые сообщения для авторизации или верификации без отправки средств;
* отключаться: завершать сессию с приложением.

В [Tonhub](https://tonhub.com/) приложение, то есть dApp, открывается во встроенном браузере [WebView](https://developer.android.com/reference/android/webkit/WebView). В веб-страницу встраивается специальный bridge-объект: приложение вызывает его методы, Tonhub обрабатывает эти вызовы, показывает экраны подтверждения, подписывает транзакции и возвращает результат обратно в WebView. Именно так в рамках одной сессии работают и подключение через TON Connect, и запросы на подписание Solana-транзакций.

# Интеграция с Holders

[**Holders**](https://holders.tg/) — один из основных примеров использования TON Connect в Tonhub. Интеграция с Holders построена именно на этой технологии. Holders открывается как Connect App, то есть приложение, работающее через общий bridge в WebView. При первом входе пользователь проходит процедуру подключения, то есть enroll: с сервера Holders загружается конфигурационный файл TON Connect `/jsons/tonconnect-manifest.json`, пользователь подтверждает подключение в кошельке, после чего сохраняются сессия и, при необходимости, токен от Holders.\
Для TON Holders использует стандартный [TON Connect](https://docs.ton.org/develop/dapps/ton-connect/overview): в ответ на запрос подключения кошелек передает TON-адрес и при необходимости proof, после чего Holders может запрашивать подписание TON-транзакций и данных через те же bridge-методы `sendTransaction` и `signData`.

## Как работает коннектор Solana

Для [Solana](https://solana.com/) в экосистеме TON отдельного протокола "Solana Connect" нет. В Tonhub это решено следующим образом:

* при подключении к Holders ответ включает не только TON-данные, то есть адрес и proof, но и Solana proof, благодаря чему Holders получает доступ к вашему Solana-адресу, который генерируется из того же кошелька;
* для получения пользовательского токена сервер Holders принимает запрос, передающий авторизационные данные и для TON, и для Solana, то есть `TonSolanaAuthRequest`; таким образом, "подключение" Solana к Holders — это не отдельный протокол, а расширение одной сессии TON Connect данными Solana при первом подключении;
* когда Holders нужно подписать транзакцию в сети Solana, приложение вызывает уже не TON Connect, а специальные bridge-методы `sendSolanaTransaction` или `sendSolanaVersionedTransaction`. Tonhub показывает экран подтверждения Solana-перевода, пользователь подписывает транзакцию, а подпись возвращается в Holders.

# Разрешения и управление сессиями

## Несколько приложений одновременно

Пользователь может быть одновременно подключен к нескольким приложениям, то есть Connect App. Список подключенных приложений сохраняется отдельно для каждого адреса кошелька, и у каждого приложения есть собственная сессия, встроенная или remote. Ограничений по количеству активных подключений нет.

## Список активных подключений и отзыв доступа

Список подключенных Connect App, то есть приложений, к которым вы подключались через [TON Connect](https://docs.ton.org/develop/dapps/ton-connect/overview), можно посмотреть в разделе приложений и браузера в Tonhub, то есть на экране с расширениями и подключенными приложениями. Там же отображаются и remote-сессии, если подключение происходило по QR-коду из внешнего браузера.

## Как завершить сессию

Для каждого приложения в списке доступно действие **"Revoke Access"**. После подтверждения приложение удаляется из списка подключенных, сессия завершается, и при следующем входе приложение должно будет снова запросить подключение. Для remote-сессий отзыв также отправляется на сервер Tonhub по маршруту `/connect/revoke`, чтобы на другой стороне сессия тоже считалась недействительной.

## Удаление Tonhub и смена устройства

Информация о подключенных приложениях и сессиях хранится локально на устройстве, то есть в памяти приложения. При удалении [Tonhub](https://tonhub.com/) эти данные удаляются. Все сессии с вашим кошельком со стороны dApp перестают работать при следующем запросе, потому что кошелек больше не отвечает. Переустановка Tonhub и восстановление кошелька по seed-фразе не восстанавливают старые подключения: каждое dApp нужно подключать заново.\
Перенос кошелька на новое устройство через импорт seed-фразы также не переносит список подключенных приложений и сессий: они остаются привязаны к старому устройству. На новом устройстве список подключений будет пустым, и все dApp придется подключать снова.

# Ограничения и поддерживаемые сценарии

**Gasless, то есть оплата комиссии токеном:** функция gasless-отправки в [Tonhub](https://tonhub.com/) в первую очередь работает для переводов внутри самого приложения. При запросе транзакции из внешнего dApp через [TON Connect](https://docs.ton.org/develop/dapps/ton-connect/overview) возможность оплачивать комиссии токенами, то есть gasless, может быть недоступна или ограничена, например в зависимости от типа актива и сценария использования. Полноценный gasless-сценарий через произвольный внешний dApp по TON Connect не работает; лучше всего эта функция подходит для переводов из самого приложения Tonhub.

# Версионирование и совместимость

### Версия TON Connect в Tonhub

[Tonhub](https://tonhub.com/) поддерживает протокол [TON Connect](https://docs.ton.org/develop/dapps/ton-connect/overview) версии 2, то есть `CURRENT_PROTOCOL_VERSION = 2`. Более старые версии не поддерживаются, то есть `MIN_PROTOCOL_VERSION = 2`. При подключении кошелек сообщает приложению максимальную поддерживаемую версию протокола.

### Что следует учитывать разработчикам dApp

* **Методы:** поддерживаются методы SendTransaction, то есть отправка одной или нескольких TON-транзакций; для wallet v5 — до 255 сообщений в одной транзакции, `extraCurrencySupported: true`, а также SignData для типов text, binary и cell. Остальные методы должны соответствовать [спецификации TON Connect v2](https://docs.ton.org/develop/dapps/ton-connect/protocol/requests-responses).
* **Manifest:** приложение должно предоставлять конфигурационный файл, то есть manifest, по URL, указанному в запросе на подключение, то есть `manifestUrl`. Обязательные поля: **name**, **url**, **iconUrl**. Необязательные: **termsOfUseUrl** и **privacyPolicyUrl**. Если manifest отсутствует или некорректен, подключение будет отклонено.
* **Запрос на подключение:** запрос должен содержать `manifestUrl` и непустой список `items`, то есть запрашиваемых данных, например `ton_addr`, `ton_proof`. Иначе запрос считается некорректным.
* **Дополнительные поля:** приложение может запрашивать опциональные элементы, например proof; кошелек вернет только то, что поддерживает и что разрешил пользователь. Для интеграций вроде [Holders](https://holders.tg/) поддерживается расширенный набор, включая `solana_proof`, но это не часть стандартного TON Connect, а дополнение Tonhub и Holders.

# Безопасность

Во всех операциях при подключении к dApp, а также при подписании транзакций или данных, приватный ключ и seed-фраза никогда не передаются в приложение. Приложение получает только то, что кошелек явно отправляет в ответ на запрос, например адрес, proof, подпись транзакции и так далее. Подписание выполняется локально в [Tonhub](https://tonhub.com/): dApp запрашивает подпись через bridge, пользователь подтверждает операцию в интерфейсе кошелька, после чего подписанные данные возвращаются приложению. Приватные ключи хранятся в защищенном хранилище устройства, то есть [Keychain](https://developer.apple.com/documentation/security/keychain_services) или [Keystore](https://developer.android.com/training/articles/keystore), и никогда не покидают приложение. Подробнее об этом см. в общем разделе документации **"Security"**, где описано хранение ключей, PIN, биометрия и резервное копирование.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.