Failed TRON Transaction: REVERT, Burned TRX and What You Get Back
A REVERT status means the contract rejected the call itself: your USDT stay put, and only energy up to the rollback point plus bandwidth are charged. Causes, Tronscan and next steps.
Short answer: a REVERT status means the smart contract itself rejected your call — a check inside its code failed, and the network rolled back every change. The amount you tried to send or swap is still at your address. What you lose is only what the network consumed before the rollback point: energy (or TRX burned in its place) and bandwidth for the transaction itself. Retrying makes no sense until the cause is fixed — a second REVERT will charge resources again.
What REVERT means on TRON
REVERT is one of the standard contract execution result codes in the TRON protocol. It is listed in Tron.proto in the java-tron repository (the contractResult enum) next to SUCCESS, OUT_OF_ENERGY and other outcomes. It appears when contract code reaches a revert instruction: a condition such as “the balance is sufficient,” “the address is not blocked” or “the price is within tolerance” turned out false, and the contract deliberately stopped execution.
A TRON transaction is atomic: it either executes in full or all of its changes are undone. So there is no such thing as a “partial” REVERT — the recipient got nothing, and your token balance did not change. The transaction still made it into a block, though: you can see it in the explorer, it has a TXID and a FAILED status.
REVERT vs OUT_OF_ENERGY: what's the difference
Both errors show FAILED, but the causes and the cost differ. OUT_OF_ENERGY means the contract ran out of resources before finishing; we cover it in the FAILED — OUT_OF_ENERGY guide. REVERT means there were enough resources, but the contract itself said no. The difference matters for your wallet: according to TRON documentation on fee_limit, normal execution and REVERT settle the energy actually used, while exceptional failures such as OUT_OF_TIME or an illegal instruction may charge the maximum energy allowed for the transaction.
- REVERT: the contract rejected the call based on its own check. You pay for the energy used up to the rollback point.
- OUT_OF_ENERGY: energy plus TRX within fee_limit were not enough to finish. The fix is more resources, not different parameters.
- Other exceptions (timeout, illegal instruction): may charge the transaction's entire energy limit.
- SUCCESS: the transfer went through. If the funds “haven't arrived,” the issue is on the recipient's or the exchange's side, not the network.
What gets burned and what stays
- The transfer or swap amount stays at your address. Balance changes are rolled back in full.
- Energy consumed before the rollback point is not returned. The documentation states plainly that consumed energy is never refunded, even if the transaction later reverts.
- TRX burned in place of energy is not returned either. If your address had no energy, the network covered the cost by burning TRX within fee_limit.
- Bandwidth is charged. The transaction landed in a block, and its bytes are always paid for: from the 600 free units per day or by burning TRX once those run out.
- Rented energy: the consumed part is gone, the remainder is available until the rental period ends.
The good news is that a REVERT usually costs less than a full transfer: contracts often reject on the very first checks, before writing any balances. The bad news is that a series of retries hitting the same error charges resources every single time.
Common causes of REVERT for USDT users
1. Amount exceeds the token balance
Wallets usually won't let you send more than you have. But when sending via an API, a script or a third-party interface, you can request a transfer above your balance — the contract checks the balance and rejects it. Keep in mind that USDT TRC-20 has six decimals: 1 USDT in a contract call is written as 1,000,000 base units. A wrong multiplier is a classic cause of rejections in homegrown integrations. Token parameters, including decimals, are shown on the USDT contract page on Tronscan.
2. The sender address is frozen by the issuer
The USDT contract allows the issuer to block addresses. A transfer from a blocked address will not go through, no matter how much energy it has. How to check an address before a transaction and what to do with risky incoming funds is covered in our guide to checking USDT for AML and freeze risk.
3. No approval to spend
Services, bots and payment gateways often pull tokens via transferFrom — which requires the owner to have granted an allowance for the required amount in advance. If the allowance is smaller than the transaction amount or was never granted, the contract rejects the call.
4. DEX swaps: slippage and expired deadlines
When swapping on a decentralized exchange, you set a minimum amount to receive and a deadline. If the pool price moved beyond your tolerance or the deadline passed while the transaction was waiting to be included in a block, the pool contract rolls back the swap. For swaps, this is the most common cause of REVERT.
5. Wrong call parameters
The wrong contract address, mixed-up arguments, calling a function the contract doesn't support — any of these can end in a rollback. It's a typical situation for people just starting to work with TRC-20 in code.
How to read the cause on Tronscan
Open Tronscan and paste the TXID into the search bar. A full walkthrough of the interface is in our Tronscan guide; for this error, four fields are enough:
- Status and result: FAILED and REVERT. If the result is different, see the matching section above.
- Revert message: if the contract returned a reason string, the explorer may show it next to the result. This is the most useful hint you'll get.
- Resources: how much energy and bandwidth were charged and how much TRX was burned — your actual loss.
- Called method and parameters: transfer, transferFrom or a swap function, the recipient address and the amount. Mistakes in amount and address show up here.
What to do after a REVERT
- Don't hit “send” again right away. Without fixing the cause, a retry produces the same rejection and charges resources again.
- Compare your token balance with the transaction amount, including the six decimals of USDT.
- For transactions through a service, check the allowance (approve) you granted and grant it for the required amount if needed.
- For a swap, refresh the quote, carefully raise the slippage tolerance if necessary, and resubmit.
- If you suspect the address is blocked, check it before any new attempts: energy won't help here.
- Before retrying, make sure the address has energy for the transaction so you don't burn TRX.
If you send transfers from code, simulate the call before broadcasting. The triggerconstantcontract method executes the contract without publishing a transaction and returns an energy estimate and the result — including a rejection if one would happen. That way you catch a REVERT for free, before the network charges any resources.
How to stop losing TRX on failed transactions
You can't rule out rejections entirely: a pool price or an address status can change in the seconds a transaction waits for a block (a TRON block is 3 seconds). But you can keep the cost of a rejection to a minimum.
- Check balance, allowances and the address before sending, not after.
- In integrations, simulate the call before broadcasting and set fee_limit with headroom over the estimate, without inflating it many times over.
- Keep energy on the address for planned transactions: then both a successful transfer and a rejection are paid with resources rather than burned TRX. Without energy, a regular USDT transfer burns about 6.5 TRX, or about 13 to an empty address.
- For a batch of transfers, rent the volume for the whole batch at once: a regular USDT transfer to an address that already holds USDT uses about 64,500–65,000 energy, and roughly twice as much (~131,000) to an empty address.
If your retry runs into resources rather than the contract, you need a different article — the one about OUT_OF_ENERGY. If the status is SUCCESS but the recipient doesn't see the funds, go through the “USDT sent but not received” checklist.

