შინაარსზე გადასვლა
operations21 ოქტომბერი, 2026 · 10 min read

How to cut TRON energy costs for USDT transfers: what we measured in production

A TRC-20 USDT transfer cost us 6.43 or 13.03 TRX, depending on the recipient. Measured receipts, the 1 USDT reserve, the fee_limit trap, and burn vs rent vs stake.

Kostiantyn Boiko, Blockchain Engineer

English original

Most articles about TRON fees quote one number for a USDT transfer. We run the TRC-20 deposit and withdrawal flow behind EX5 in production, and when we priced it from on-chain receipts on 16 October 2026 we got two numbers. The gap between them explained most of what we were paying.

This is what we measured, the two settings we changed the same day, and how we would pay for energy at a higher volume.

What we measured

All figures are from 16 October 2026: energy price 100 sun per unit and bandwidth 1,000 sun per byte (from getchainparameters), TRX at $0.3353. Transfer costs come from triggerconstantcontract simulations against our own hot wallet, and the zero-balance case is also confirmed by a real sweep receipt.

What Resource TRX USD
USDT transfer to an address that already holds USDT 64,285 energy 6.43 $2.16
USDT transfer to an address with zero USDT 130,285 energy 13.03 $4.37
First TRX sent to a new address (account activation) 1.1 $0.37
Bandwidth of one USDT transfer 345 bytes 0 within the free 600 bytes a day, else 0.345
Energy from staking 9.59 energy per staked TRX per day

This is the receipt of one of our sweeps, with addresses and hash removed:

"fee": 13028500,
"receipt": {
  "energy_usage_total": 130285,
  "energy_fee": 13028500,
  "net_usage": 345,
  "result": "SUCCESS"
}

13,028,500 sun is 13.03 TRX. Bandwidth came out of the sending address’s free daily allowance, so the whole fee was energy.

One more detail from the simulation: 49,635 of the 64,285 energy is the surcharge TRON’s dynamic energy model adds to heavily used contracts. USDT is the busiest contract on the network, so it carries a large one. The amount you send changes nothing: 1 USDT and 100,000 USDT cost the same energy.

Why the same transfer sometimes costs double

The USDT contract keeps every holder’s balance in a storage slot. Updating a slot that already holds a value is cheap; writing a slot that is zero costs more. So the price of a transfer is decided by the recipient: if the receiving address has never held USDT, or holds exactly zero, the transfer costs 130,285 energy instead of 64,285.

On an exchange this shows up in three places:

  • Withdrawals. The recipient is the customer’s address. New wallets pay the double rate, and you cannot control that, so the withdrawal fee has to absorb it.
  • Sweeps. Moving a deposit from the customer’s deposit address to your hot wallet makes the hot wallet the recipient. If withdrawals have drained the hot wallet to exactly zero USDT, the next sweep pays double. This one you control.
  • Prefunding. A deposit address holds USDT but no TRX, so the hot wallet first sends it TRX to pay for the sweep. On a brand-new address that first TRX also activates the account, which costs 1.1 TRX.

What one first deposit actually cost

Here is a real first deposit of 26 USDT to a new address, before we changed anything:

  1. The hot wallet sent 21.1 TRX to the deposit address: a 20 TRX prefund plus 1.1 TRX that went to activating the account.
  2. The deposit address swept the USDT to the hot wallet. The hot wallet held no USDT at that moment, so the sweep burned 13.03 TRX.
  3. 6.97 TRX stayed on the deposit address as change.

The part we will never see again was 14.13 TRX, or $4.74: 18% of the deposit. Our minimum TRC-20 deposit was 15 USDT, and at that size the same cost is 31.6%.

The same deposit under the four combinations of the two settings we could change:

Setup Hot wallet sends Burned Left on deposit address Burned, USD
fee_limit 20, hot wallet at 0 USDT (before) 21.1 14.13 6.97 $4.74
fee_limit 20, hot wallet holds ≥ 1 USDT 21.1 7.53 13.57 $2.52
fee_limit 15, hot wallet at 0 USDT 16.1 14.13 1.97 $4.74
fee_limit 15, hot wallet holds ≥ 1 USDT (now) 16.1 7.53 8.57 $2.52

