Как добавить поддержку новых токенов в старый мобильный кошелёк без перезапуска

Вы обновили приложение кошелька, а нужный токен так и не появился. Или наоборот — разработчик интегрировал новый блокчейн, а пользователи видят только старый список монет. Знакомая ситуация. Разберёмся, как реально добавить поддержку новых токенов в мобильный кошелёк без полного перезапуска приложения — будь вы разработчик, которому нужно задокументировать процесс, или продакт, который хочет понять, что тут вообще возможно.

Почему токены не появляются сами собой

Мобильный кошелёк — это не волшебная коробка, которая автоматически узнаёт о каждом новом токене в сети. Список поддерживаемых токенов определяется несколькими вещами:

  • Встроенный список токенов (token registry) — жёстко прописанный в клиенте перечень адресов контрактов, символов, десятичных знаков и сетей.
  • Удалённый конфиг — JSON-файл или API-эндпоинт, с которого кошелёк загружает актуальный список при запуске или в фоне.
  • Парсинг блокчейна — кошелёк сам сканирует входящие транзакции и показывает токены, которые обнаружил по вашему адресу.

Если кошелёк «старый» — скорее всего, он работает по первому или второму варианту. Значит, чтобы добавить новый токен, нужно обновить именно этот источник данных. И вот тут начинается самое интересное: можно ли это сделать без перезапуска всего приложения или нет — зависит от архитектуры.

Три реальных подхода

1. Удалённый конфиг — самый чистый путь

Если кошелёк уже тянет список токенов с вашего сервера (или из публичного репозитория вроде MyCrypto или Uniswap), вам повезло. Достаточно добавить запись в конфиг — и пользователи увидят новый токен при следующем обновлении данных.

Типичная структура записи в таком конфиге выглядит примерно так:

{
  "name": "Example Token",
  "symbol": "EXT",
  "decimals": 18,
  "chainId": 1,
  "address": "0x1234...abcd",
  "logoURI": "https://example.com/logo.png"
}

Что нужно сделать:

  1. Открыть репозиторий или сервер с конфигом токенов.
  2. Добавить новую запись с корректными параметрами (адрес контракта, decimals, chainId).
  3. Запушить изменения.
  4. Дождаться, пока кошелёк заберёт обновлённый конфиг — обычно это происходит при запуске приложения или по таймеру в фоне.

Плюс: не нужно релизить новую версию приложения. Минус: пользователь всё равно должен хотя бы раз перезапустить кошелёк (или дождаться фонового обновления), чтобы подтянуть новый конфиг. Если кошелёк кэширует список при первом запуске и не обновляет его до перезапуска — это архитектурная проблема, которую стоит исправить.

2. Встроенный список — тут без перезапуска никак

Если список токенов зашит прямо в бинарник (например, как массив в Swift/Kotlin-коде), то единственный способ добавить новый токен — выпустить обновление приложения. Никакой магии.

Но есть полумеры, которые смягчают боль:

  • Feature flag на показ токена. Вы зашиваете токен в код, но включаете его через удалённый флаг. Пользователь видит новый токен без обновления приложения, но разработчику всё равно нужно выпустить версию с этим токеном «в кустах» заранее.
  • Lazy loading иконок и метаданных. Адреса контрактов могут быть в коде, а логотипы и названия подтягиваться из интернета. Это не решает проблему добавления новых адресов, но упрощает обновление визуальной части.

3. Автообнаружение по блокчейну

Некоторые кошельки (MetaMask Mobile, Trust Wallet) умеют автоматически находить токены по адресу пользователя, сканируя блокчейн. В этом случае новый токен не нужно добавлять в список вообще — он появится, как только на адрес придёт первая транзакция с ним.

Но у этого подхода есть ограничения:

  • Кошелёк должен поддерживать конкретную сеть (EVM, Solana, TON — у каждого свой механизм сканирования).
  • Токен должен быть стандарта (ERC-20, SPL и т.д.) — кастомные контракты могут не обнаружиться.
  • Пользователь может не понять, почему вдруг появилась неизвестная монета — нужна аккуратная UX-подача.

Сравниваем подходы

Подход Нужен ли перезапуск кошелька Нужен ли релиз новой версии Скорость появления токена Сложность поддержки
Удалённый конфиг Один раз (или фоновое обновление) Нет Минуты — часы Низкая
Встроенный список + флаг Нет (если флаг включён) Да (один раз, заранее) Мгновенно после включения флага Средняя
Автообнаружение Нет Нет После первой входящей транзакции Высокая (зависит от сетей)

Что делать, если вы разработчик и вам нужно прямо сейчас

