Кошелёк показывает, что у вас есть токены, но при отправке появляется ошибка execution reverted: ERC20: transfer amount exceeds balance или похожая. Если транзакцию всё же отправить, она завершится со статусом Fail, а газ спишется. Разберёмся, почему контракт «не видит» баланс, который видите вы.
Симптом: контракт отказывается переводить
- Кошелёк предупреждает, что транзакция, скорее всего, не пройдёт.
- В обозревателе у транзакции статус Fail с текстом про balance.
- Обычно ошибка возникает на сумме «всё до копейки», с токенами из аирдропа или после переключения сети.
Почему так: баланс считает контракт, а не кошелёк
Токен ERC-20 — это смарт-контракт, который хранит таблицу «адрес → баланс». Функция transfer проверяет, что у отправителя хватает средств, и отменяет выполнение, если сумма больше записанного баланса. Так работает стандартная реализация, описанная в документации OpenZeppelin, на которой построено большинство токенов. Кошелёк же показывает то, что получил от узла и своего списка токенов, — и иногда это не то, что вы пытаетесь отправить.
| Причина | Как проявляется | Как проверить |
|---|---|---|
| Неверные decimals | Сумма в базовых единицах больше реальной | Сравнить decimals контракта с введённой суммой |
| Не та сеть | Баланс есть в одной сети, отправка в другой | Сверить сеть в кошельке и обозревателе |
| Другой контракт | Токен с тем же тикером, но иным адресом | Сверить адрес контракта с официальным |
| Комиссия за перевод у токена | Отправка «всего» не проходит | Попробовать сумму чуть меньше |
| Блокировка эмитентом или вестинг | Баланс виден, но не переводится | Проверить функции контракта в обозревателе |
Что делать по шагам
- Проверьте сеть. USDT в Ethereum, BNB Smart Chain и Arbitrum — разные контракты в разных сетях. Если в кошельке выбрана одна сеть, а токены лежат в другой, отправка будет вызывать контракт, где у вас ноль.
- Сверьте адрес контракта. Откройте токен в обозревателе и сравните адрес контракта с официальным адресом эмитента. Токены-двойники с тем же названием — частый спам; об этом подробно в статье о поддельном USDT.
- Проверьте decimals. У USDT в Ethereum 6 знаков после запятой, у многих токенов — 18. Если вы отправляете через dApp или скрипт и вводите сумму в базовых единицах, легко ошибиться на порядки. Пересчитать поможет конвертер decimals, а про округление в кошельках — материал о маленьких балансах и decimals.
- Отправьте сумму чуть меньше всего баланса. Если у токена есть комиссия за перевод или кошелёк округлил отображение, «всё» может оказаться больше реального остатка.
- Проверьте, не заблокированы ли токены. Некоторые контракты позволяют эмитенту заморозить адрес, а токены из вестинга или стейкинга видны, но недоступны для перевода.
Чем эта ошибка отличается от нехватки газа
Ошибка transfer amount exceeds balance относится к самому токену. Если же не хватает ETH на комиссию, кошелёк пишет другое — «insufficient funds for gas». Эти случаи легко спутать, потому что оба мешают отправить USDT. Проверьте оба баланса: токена и нативной монеты сети. Если транзакция с ошибкой баланса уже попала в блок, газ за неё не возвращается: сеть выполнила работу, просто результатом стал откат.
Похожий текст встречается и при вызовах transferFrom, когда dApp списывает токены по вашему разрешению: например, при обмене на децентрализованной бирже или пополнении протокола. Тогда ошибка может означать, что вы одобрили сумму, а к моменту исполнения баланса уже меньше — часть токенов ушла другой транзакцией. Проверьте историю адреса в обозревателе: все ли предыдущие переводы прошли так, как вы думаете, и не висит ли в очереди ещё одна операция с тем же токеном. Если видите списания, которых не делали, срочно отзовите разрешения и перенесите остатки на новый кошелёк.
Если токены нужно обменять
Перед обменом убедитесь, что у вас именно тот токен, который принимает сервис. На KOT.CASH при создании заказа, например на странице USDT → ETH, вы выбираете сеть USDT, и адрес депозита выдаётся под официальный контракт этой сети. Токен с другим контрактом заказ не распознает, даже если он называется USDT. Отправляйте сумму, указанную в заказе, одной транзакцией. Обмен идёт без регистрации, комиссия сервиса — 1% на плавающем курсе или 1,5% на фиксированном.
Как не повторить
- Добавляйте токены в кошелёк по адресу контракта из официального источника, а не по названию.
- Не трогайте токены, которые появились «сами по себе»: попытка их продать часто ведёт на фишинговый сайт.
- Перед отправкой через dApp смотрите симуляцию кошелька: она обычно предупреждает о будущем откате.
- Держите отдельный запас нативной монеты на газ.
Частые вопросы
Списывается ли газ, если перевод упал с exceeds balance?
Да, если транзакция попала в блок. Сеть выполнила вызов контракта, и газ за выполнение не возвращается. Кошелёк обычно предупреждает об этом до подписи — не игнорируйте предупреждение.
В кошельке есть USDT, а контракт пишет, что баланса нет. Почему?
Чаще всего выбрана не та сеть или кошелёк показывает токен с другим контрактом. Сверьте сеть и адрес контракта в обозревателе.
Можно ли отправить весь баланс токена до последней единицы?
Обычно да, но у токенов с комиссией за перевод или при округлении в интерфейсе это не срабатывает. Отправьте чуть меньше всей суммы.