A second deposit to the same address skips activation and finds TRX already waiting, so it burns only the energy: 6.43 or 13.03 TRX.

The 1 USDT reserve

The cheapest fix we know of on TRON: never let the hot wallet’s USDT balance reach zero. As long as the slot holds something, every sweep is a 64,285-energy transfer. That saves 6.6 TRX ($2.21) per sweep, and the cost is one USDT you can no longer withdraw.

In our stack it is one setting, withdraw_reserve = 1 on the TRC-20 USDT currency, and the withdrawal job will not take the hot wallet below it. It still wants an alert for the hot wallet’s USDT dropping under 1, in case anything moves funds outside that job. We switched it on on 16 October; the check is that the next sweep receipt reads 64,285, not 130,285.

The rule holds for every address you own that receives USDT: hot wallet, cold wallet, the address you top up a hedging venue from. None of them should ever sit at exactly zero.

The fee_limit trap

fee_limit is the most TRX a transaction may burn. If the energy costs more than that, the transaction fails with OUT_OF_ENERGY, and the energy it consumed up to the limit is still paid for. A failed transfer costs you the full limit and moves nothing.

Ours was 20 TRX, a default nobody had set on purpose. We lowered it to 15. The obvious next question is why not 10, since a normal transfer burns 6.43:

  • The same fee_limit is used for withdrawals, and a withdrawal to a zero-balance address needs 13.03 TRX.
  • At 10 TRX that withdrawal would fail, burn all 10 TRX and land in the queue as errored. You pay without delivering.
  • At 15 TRX the double-rate transfer still goes through at energy prices up to about 115 sun; a normal transfer up to 233 sun.

In our flow the prefund equals the fee_limit, so a lower limit also leaves 5 TRX less change on every new deposit address.

Energy price is a governance parameter. It was 100 sun when we measured and it has changed before. Our rule: set the limit about 15% above the zero-balance transfer at the current price, and recompute it whenever the chain parameter moves.

Burn, rent or stake

There are three ways to pay for energy:

  • Burn. The sending address pays TRX at the network price every time. No setup and no capital, but you pay full price.
  • Rent. A provider delegates energy to your sending address for a period, usually from one hour to a few days. The quotes we collected for 65,000 energy for one hour were 1.9 to 3 TRX, or 29 to 46 sun per unit. We have not run rental in production yet, so these are quotes, not receipts.
  • Stake. You lock TRX and receive energy every day: 9.59 energy per staked TRX per day when we measured, a figure that falls as more TRX is staked across the network. Unstaking takes 14 days.
Way to pay Per 64,285-energy transfer Capital Main risk
Burn 6.43 TRX ($2.16) none price set by governance
Rent (quotes) 1.9–3 TRX a prepaid balance with the provider the provider fails or reprices
Stake 0 TRX burned 6,703 TRX for one transfer a day TRX price, 14 days to unstake

Staking looks free until you size it. Covering one zero-balance sweep a day takes 13,586 TRX, about $4,555 locked; a normal transfer takes 6,703 TRX.

Our view: under about 20 TRC-20 transfers a month, burn, keep the reserve and set the limit correctly. Rental would save something like $25–35 a month at that volume, which does not pay for building and watching the integration. Above that, rent, with burning as the automatic fallback when a provider does not deliver (that is what a correct fee_limit is for). Stake only TRX you would hold anyway, and size it for your baseline daily volume, renting for the peaks.

A worked example: 10,000 transfers a month

Take an exchange with 5,000 swept deposits and 5,000 withdrawals a month. Our assumptions, which you should replace with your own:

  • 30% of withdrawals go to addresses that have never held USDT. We have not measured this share; it depends on your market.
  • 1,000 of the deposits arrive on new addresses and need activation.
  • Energy at 100 sun, TRX at $0.3353.
  • Withdrawals are sent from the hot wallet, whose free 600 bytes a day covers one transfer, so their bandwidth is burned. Sweeps go out from deposit addresses within their own free allowance.
