The formula
Total cost = Energy consumed × the Energy price, plus transaction bytes × the Bandwidth price, plus an activation fee if the destination address has never existed on-chain. Each term is zero if you hold enough of the corresponding resource.
| Charge | Parameter | Current value |
|---|---|---|
| Energy | getEnergyFee | 100 sun = 0.0001 TRX per unit |
| Bandwidth | getTransactionFee | 1,000 sun = 0.001 TRX per byte |
| Free Bandwidth | getFreeNetLimit | 600 points per day |
| Activating a new account | getCreateNewAccountFeeInSystemContract | 1,000,000 sun = 1 TRX |
These are governance parameters, not constants. The Energy price in particular has been lowered by vote several times. Read them live rather than trusting a table in an article — the next section shows how.
Reading the parameters yourself
Every value above is public. Call getchainparameters on any TRON node and you get the current set back as key-value pairs, in sun.
- Query the wallet/getchainparameters endpoint on a public node.
- Find getEnergyFee in the response. Divide by 1,000,000 to convert sun into TRX per unit of Energy.
- Do the same for getTransactionFee — that is your price per byte of Bandwidth.
- If either has changed since you last checked, every cost estimate downstream of it changed too.
The Energy term
Energy is the dominant charge, and the only one that depends on who you are sending to rather than what you are sending.
- A transfer to an address that already holds USDT consumes roughly 64,285 Energy — about 6.43 TRX at the current price.
- A transfer to an address that has never held USDT consumes roughly 130,285 Energy — about 13 TRX — because the contract must allocate a new storage slot.
- The amount of USDT you send has no effect. Ten dollars and a hundred thousand dollars cost the same.
For an exact figure rather than a rule of thumb, simulate the call. A triggerconstantcontract request against the USDT contract with your real sender and recipient returns energy_used without broadcasting anything. Multiply that by the Energy price and you have the precise cost of that specific transfer.
The Bandwidth term
Bandwidth is charged on the serialised size of the transaction. A TRC-20 transfer runs about 345 bytes, so it needs about 345 Bandwidth.
Every account receives 600 free Bandwidth per day. That covers the first transfer and leaves too little for a second, which is why the daily pattern of failures tends to start on transfer number two. Beyond the allowance you pay 0.001 TRX per byte — about 0.345 TRX for a transfer.
The activation term
A TRON address does not exist on-chain until something is sent to it. Creating it costs 1 TRX, charged to the sender, on top of the Energy and Bandwidth for the transfer itself.
This is a property of the destination address, not of USDT. It applies once per address, ever, and it catches people paying a brand-new wallet for the first time.
Worked totals
| Case | Energy | Bandwidth | Activation | Total |
|---|---|---|---|---|
| Regular recipient, first transfer of the day | ~6.43 TRX | free | — | ~6.43 TRX |
| Regular recipient, later the same day | ~6.43 TRX | ~0.35 TRX | — | ~6.78 TRX |
| First-time USDT recipient | ~13 TRX | free | — | ~13 TRX |
| Brand-new, never activated address | ~13 TRX | free | 1 TRX | ~14 TRX |
| Any of the above, with rented Energy | rental price | free or ~0.35 TRX | as above | well below burning |
The last row is the point of renting: the Energy term is the large one, and it is the only term you can meaningfully reduce.
One number wallets show that is not a fee
Wallets ask you to set a fee_limit before signing a contract call. It is a ceiling on what you are willing to spend, not a charge — you are billed for what execution actually consumes.
Setting it too low causes the transaction to stop mid-execution and fail while still taking what it burned. Setting it generously costs nothing if the call succeeds, which is why a comfortable limit is almost always the right choice.