Ошибки транзакций

Ошибки транзакций TRON: справочник кодов и решений

Ошибки транзакций 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 байт)
Получатель уже держит USDT64 28564 285 × 100 SUN ≈ 6,43 TRX0 из бесплатных 600 или ≈0,35 TRX
Получатель без USDT130 285130 285 × 100 SUN ≈ 13,03 TRX0 или ≈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 типичных причин три:

  1. Токенов меньше, чем в сумме перевода. Например, вы пытаетесь отправить 1000 USDT, а на адресе 999,5. Кошелёк иногда показывает кэшированный баланс, особенно сразу после входящего перевода.
  2. Адрес отправителя заблокирован Tether. У контракта USDT есть чёрный список: Tether добавляет туда адреса по запросам правоохранителей и при подозрении на мошенничество. С такого адреса перевести USDT нельзя, любая попытка закончится REVERT. Это не сбой сети, и комиссии тут ни при чём.
  3. Вы вызываете не тот контракт. Поддельные «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 отправлен, но не пришёл.

Как найти причину ошибки за пять минут?

Порядок действий, который подходит и для частного кошелька, и для бизнеса:

  1. Скопируйте хэш (TXID) из истории кошелька или ответа API.
  2. Откройте его на Tronscan. Нет транзакции — ошибка этапа отправки, баланс цел. Есть — смотрите статус и результат.
  3. Сверьте ресурсы. В карточке видно, сколько энергии и bandwidth израсходовано и сколько TRX сожжено. Если энергии ушло ровно на сумму TRX, которая была на балансе, — это OUT_OF_ENERGY из-за нехватки TRX.
  4. Проверьте отправителя. Активирован ли адрес, сколько на нём TRX, есть ли энергия, не изменены ли права (permissions) в аккаунте.
  5. Проверьте получателя и контракт. Настоящий ли это USDT, тот ли адрес, та ли сеть.
  6. Исправьте причину и только потом повторите. Повтор без изменений даст вторую такую же ошибку и вторую комиссию.

Для команды полезно вести короткий журнал: хэш, код, сколько сгорело, что сделали. Через месяц станет видно, что, скажем, 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 блоков, то есть около минуты. Это не ошибка, нужно немного подождать.