В коде Telegram Desktop готово подключение кошелька к сайту прямо в окне входа через Telegram. Сайт, на который вы входите своим аккаунтом Telegram, сможет в том же запросе попросить адрес встроенного кошелька, и одно подтверждение и впустит вас на сайт, и подключит к нему кошелёк по TON Connect. Код лежит в ветке разработки клиента с 12–13 октября, тот же тип данных есть в бете Telegram для macOS от 20 октября. В вышедших версиях и в документации API функции пока нет.
Как это будет выглядеть
Окно подтверждения входа сейчас показывает, какой сайт просит доступ, с какого устройства пришёл запрос, и переключатель «Allow Messages» — разрешить боту сайта писать вам. По коду клиента, если сайт попросил кошелёк, под этим появляются:
- строка «Wallet» с адресом вашего кошелька Telegram, разбитым на две половины (нажатие копирует адрес);
- переключатель «Connect Wallet», включённый по умолчанию;
- пояснение: «{бот} просит подключить ваш кошелёк к этому сайту. Сайт увидит ваш адрес в TON, баланс и операции, но не сможет переводить средства без вашего разрешения. Подключение подписывает подпись для входа, а не перевод».
Все шесть новых строк интерфейса добавлены одним коммитом 12 октября с описанием «Grant site wallet access from the login confirmation». Если переключатель оставить включённым, после подтверждения входа клиент попросит разблокировать кошелёк и только потом отправит согласие на сервер.
Кошелёк просят только во входе по ссылке, когда сайт отправляет вас на подтверждение в Telegram. Кнопки входа под сообщениями ботов в чатах этот запрос не несут: в их ветке кода поле кошелька отправляется пустым.
Что получает сайт
Подключение идёт по TON Connect — протоколу, которым сайты и мини-приложения подключают TON-кошельки. В обычном сценарии сайт показывает список кошельков, пользователь выбирает свой и подтверждает подключение уже в кошельке. Здесь этот шаг встроен в окно входа: вместе с запросом на вход сервер Telegram передаёт клиенту номер сессии TON Connect и идентификатор сайта в ней.
Подтверждая вход, клиент создаёт сессию на стороне кошелька, подписывает ей ton_proof и отправляет подпись вместе с согласием на вход. ton_proof — это подпись, которой кошелёк доказывает сайту, что адрес принадлежит ему; переводов она не разрешает. Текст подписи собирается из трёх значений: идентификатора бота сайта, идентификатора сайта в TON Connect и номера сессии, с приставкой tc-login. Так подпись привязана к одному конкретному входу и для другого входа не годится.
В схеме API под это добавлены три поля в ответ на запрос входа (флаг «нужен кошелёк», номер сессии, идентификатор сайта) и одно поле в подтверждение входа — tonconnect_session с подписью владения кошельком. По журналу схемы это слой 231 от 12 октября. На core.telegram.org описан слой 225, и полей кошелька там нет.
Цепочка вызовов в коде клиента
- Сервер отвечает на запрос входа
urlAuthResultRequestс флагомrequest_walletи полямиtc_session_id,tc_client_id. - После нажатия «Войти» клиент вызывает
wallet.tonConnectCreateSessionс идентификатором сайта и адресом манифеста. - Ждёт, пока сервер прочитает манифест: опрос
wallet.tonConnectGetPendingраз в 5 секунд, не больше 12 раз, то есть до минуты. - Регистрирует ключ сессии (
wallet.tonConnectRegisterKey), получает вызов и подписывает ответ вместе сton_proof. - Отправляет
messages.acceptUrlAuthс полемtonconnect_session— номер сессии, ответ на вызов, тело и подпись владения кошельком.
Какие сайты кошелёк не получат
Адрес манифеста клиент не берёт от сайта, а строит сам: https://<domain>/tonconnect-manifest.json. Манифест — небольшой файл с названием и иконкой сайта, который TON Connect показывает в кошельке. Если сервер вернул манифест с другого хоста, клиент отказывает с ошибкой о неверном манифесте. Сайт, на который вы входите, и сайт, получающий кошелёк, таким образом всегда совпадают.
Двум доменам кошелёк не выдаётся вовсе, и окно пишет «Wallet access can't be granted to this site». Первый — telegram.org. Второй клиент узнаёт от сервера: это домен, который Telegram сам использует для проверки владения кошельком в ответе wallet.getProofChallenge. Судя по коду, так подпись, которой кошелёк подтверждает владение самому Telegram, нельзя получить через чужой сайт.
Если кошелёк создан на другом устройстве
Встроенный кошелёк Telegram держит ключ на устройстве. Если на этом компьютере текущего ключа нет, окно входа покажет «This device doesn't hold the current key of this wallet» и ссылку «Restore the key»: восстановить ключ можно, не закрывая окно входа. Без ключа переключатель неактивен, а вход на сайт проходит как обычно, без кошелька.
Где это уже есть
| Где | Что | Дата |
|---|---|---|
| tdesktop, ветка dev | окно входа с кошельком, шесть строк интерфейса | 12 октября |
| tdesktop, ветка dev | исправлены гонки окна, кошелёк подгружается заранее | 13 октября |
| Бета Telegram для macOS 13.0.283345 | тип inputTonConnectOauthSession в коде, строк интерфейса нет | 20 октября |
| Последний релиз Telegram Desktop 7.3.1 | нет | 10 октября |
| TDLib | нет | — |
Включён ли запрос кошелька на сервере, по клиентам не видно: окно появится, только когда сайт его попросит, а инструкций для сайтов Telegram не публиковал. До сих пор подпись ton_proof при подключении через TON Connect встроенным кошельком Telegram многие сайты проверить не могли — для этого с версии TON Connect 5.0 нужна отдельная ветка проверки.




