Миграция токенов завершена, но новые токены не пришли

2026-09-03

Миграция токенов завершена, но новые токены не пришли

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

Миграция токенов завершена, но новые токены не пришли: ключевые моменты кратко

Что на самом деле подтверждает завершённый обмен

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

У обмена при миграции две ноги, и поэтому здесь этот разрыв важнее обычного. Одна нога уводит ваши старые единицы. Другая выплачивает новые. Квитанция покрывает транзакцию целиком, а контракт можно написать так, что вторая нога сделает меньше ожидаемого или вовсе ничего, а первая при этом не откатится.

Значит, отвечать нужно не на вопрос, сработал ли обмен. Отвечать нужно на то, записан ли теперь новый баланс на ваш адрес, и если да, почему его ничто не отображает. Это две отдельные проверки, и такой порядок избавляет вас от спора с поддержкой о балансе, которым вы уже владеете.

Где на самом деле записан новый баланс

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

Событие — это Transfer. Стандарт говорит, что оно ДОЛЖНО срабатывать при переводе токенов, включая переводы нулевого объёма. Он добавляет, что контракт токена, создающий новые токены, СЛЕДУЕТ сопровождать событием Transfer с адресом отправителя, выставленным в 0x0. Поэтому миграция, которая чеканит токены на ваш адрес, оставляет перевод с нулевого адреса вам, а та, что платит из заранее пополненного резерва, оставляет перевод с этого резерва. В обоих случаях есть строка, которую можно найти.

Значение — это balanceOf, которую стандарт описывает как возвращающую баланс другого счёта по указанному адресу владельца. Это чтение, оно ничего не стоит и отвечает про настоящий момент, а не про момент обмена. Откройте новый контракт в обозревателе блоков и вызовите balanceOf со своим адресом. Возвращённое число и есть авторитетный ответ.

Что можно прочитать Что это устанавливает
Статус квитанции по обмену Только то, что внешний вызов не откатился
Событие перевода на ваш адрес Что новые единицы тогда были вам зачислены
Показание balanceOf в новом контракте Сколько вы держите в этой книге сейчас
Список активов в кошельке Ничего о владении

Почему баланс может быть вашим, а кошелёк ничего не показывает

Последняя строка решает тот вариант этой ситуации, который исправляется бесплатно. Кошелёк не сканирует каждый контракт в сети на ваш адрес. Он рисует список активов, который ему велели отслеживать, а контракт, развёрнутый на прошлой неделе, в этом списке отсутствует, пока его туда что-нибудь не внесёт.

Это известный пробел, а не поломка. EIP-747, стандарт метода wallet_watchAsset, описывает его как способ позволить клиенту предложить кошельку пользователя токен для отслеживания и прямо говорит: без него каждый кошелёк должен либо заранее загружать список одобренных активов, либо пользователи должны добавлять активы вручную. Миграция даёт ровно этот случай.

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

Когда обмен зачислил на адрес, который вам не принадлежит

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

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

Один канцелярский случай стоит исключить первым. Некоторые миграции выпускают новый токен в другой сети, поэтому зачисление попадает в сеть, на которую ваш кошелёк не переключён. Смена сети решает это за секунды.

Когда старые единицы ушли, а обратно ничего не пришло

Если события перевода нет, balanceOf показывает ноль, а старый баланс действительно исчез, значит нога выплаты не отработала, и причин немного.

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

Вторая — сумма меньше ожидаемой, а не её отсутствие. Прежде чем решить, что ничего не пришло, проверьте коэффициент конвертации и десятичные разряды обоих контрактов. Кошелёк с 40 000 старых единиц при консолидации одна новая единица за каждые четыре старых получает 10 000 новых единиц, то есть 25% от привычной ему цифры. В контракте с другим значением decimals корректное зачисление тоже может отображаться с десятичной запятой в непривычном месте.

Третья — старые единицы ушли туда, где нет ноги выплаты. Отправка токенов прямо на адрес контракта вместо интерфейса, который его вызывает, обмен не запускает. Стандарт делает это возможным, потому что approve разрешает расходующей стороне списывать с вашего счёта до заданной суммы, а transferFrom используется для процедуры списания, позволяя контрактам переводить токены от вашего имени. Контракт обмена рассчитывает забрать у вас, а не получить нечто, о чём ему не сообщали.

Миграции, которые площадка провела за ваш счёт

Другой путь даёт ту же жалобу по совсем иным причинам. Если во время миграции вы держали старый токен на централизованной площадке, она конвертировала свой общий баланс и переписала запись вашего счёта, и всё событие выглядело как смена тикера без единой вашей транзакции.

На этом пути нет транзакции обмена для разбора, поэтому ни одна из ончейн-проверок не применима. Применимо расписание самой площадки: приостановка ввода и вывода старого токена, конвертация балансов счетов и возобновление под новым тикером. Баланс, ещё не конвертированный во время такой приостановки, приостановлен, а не потерян.

Эти два пути и эскалируются по-разному. Площадка, которая вам не зачислила, — вопрос поддержки с названным контрагентом. У ончейн-обмена, который не заплатил, контрагента в цепочке нет, потому что контракт исполнил то, что в него записали.

Что проверять и в каком порядке

Порядок Что проверить Что исключает отрицательный ответ
1 В той ли сети кошелёк, где выпущен новый токен Проблему отображения из-за неверной сети
2 Добавлен ли адрес нового контракта вручную То, что кошелёк не отслеживает новый контракт
3 Отвечает ли balanceOf по вашему адресу Любое оставшееся объяснение через отображение
4 Есть ли в обмене событие перевода вам Зачисление, которое было и потом ушло
5 Какой адрес называет это событие Выплату на депозитный адрес
6 Сходятся ли коэффициент и decimals с пришедшим Корректное зачисление, прочитанное как ошибка
7 Проводила ли площадка миграцию за вас Ончейн-разбор, который вообще не применялся

Идите по этому списку сверху вниз, а не поперёк. Каждая строка убирает класс объяснений, а строки ниже имеют смысл только после того, как решены верхние. Первые три ничего не стоят.

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

Итог

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

Когда это проблема отображения, последовательность коротка: переключиться на нужную сеть, добавить адрес контракта вручную, и баланс уже там. Когда нет, событие перевода называет адрес, который был зачислен на самом деле, и это поле отделяет выплату не на тот счёт от выплаты, которой не было. Определите, с чем из двух вы имеете дело, прежде чем отправлять что-либо ещё куда-либо. Чтобы продолжать изучать основы, следите за материалами Bitbase Academy.

Похожие материалы

Другие материалы Bitbase по этой теме:

- Как рассчитать запас хода казны токен-проекта

- Механика предложения токенов

- Что такое крипто-токен? Токены и монеты: в чём разница

- Стены покупок и продаж и глубина стакана

- Стратегия торговли на пробоях

Дисклеймер: эта статья — образовательный материал Bitbase Academy, только для информационных целей. Она не является инвестиционным, торговым, налоговым или финансовым советом. Криптоактивы волатильны — оценивайте риски самостоятельно. Написано в сентябре 2026 года; сверяйтесь с актуальной официальной информацией.

Источники

[1] Ethereum Improvement Proposals, ERC-20: Token Standard (EIP-20, статус Final) eips.ethereum.org

[2] Ethereum Improvement Proposals, EIP-747: wallet_watchAsset RPC Method (статус Final) eips.ethereum.org