В открытом коде Telegram Web K — веб-версии по адресу web.telegram.org/k — 30 октября появился кошелёк Gram целиком: баланс, история, отправка и приём, секретная фраза, коллекционные предметы, переводы в чатах и TON Connect. 2 ноября его спрятали: константа WALLET_RELEASED стоит в false, и пока её не переключат руками, ни один пункт меню, ссылка или кнопка в кошелёк не ведут. На сайте web.telegram.org/k кошелька ещё нет — там сборка 30 октября, собранная за четыре с половиной часа до коммита кошелька. Во второй веб-версии, Web A, кошелёк уже в рабочей сборке: его показывает серверный флаг wallet_available, тот же, что у приложений для iOS и Android. Касается это тех, кто пользуется Telegram из браузера.

Что лежит в коде Web K

Кошелёк влит одним коммитом 30 октября в 19:18 UTC: 284 файла, 48 483 строки добавлено, 375 удалено. Описание коммита называет образцом клиенты для iOS и Android. Что в нём есть:

РазделЧто умеет
Баланссумма в Gram и в выбранной валюте
Историястраницы операций кешируются
Отправкаконтакту, по юзернейму, на адрес или домен TON DNS, с комментарием
Приёмадрес, QR-код, пополнение
Секретная фразарезервная копия, экспорт, проверка слов
Резервная копия ключавключение и выключение; при выключении можно сменить секретную фразу
Старый кошелёквторой кошелёк на устройстве лежит рядом с основным
Коллекционные предметыпросмотр и отправка
Переводы в чатахотдельная карточка, пока перевод идёт — «отправляется»
TON Connectподключение приложений и ответы на их запросы; запросы ждут, пока кошелёк закрыт

Транзакции и ключи считает не сам клиент, а движок wallet-engine — кроссплатформенный кошелёк TON на Rust от разработчика TON Core. В npm его нет: веб-пакет берётся архивом из релиза на GitHub, сейчас 0.0.7 от 30 сентября, и отдельный скрипт сверяет архив с опубликованной контрольной суммой. В тех же релизах лежат сборки движка для Android, Swift, macOS, Linux и Windows.

Между слиянием и скрытием кошелёк правили трижды, и все три правки — о меню адреса TON: два коммита стороннего автора, влитые запросом #750, и один ведущего разработчика Web K. Теперь при нажатии на адрес клиент ищет владельца в уже загруженных профилях и в карточках кошелька автора сообщения, собеседника и своего аккаунта, затем спрашивает сервер, а остальные профили догружает, только если сервер ответил, что кошелёк ни к кому не привязан. Владелец показывается строкой с аватаркой в размерах клиента для Android.

Что есть в Web A

Во второй веб-версии, telegram-tt, кошелёк Gram появился раньше — коммитом 12 октября «Wallet: Introduce Gram Wallet» на 26 255 строк. 26 октября к нему добавили новый экран отправки с эффектами на WebGPU, а отдельными коммитами — проверку ссылок TON Connect и операции, где второй стороной выступает канал или подарок Telegram.

Сборка на web.telegram.org/a — версия 12.0.48 от 26 октября — кошелёк содержит: он грузится отдельным модулем, а показывает его клиент, если сервер прислал аккаунту в конфиге wallet_available. Там же конфиг задаёт минимальную сумму перевода (wallet_transfer_min_nanos) и число переводов в сутки без платы за газ (wallet_gasless_daily_transfers).

Что делать

  • Нужен кошелёк в браузере сейчас — попробуйте web.telegram.org/a: там он может быть уже доступен. Показ решает тот же флаг сервера, что и в приложениях на телефоне, поэтому кошелька в браузере не будет у аккаунта, которому сервер его не включил.
  • Пользуетесь Web K — кошелька там пока не будет ни в меню, ни в настройках, ни в поиске по настройкам. Ссылка t.me/sendgrams до релиза открывается как обычная ссылка на юзернейм, а адрес TON в сообщении — простым текстом.
  • Пришёл перевод в чате Web K — карточка перевода видна, но до релиза не открывается: детали и зашифрованный комментарий смотрите в приложении на телефоне.
  • Перед выходом из аккаунта в браузере проверьте, записана ли секретная фраза или включена ли резервная копия. Ключи кошелька веб-версия хранит на устройстве, и в коде Web K экран выхода предупреждает об этом отдельно (раздел ниже). Как найти и сохранить фразу — в справке.

Как кошелёк спрятан до релиза

Скрытие заняло два коммита 2 ноября. Сначала в 14:31 UTC убрали пункт «Send Money» из меню чата, меню перевода Gram и меню адреса TON, остальное ещё зависело от сервера. В 15:23 UTC второй коммит закрыл всё: в файле lib/wallet/release.ts появилась константа WALLET_RELEASED = false. По её описанию, это не настройка: её переключат в коде в день релиза.

Пока она false, закрыты пункт «Wallet» в главном меню и в настройках (клиент не запрашивает даже баланс для этой строки), результат поиска по настройкам, пункт в меню вложений, все кнопки «Send Money», окно кошелька, ссылки кошелька и TON Connect, меню адреса TON и запросы TON Connect. Открытым кошелёк остаётся только в песочнице всплывающих окон — она есть в отладочных и предварительных сборках и работает на подставных данных, без запросов к серверу.

После релиза решать будет сервер, но с другим умолчанием, чем в Web A: Web K спрячет кошелёк, только если флаг wallet_available пришёл со значением «нет», а Web A покажет его, только если флаг пришёл со значением «да».

Ключи в браузере

Ключ кошелька Telegram можно держать в зашифрованной резервной копии. Включение и выключение копии в Web K по комментарию в коде повторяет клиент для iOS, а строки описывают её так: копия делится на три части и хранится в дата-центрах на трёх континентах, а собирается только на устройствах владельца. Если копию выключить, восстановить кошелёк можно будет только секретной фразой. При выключении клиент предлагает заодно сменить фразу: адрес и баланс остаются прежними, смена записывается в сеть и стоит комиссию, а с нулевым балансом её не сделать.

Отсюда предупреждения при выходе из аккаунта. Их у Web K четыре: ключи кошелька есть только на этом устройстве и копии у Telegram нет; на устройстве лежат ключи ещё одного, старого кошелька; смена ключа не подтверждена, и новый ключ есть только здесь; и общий случай — если ключи есть, выход их уничтожит. В первых трёх случаях вернуть кошелёк можно только секретной фразой, в последнем — резервной копией Telegram или фразой.

Как проверено