Манифест приложения (tonconnect-manifest.json)

Соберёшь валидный tonconnect-manifest.json: поля, хостинг на HTTPS и типичные ошибки 404/CORS.

Зачем манифест

tonconnect-manifest.json — публичный JSON, который кошелёк загружает по URL при Connect. Из него пользователь видит имя, иконку и сайт приложения. Без доступного манифеста подключение ломается (часто выглядит как «манифест не найден»).

Это не секретный конфиг и не API-ключ — файл должен открываться в браузере без авторизации.


Полный рабочий пример

Положи файл в public/tonconnect-manifest.json (или отдавай с CDN) так, чтобы он открывался по прямому HTTPS-URL:

json
{
  "url": "https://app.example.com",
  "name": "Example dApp",
  "iconUrl": "https://app.example.com/icon-180.png",
  "termsOfUseUrl": "https://app.example.com/terms",
  "privacyPolicyUrl": "https://app.example.com/privacy"
}

Минимально обязательны:

ПолеТребование
urlHTTPS-адрес приложения (origin)
nameЧеловекочитаемое имя в кошельке
iconUrlHTTPS-картинка (PNG/SVG), желательно квадрат ≥ 180×180

termsOfUseUrl и privacyPolicyUrl — опциональны, но полезны для магазинов/кошельков.

В коде:

tsx
// @tonconnect/ui-react ^3.0.0
<TonConnectUIProvider manifestUrl="https://app.example.com/tonconnect-manifest.json">
  {children}
</TonConnectUIProvider>

Проверка: открой manifestUrl в инкогнито — должен быть JSON с Content-Type, близким к application/json, без редиректа на HTML логина.

Как это работает

Кошелёк по manifestUrl делает HTTP GET → читает name / iconUrl → показывает их в экране подтверждения.

url в JSON должен соответствовать реальному origin приложения (важно и для ton_proof: domain в proof сверяют с манифестом).

CORS: если манифест на другом домене, сервер должен отдавать заголовки, позволяющие читать JSON со стороны клиента кошелька / bridge-сценариев. Проще всего хостить манифест на том же origin, что и dApp.

Частые ошибки

404 или SPA fallback на index.html → кошелёк получает HTML вместо JSON. Исключи путь манифеста из rewrite правил (Next.js: файл в public/).

iconUrl по HTTP или битая ссылка → Connect может пройти, но UI кошелька выглядит «пустым» / часть клиентов ругается. Только HTTPS и реальный файл.

url = localhost в production-манифесте → мобильный кошелёк не ассоциирует приложение с реальным доменом. Для локальной разработки используй туннель и манифест с тем же публичным host.


Что дальше

Материалы gramdocs.tech носят образовательный характер и не являются финансовой, юридической или инвестиционной рекомендацией. Работа с блокчейном TON и токеном Gram связана с рисками потери средств. Правовая информация