Допустим, вы получили задачу: «добавьте токен XYZ, релиз через неделю, перезапускать кошелёк не хотим». Вот пошаговый план:

  1. Проверьте, откуда кошелёк берёт список токенов. Если есть API-эндпоинт или удалённый JSON — отлично. Если всё в коде — переходите к шагу 4.
  2. Добавьте токен в удалённый конфиг. Убедитесь, что адрес контракта проверен, decimals правильный, сеть указана верно. Ошибка в одном символе адреса — и пользователи не увидят токен или увидят не тот.
  3. Проверьте кэширование. Если кошелёк кэширует конфиг и не обновляет его до полного перезапуска приложения — добавьте механизм принудительного pull-to-refresh или фонового обновления с коротким TTL.
  4. Если конфига нет — добавьте токен в код, но спрячьте за флагом. В следующем релизе токен уже будет в базе, а включите его когда будете готовы через удалённый флаг.
  5. Протестируйте на тестовой сети. Отправьте токен на тестовый адрес и убедитесь, что он отображается корректно — с правильным балансом, символом и иконкой.

Частые ошибки, которые всё ломают

  • Неправильный адрес контракта. Копируйте адрес с официального источника проекта или блокчейн-эксплорера. Одна опечатка — и кошелёк показывает пустой токен или не тот токен вообще.
  • Несовпадение decimals. Если контракт использует 6 десятичных знаков, а вы указали 18 — баланс отобразится неправильно. Пользователь увидит вместо 100 токенов какое-то космическое число.
  • Забыли про сеть. Токен может существовать в нескольких сетях (BEP-20 и ERC-20, например). Если вы добавили только одну сеть, пользователи в другой сети не увидят свой баланс.
  • Отсутствие иконки. Технически токен работает и без картинки. Но пользователи не доверяют токенам без логотипа — это выглядит как скам. Добавьте хотя бы заглушку.
  • Не добавили в поиск. Токен в списке есть, но по его названию или символу не ищется. Проверьте, что поисковый индекс обновляется вместе с конфигом.

Что выбрать в зависимости от вашей ситуации

Если у вас есть серверная часть и вы можете обновлять конфиг: используйте удалённый конфиг. Это самый простой и гибкий способ. Токен появится у пользователей в течение нескольких минут после публикации конфига, без перезапуска приложения (если правильно настроено кэширование).

Если кошелёк старый и список токенов зашит в код: у вас два пути. Либо выпускайте обновление и добавляйте токен в список (долго, но надёжно), либо рефакторите архитектуру и внедряйте удалённый конфиг (инвестиция, которая окупится в будущем).

Если вы хотите, чтобы кошелёк находил любые токены автоматически: внедряйте автообнаружение по блокчейну. Но будьте готовы к тому, что это нетривиальная задача — каждая сеть требует своего сканера, и нужно аккуратно обрабатывать случаи с некорректными контрактами.

Если токен нужно добавить срочно для узкой аудитории: используйте feature flag. Добавьте токен в следующий релиз «в кустах», а включите для нужных пользователей через удалённый флаг. Это даёт контроль без перезапуска.

Как сделать так, чтобы перезапуск не требовался

Если вы проектируете кошелёк с нуля или рефакторите старый, вот что стоит заложить в архитектуру:

  1. Все метаданные токенов (адрес, decimals, название, символ, иконка) должны храниться на сервере и запрашиваться приложением при запуске и периодически в фоне.
  2. Кэш конфига должен иметь короткий TTL — не сутки, а 15–30 минут. Так обновления дойдут до пользователей быстро.
  3. Pull-to-refresh на экране списка токенов — простой и понятный способ для пользователя принудительно обновить данные.
  4. WebSocket или push-уведомление о новых токенах — продвинутый вариант. Сервер сообщает клиенту: «Эй, добавился новый токен, подтяни обновлённый конфиг».
  5. Fallback на автообнаружение — если токен не в конфиге, но обнаружен в блокчейне по адресу пользователя, показать его с пометкой «неизвестный токен».

Практический чек-лист перед публикацией

Перед тем как считать задачу выполненной, проверьте следующее:

  • Токен отображается в списке активов с правильным названием и символом.
  • Баланс отображается корректно (проверьте с блокчейн-эксплорером).
  • Иконка загружается и отображается.
  • Токен находится через поиск по названию и по символу.
  • Можно отправить токен (адрес контракта правильный, транзакция проходит).
  • Можно получить токен (адрес для пополнения отображается верно).
  • Токен отображается в истории транзакций с правильным количеством десятичных знаков.

Итог

Добавить новый токен в старый мобильный кошелёк без перезапуска — можно, но только если архитектура это позволяет. Если кошелёк работает с удалённым конфигом — просто добавьте запись и убедитесь, что кэш обновляется. Если список зашит в код — либо рефакторьте в сторону удалённого конфига, либо используйте feature flag для плавного включения. Автообнаружение по блокчейну — самый удобный для пользователя вариант, но и самый сложный в реализации.

Главное, что стоит запомнить: если вы разрабатываете кошелёк и хотите гибкости в будущем — выносите метаданные токенов на сервер уже сейчас. Это сэкономит вам десятки релизов и сотни часов работы в будущем.

Информация в статье носит ознакомительный характер. При разработке финансовых приложений учитывайте требования регуляторов и стандарты безопасности для вашей юрисдикции. Архитектурные решения лучше обсуждать с профильными специалистами.

platejigid.ru — мир платежей и цифровых финансов