Ошибки транзакций TRON: справочник кодов и решений
Коротко: ошибка транзакции TRON бывает двух видов. Первые транзакцию до блока не допускают (BANDWITH_ERROR, account does not exist, TAPOS_ERROR), и ничего не списывается. Вторые случаются уже внутри блока (OUT_OF_ENERGY, REVERT), и тогда сгорает от долей TRX до 13 TRX и больше. Ниже коды, причины и что делать.
Этот справочник — хаб раздела об ошибках. По самым частым случаям есть подробные разборы: OUT_OF_ENERGY, недостаточно TRX для комиссии и USDT отправлен, но не пришёл. Здесь — общая карта, чтобы по тексту ошибки быстро понять, куда смотреть.
Почему одни ошибки стоят денег, а другие нет?
Путь транзакции в TRON состоит из двух этапов, и от того, где она споткнулась, зависит, потеряете ли вы TRX.
Этап 1 — проверка при отправке (broadcast). Кошелёк подписывает транзакцию и передаёт её узлу. Узел проверяет подпись, существование аккаунта, хватает ли bandwidth или TRX на него, не истёк ли срок, не дубль ли это. Если что-то не так, узел возвращает код ошибки, и транзакция в блок не попадает. В обозревателе её не будет вовсе, а с баланса ничего не спишется.
Этап 2 — исполнение в блоке. Если проверка пройдена, транзакция попадает в блок и исполняется. Для перевода TRX это почти мгновенно. Для USDT TRC20 запускается смарт-контракт в виртуальной машине TVM, и на этом этапе он может упасть: закончилась энергия, контракт сам отказал, превышено время. Такая транзакция видна на Tronscan со статусом ошибки, а всё потраченное на неё уже сгорело.
Отсюда первое правило диагностики: найдите хэш в обозревателе. Нашли со статусом ошибки — это этап 2, деньги на комиссию ушли. Не нашли — этап 1, баланс цел, нужно разобраться с сообщением кошелька.
Какие коды ошибок встречаются чаще всего?
Сводная таблица по ошибкам, с которыми сталкиваются обычные пользователи и бизнес. Коды — в том виде, в каком их возвращает узел и показывает Tronscan.
| Код или сообщение | Этап | Что произошло | Списывается ли TRX | Что делать |
|---|---|---|---|---|
OUT_OF_ENERGY | блок | контракту не хватило энергии и TRX на её покупку | да, весь доступный лимит | добавить энергию или TRX, повторить |
REVERT | блок | контракт отказал сам: нет токенов, адрес заблокирован | да, только израсходованная энергия | проверить баланс токена и адреса |
OUT_OF_TIME | блок | исполнение дольше лимита CPU (по умолчанию 80 мс) | да, весь лимит энергии | для USDT почти не встречается; проверить контракт |
BANDWITH_ERROR | отправка | нет bandwidth и нет TRX, чтобы его сжечь | нет | пополнить TRX или получить bandwidth |
account does not exist | отправка | адрес отправителя не активирован | нет | активировать адрес переводом TRX |
balance is not sufficient | отправка | TRX меньше, чем сумма перевода плюс комиссия | нет | уменьшить сумму или пополнить |
TAPOS_ERROR | отправка | транзакция ссылается на слишком старый блок | нет | собрать и подписать заново |
TRANSACTION_EXPIRATION_ERROR | отправка | истёк срок жизни транзакции | нет | подписать заново и отправить сразу |
DUP_TRANSACTION_ERROR | отправка | такая транзакция уже отправлена | нет | проверить хэш первой отправки |
SIGERROR | отправка | подпись не совпадает с адресом | нет | проверить ключ и права аккаунта |
Подробные описания кодов есть в официальной документации TRON: ошибки смарт-контрактов и ошибки broadcast и RPC. Кошельки часто переводят их на «человеческий» язык, поэтому ниже — что стоит за каждой формулировкой.
Что значит OUT_OF_ENERGY и сколько на нём теряют?
Это самая дорогая ошибка для владельцев USDT. Перевод токена TRC20 — вызов функции transfer контракта USDT, и каждая операция виртуальной машины стоит энергии. На 21.10.2026 перевод на адрес, где уже есть USDT, требует 64 285 энергии, на адрес без USDT — 130 285. Бесплатной энергии у адреса нет, она приходит только от стейкинга TRX или аренды. Как это устроено, разобрано в статье что такое энергия TRON.
Если энергии нет, сеть сжигает TRX по цене энергии — на 21.10.2026 это 100 SUN за единицу. Посчитаем, сколько стоит перевод «в лоб»:
| Сценарий | Энергия | Сжигание TRX за энергию | Bandwidth (≈345 байт) |
|---|---|---|---|
| Получатель уже держит USDT | 64 285 | 64 285 × 100 SUN ≈ 6,43 TRX | 0 из бесплатных 600 или ≈0,35 TRX |
| Получатель без USDT | 130 285 | 130 285 × 100 SUN ≈ 13,03 TRX | 0 или ≈0,35 TRX |
Теперь типичная ситуация. На кошельке 4 TRX и 500 USDT, энергии нет, отправляем 100 USDT на биржу. Сети нужно 6,43 TRX, а есть 4. Виртуальная машина начнёт исполнение, купит энергию на все 4 TRX (это около 40 000 единиц), упрётся в лимит и остановится с OUT_OF_ENERGY. Состояние контракта откатится, USDT останутся у вас, а 4 TRX — сгорят. Многие кошельки предупреждают о нехватке заранее, но не все и не всегда.
Вторая причина OUT_OF_ENERGY — слишком низкий fee_limit, то есть потолок, сколько TRX транзакция может сжечь на энергию. Его выставляет кошелёк или ваш код. Если поставить 5 TRX на перевод, которому нужно 13, результат тот же: всё до лимита сгорит, перевод не пройдёт. Максимальный fee_limit в сети на 21.10.2026 — 15 000 TRX, так что упираются обычно не в потолок сети, а в свой баланс или настройки софта.
Решения три: держать на адресе TRX с запасом, застейкать TRX под энергию или арендовать энергию на время перевода. Пошаговый разбор с примерами из кошельков — в статье OUT_OF_ENERGY в TRON.
Почему контракт отвечает REVERT?
REVERT означает, что контракт сам решил не выполнять операцию: сработала проверка внутри кода. Энергия расходуется только до момента отказа, поэтому потери обычно небольшие, но они есть.
Для USDT TRC20 типичных причин три:
- Токенов меньше, чем в сумме перевода. Например, вы пытаетесь отправить 1000 USDT, а на адресе 999,5. Кошелёк иногда показывает кэшированный баланс, особенно сразу после входящего перевода.
- Адрес отправителя заблокирован Tether. У контракта USDT есть чёрный список: Tether добавляет туда адреса по запросам правоохранителей и при подозрении на мошенничество. С такого адреса перевести USDT нельзя, любая попытка закончится REVERT. Это не сбой сети, и комиссии тут ни при чём.
- Вы вызываете не тот контракт. Поддельные «USDT» с похожим названием — отдельные контракты со своей логикой. Настоящий USDT в TRON только один:
TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t, его адрес опубликован на сайте Tether.
Точную причину отказа видно в результате транзакции: в Tronscan или через API gettransactioninfobyid поле с результатом контракта иногда содержит текстовую причину. Если там пусто, значит, проверка в коде сработала без сообщения.
Что делать, если кошелёк пишет про bandwidth или ресурсы?
BANDWITH_ERROR (именно так, с опечаткой, код записан в протоколе) — узел отклонил транзакцию ещё до блока. Энергия тут ни при чём: речь о bandwidth, ресурсе за размер транзакции в байтах.
Каждый активированный адрес получает 600 единиц бесплатного bandwidth, и они восстанавливаются постепенно в течение 24 часов. Перевод USDT занимает около 345 байт, перевод TRX — меньше 300. Важная деталь из документации: источник bandwidth должен покрыть транзакцию целиком. Если бесплатных осталось 255, а нужно 345, остаток не используется, и сеть сожжёт TRX за все 345 байт: 345 × 1000 SUN = 0,345 TRX по ценам на 21.10.2026.
Ошибка возникает, когда bandwidth не хватает и TRX на балансе меньше, чем нужно сжечь. Сюда же относятся платежи, которые тоже требуют TRX: 1 TRX за активацию нового адреса переводом TRX, 1 TRX за memo, 1 TRX за мультиподпись. Кошельки показывают это по-разному: «недостаточно ресурсов», «insufficient bandwidth», «нужно больше TRX».
Лечится просто: пополнить адрес на 1–2 TRX, подождать восстановления бесплатного лимита или получить bandwidth в аренду. Как устроен этот ресурс и когда его выгодно брать отдельно — в статье bandwidth TRON.
Почему «account does not exist», если адрес есть?
Адрес TRON появляется, как только сгенерирована пара ключей, но сеть узнаёт о нём только после активации. Активирует адрес входящий перевод TRX или токена TRC10 с уже существующего аккаунта, либо вызов createaccount. Входящий USDT адрес не активирует: балансы TRC20 хранятся внутри контракта, а не в аккаунте.
Отсюда частая история. Человек создал кошелёк, получил на него 200 USDT, пытается отправить их дальше и видит account does not exist или «аккаунт не активирован». Подписывать транзакции такой адрес не может: у него нет ни бесплатного bandwidth, ни записи в сети.
Решение — прислать на адрес немного TRX с любого активного кошелька или биржи. Отправитель заплатит 1 TRX за создание аккаунта, плюс 0,1 TRX за bandwidth, если у него нет застейканного. Бесплатные 600 единиц на активацию не тратятся — это прямо сказано в документации по аккаунтам. После активации на адрес можно делегировать энергию, до неё — нельзя.
Что такое TAPOS_ERROR, expired и DUP_TRANSACTION_ERROR?
Эти три кода — про время и уникальность. Обычный пользователь видит их редко, бизнес с собственным софтом — регулярно.
TRANSACTION_EXPIRATION_ERROR. У каждой транзакции есть срок жизни. Если её собирает узел, по умолчанию это 60 секунд после последнего блока; максимум, который допускает сеть, — 24 часа. Ошибка появляется, когда подписанную транзакцию отправили слишком поздно: например, она ждала подтверждения на аппаратном кошельке или в мультиподписи, пока второй участник не проснулся. Исправить её нельзя — только собрать и подписать заново, при этом изменится хэш.
TAPOS_ERROR. Транзакция содержит ссылку на недавний блок (ref_block). Если этот блок слишком старый или оказался в отброшенной ветке, узел её отклонит. Причина почти всегда в софте: транзакцию собрали заранее и хранили, или узел, к которому вы подключены, отстал. Лечение то же: пересобрать на свежем блоке.
DUP_TRANSACTION_ERROR. Такой хэш уже в очереди или в блоке. Это не значит, что перевод прошёл, — только что узел его уже видел. Правильная реакция: проверить первый хэш в обозревателе и не создавать новую транзакцию, пока судьба первой не ясна. Иначе легко отправить деньги дважды.
Деталь для разработчиков из описания транзакций TRON: срок жизни задаётся полем expiration, а ссылка на блок — полями ref_block_bytes и ref_block_hash.
Транзакция успешна, но деньги не пришли — это ошибка?
С точки зрения сети нет: статус SUCCESS значит, что контракт выполнил перевод. Если получатель ничего не видит, причина почти всегда снаружи блокчейна:
- Блок ещё не необратим. Блоки в TRON выходят каждые 3 секунды, необратимым блок считается примерно через 19 блоков, около минуты. Биржи часто ждут дольше и зачисляют депозит по своим правилам.
- Не та сеть. USDT отправлен в TRON, а биржа ждала его в другой сети, или наоборот.
- Не тот адрес. Особенно опасен случай с «отравленным» адресом, который совпадает с нужным только первыми и последними символами.
- Не тот токен. Получателю пришёл фальшивый USDT, а не настоящий, и кошелёк его не показывает.
- Нужен memo или тег. Некоторые сервисы требуют комментарий для зачисления.
Сверяйте получателя, контракт и сеть прямо в карточке транзакции на Tronscan. Подробный разбор каждой ситуации и шаблон обращения в поддержку — в статье USDT отправлен, но не пришёл.
Как найти причину ошибки за пять минут?
Порядок действий, который подходит и для частного кошелька, и для бизнеса:
- Скопируйте хэш (TXID) из истории кошелька или ответа API.
- Откройте его на Tronscan. Нет транзакции — ошибка этапа отправки, баланс цел. Есть — смотрите статус и результат.
- Сверьте ресурсы. В карточке видно, сколько энергии и bandwidth израсходовано и сколько TRX сожжено. Если энергии ушло ровно на сумму TRX, которая была на балансе, — это OUT_OF_ENERGY из-за нехватки TRX.
- Проверьте отправителя. Активирован ли адрес, сколько на нём TRX, есть ли энергия, не изменены ли права (permissions) в аккаунте.
- Проверьте получателя и контракт. Настоящий ли это USDT, тот ли адрес, та ли сеть.
- Исправьте причину и только потом повторите. Повтор без изменений даст вторую такую же ошибку и вторую комиссию.
Для команды полезно вести короткий журнал: хэш, код, сколько сгорело, что сделали. Через месяц станет видно, что, скажем, 80% неудач — это OUT_OF_ENERGY на новых адресах, и проблему решает автоматическая подготовка энергии, а не ручной контроль.
Но дешевле всего ошибку не допустить. Большинство из них предсказуемы, и вот чек-лист перед отправкой USDT:
| Проверка | Зачем | Норма |
|---|---|---|
| Адрес отправителя активирован | иначе account does not exist | есть хотя бы одна входящая TRX-транзакция |
| Энергия на адресе | иначе сгорит TRX или OUT_OF_ENERGY | ≥ 65 000 на адрес с USDT, ≥ 131 000 на новый |
| TRX на балансе | запас на bandwidth и сжигание | хотя бы 1–2 TRX даже при наличии энергии |
| Получатель | защита от подмены | сверить адрес целиком, не только края |
| Контракт USDT | защита от фальшивого токена | TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t |
| fee_limit в софте | иначе OUT_OF_ENERGY при сжигании | не меньше расчётной стоимости с запасом |
Энергия — главный пункт. Если перевод без неё стоит 6–13 TRX, то оплаченная заранее делегированная энергия убирает и сжигание, и риск упасть с OUT_OF_ENERGY. Энергию можно получить на конкретный адрес на 15 минут, час или несколько дней, ключи при этом остаются у вас — подробнее на странице купить энергию. А чтобы понять, сколько энергии ушло бы именно на ваш перевод, начните со статьи энергия TRON.
Параметры сети — цена энергии, цена bandwidth, плата за активацию — меняются голосованием суперпредставителей. Все цифры в этой статье актуальны на 21.10.2026; перед крупными операциями проверяйте их через getchainparameters или калькулятор.
Отправьте следующий перевод с арендованной энергией
Сейчас 65 000 энергии на час — 3,15 TRX. Энергия на ваш адрес за секунды, ключи не нужны.
Частые вопросы
Возвращаются ли TRX, сгоревшие в неудачной транзакции?
Нет. Если транзакция попала в блок со статусом ошибки (OUT_OF_ENERGY, REVERT, OUT_OF_TIME), потраченные энергия, bandwidth и сожжённые TRX не возвращаются. Не списывается ничего, только если узел отклонил транзакцию до блока, например с BANDWITH_ERROR.
Почему перевод USDT упал, хотя TRX на кошельке были?
Скорее всего, их было меньше, чем нужно. На 21.10.2026 перевод USDT без энергии сжигает около 6,4 TRX, а на адрес без USDT — около 13 TRX. Если на балансе, скажем, 5 TRX, сеть сожжёт их и остановит контракт с OUT_OF_ENERGY.
Как узнать точную причину ошибки?
Откройте хэш транзакции на Tronscan: в карточке есть статус и результат контракта. Если транзакции в обозревателе нет, значит, её отклонил узел, и причину нужно искать в сообщении кошелька или в ответе API на broadcast.
Можно ли просто повторить упавшую транзакцию?
Можно, но только после того, как вы устранили причину. Повтор с теми же условиями приведёт к той же ошибке и ещё одному списанию. Для OUT_OF_ENERGY сначала добавьте энергию или TRX, для REVERT — проверьте баланс токена и адрес.
Что значит статус «Unconfirmed» на Tronscan?
Транзакция уже в блоке, но блок ещё не стал необратимым. В TRON блоки идут каждые 3 секунды, необратимость наступает примерно через 19 блоков, то есть около минуты. Это не ошибка, нужно немного подождать.