Once the cause is fixed, handle resources ahead of time: you can rent energy for a transfer in the @overtronbot bot or on the website — energy is delegated to your address on-chain, no private keys required. Service health is shown on the status page.
Read also
Are my USDT gone after a REVERT?
No. REVERT rolls back all balance changes, so the transfer amount is still at your address. You only lose the resources consumed before the rollback.
Will I get back the TRX burned on a failed transaction?
No. Energy and TRX consumed during execution are never refunded, even if the transaction later reverts. That is a protocol rule, not a wallet policy.
Why is a REVERT usually cheaper than OUT_OF_ENERGY?
With REVERT, you pay for the energy actually used up to the point of rejection. Exceptional failures such as a timeout may charge the transaction's entire energy limit.
Can I just send the transfer again?
Only after fixing the cause. A retry with the same parameters hits the same contract check and charges resources again.
Will renting energy prevent a REVERT?
No — REVERT is a contract rejection, not a resource shortage. But with rented energy, a failed attempt is paid with resources instead of burned TRX.
Where can I see why it was rejected?
On Tronscan by TXID: FAILED status, REVERT result and, if the contract returned a reason string, the revert message. The called method and parameters are shown there too.
Why did my DEX swap end in REVERT?
Most often the pool price moved beyond your slippage tolerance or the deadline expired. Refresh the quote and resubmit the swap.
How can a developer catch a REVERT before sending?
Simulate the call with triggerconstantcontract: it executes the contract without broadcasting and returns an energy estimate and the result, including a rejection.