TRX per month Hot wallet keeps hitting zero 1 USDT reserve, burn Reserve, rented energy
Energy for 5,000 sweeps 65,143 32,143 9,395–14,835
Energy for 5,000 withdrawals 42,042 42,042 12,289–19,404
Activating 1,000 new addresses 1,100 1,100 1,100
Withdrawal bandwidth 1,725 1,725 1,725
Total 110,010 77,010 24,510–37,064
In USD ≈ $36,900 ≈ $25,800 ≈ $8,200–12,400

The first column is the worst case, where every sweep pays double. Real hot wallets hit zero only some of the time, so your number sits between the first two columns. The reserve is a configuration change; rental is a few weeks of integration work. Together they take two thirds or more off the worst case. We left out the bandwidth of the TRX prefund transfers themselves, which adds a little.

Paying the same 742 million energy a month by staking would need about 2.6 million TRX locked, roughly $865,000 at the prices above. At this size most operators rent.

The withdrawal fee follows from the same numbers. Our TRC-20 USDT withdrawal fee was 2.22 USDT. Against the measured cost it earns $0.06 when the recipient already holds USDT and loses $2.15 when it does not. At a 70/30 mix the average withdrawal costs $2.82, so a flat 2.22 loses money on average. At 3 USDT the fresh-address case still loses $1.37, but the average turns positive.

Ethereum was the cheap network that week

We expected TRON to be the low-cost USDT network. That week it was not. At the 0.5 gwei floor our Ethereum signer uses (the base fee was 0.09 gwei that day), a 65,000-gas USDT transfer cost about $0.08. An ERC-20 withdrawal fee of 2.04 USDT stays profitable until gas passes roughly 12.7 gwei.

Gas does spike, so this can flip within hours. Our answer is to support both networks and watch Ethereum gas, with an alert above 10 gwei, rather than steer customers to one of them for good.

The TRX left on deposit addresses

Every prefund leaves change behind: the fee_limit minus the burn and, the first time, the activation. With a 15 TRX limit and the reserve in place, that is 8.57 TRX after a first deposit. The more you cut the burn, the more change you leave behind.

The TRX is not lost. Moving it back costs nothing, because a TRX transfer of about 300 bytes fits inside the address’s free 600 bytes a day. It does pile up across thousands of addresses, so the plan is to collect it in batches once the total is worth a run, with the same dry run, approval, single send and receipt check we use for any treasury movement.

Two ideas we did not take

  • Lazy collection, which means crediting deposits but sweeping only when the hot wallet needs funds. It sounds like a saving, but energy is charged per transfer and activation per address, so each address costs the same whenever you sweep it. It saves only when the same customer deposits several times before a sweep, and it postpones the cost rather than removing it.
  • Paying withdrawals straight from deposit addresses. That would turn two transfers into one for customers who deposit and withdraw the same funds. It also means changing how money moves through the system and signing from thousands of addresses, which we are not willing to do for 6 to 13 TRX.

What we changed, and what comes next

Changed on 16 October:

  1. A permanent 1 USDT reserve in the hot wallet. Free, and it halves sweep energy.
  2. fee_limit from 20 to 15 TRX, not 10, because withdrawals to fresh addresses share the setting.

Next:

  1. Alerts on the things that move these numbers: the hot wallet’s USDT reserve, the energy price parameter, Ethereum gas above 10 gwei.
  2. A minimum deposit and a withdrawal fee that match the real cost. With the reserve in place, the first-deposit burn is 8.4% of a 30 USDT deposit and 5.0% of a 50 USDT one.
  3. Energy rental with burning as the fallback, once volume passes the point where it pays.

The deposit, sweep and withdrawal flow described here is part of the Custody and Payments products, and the same TRC-20 handling runs behind the Wallet. For the wider cost picture of running an exchange, see what crypto exchange software costs.

If you send us your monthly deposit and withdrawal counts, we will run this table for your volume and network mix. Contact sales.

დაჯავშნეთ 30-წუთიანი შეფასების ზარი

Crypto exchange, payments, wallet, custody and token launch software, already running in production. Run it on your own servers, license the source code, or let us host it under your brand.