Data access · 10 min read

USDT on Tron: querying the largest stablecoin rail

More USDT circulates on Tron than on any other chain, which makes TRC-20 USDT transfers one of the highest-volume datasets in crypto. They are also one of the simplest to pull: a transfer is a standard event log, so a single declarative request to the Portal returns them, with no Tron node and no indexer to run. This guide pulls real transfers from block 84,000,000, reads one end to end, and follows it down to the energy and bandwidth that let it settle without burning any TRX. The scope is transfers, the movement of value, not reconstructed balances.

Updated 2026-06-30 · By the SQD team

1. The largest USDT rail

Tether publishes the breakdown of USDT in circulation by network, and Tron carries more of it than any other chain, ahead of Ethereum (the live figures are on Tether's transparency page). For payments and remittance flows in particular, Tron is the default USDT rail, on low fees and 3-second blocks. That makes its transfer stream a primary dataset for anyone doing stablecoin analytics, payments reconciliation, or compliance monitoring.

One boundary up front, because it shapes everything below. This data is about transfers: which address sent USDT to which, and how much, per transaction. It is not an address balance. A balance is the running sum of every transfer in and out of an address across all history, a reconstruction you build on top of the transfer stream, not a value you read from one call. What follows traces movement, which is what most stablecoin monitoring actually needs. The cross-chain version of this is in stablecoin data.

2. TRC-20 USDT in one declarative query

Because USDT is a TRC-20 token and the TVM is EVM-compatible, a USDT transfer is an event log with the standard Transfer(address,address,uint256) signature. The request filters by two things: the USDT contract address (as 20-byte hex, no 0x prefix) and the Transfer topic0. This is the actual request, as a runnable curl:

your terminal
curl -s -X POST https://portal.sqd.dev/datasets/tron-mainnet/stream \
-H 'content-type: application/json' \
-d '{
"type": "tron", "fromBlock": 84000000, "toBlock": 84000001,
"logs": [{
"address": ["a614f803b6fd780986a42c78ec9c7f77e6ded13c"],
"topic0": ["ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"]
}],
"fields": {
"block": { "number": true, "timestamp": true },
"log": { "address": true, "topics": true, "data": true, "transactionIndex": true, "logIndex": true }
}
}'

The contract a614f8…ded13c is USDT (TR7N…Lj6t in base58). Across these two blocks the stream returns 102 transfer logs. The response is newline-delimited JSON, one block per line, with the matching logs attached; the Portal serves it keyless over HTTP, so the same curl runs from a terminal, a serverless function, or an agent tool call.

3. Reading a real transfer

The first log returned, verbatim from the stream:

live response · portal.sqd.dev
{ "transactionIndex": 12, "logIndex": 0,
"address": "a614f803b6fd780986a42c78ec9c7f77e6ded13c",
"topics": [
"ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
"000000000000000000000000d95174a0903d3cc16a9b41e9668cf60d01af64f8",
"0000000000000000000000005bdb8b4c4a3d0a93df56b88f8e2158cbe788fb39"
],
"data": "000000000000000000000000000000000000000000000000000000001312d000" }

Three topics and a data blob decode into a complete transfer. topics[0] is the Transfer signature. topics[1] and topics[2] are the indexed sender and recipient, each a 20-byte address left-padded to 32 bytes (take the last 40 hex characters). data is the amount as a uint256, and USDT uses 6 decimals, so 0x1312d000 = 320,000,000 = 320 USDT:

One TRC-20 USDT transfer, decoded
To · 320 USDT
The first USDT transfer in block 84,000,000, from the stream above. The 20-byte topics base58-encode (with the 0x41 prefix) to the T... addresses; the amount is the data field read as a uint256 at 6 decimals. Its transaction is 32675254…a750b6.

4. One contract, most of the block

USDT's share of Tron activity is easy to see if you drop the address filter and pull every event log in the block. In block 84,000,000, 65 of the 69 TVM logs came from the USDT contract alone:

ContractLogs
  • USDT (TR7NHq…jLj6t)65
  • all other contracts4
  • total69
Event logs in block 84,000,000 by contract (verified live)

That concentration is why a USDT-filtered query is so cheap to run and so useful: one contract accounts for the overwhelming majority of the chain's event traffic, and the Portal lets you address it by contract and topic without scanning everything else. Pin a wider window and the same shape gives you the full firehose, ordered, decodable, and ready to stream into a database with the Pipes SDK.

5. Why the transfer burned no TRX

The transfer above is more interesting one level down, on its transaction. Tron meters execution in two resources rather than gas: bandwidth (transaction size) and energy (contract execution), both obtained by staking TRX and both delegatable between accounts. Joining the parent transaction returns its resource usage:

live response · portal.sqd.dev
{ "transactionIndex": 12,
"hash": "326752540f295d8bbe2c5197c1cd80f73f428a6088f22f14399e683499a750b6",
"type": "TriggerSmartContract", "result": "SUCCESS",
"energyUsageTotal": "64285", "netUsage": "345",
"fee": null, "energyFee": null, "netFee": null }

The transfer consumed 64,285 energy and 345 bandwidth, yet every fee field is null. The resources were covered by the account's staked and delegated balance, so no TRX was burned. This is not an edge case: in the same block, 114 transactions were accounts delegating and reclaiming resources to keep exactly this working. It is the mechanism behind the everyday observation that USDT transfers on Tron are effectively free, and it is visible in the data on every transaction, not inferred. An indexer modeled only on gas has no column for any of it; energy and bandwidth are Tron-native fields.

6. Joining the log to its transaction

One Tron-specific detail makes that join necessary rather than optional: a Tron log has no transactionHash field. The valid log fields are transactionIndex, logIndex, address, data, and topics, and nothing else. To attach a transfer to its transaction hash and its resource usage, you ask the Portal to join the parent transaction:

add to the logs filter and fields
"logs": [{
"address": ["a614f803b6fd780986a42c78ec9c7f77e6ded13c"],
"topic0": ["ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"],
"transaction": true
}],
"fields": {
"log": { "address": true, "topics": true, "data": true },
"transaction": { "hash": true, "type": true, "energyUsageTotal": true, "netUsage": true }
}

Setting "transaction": true on the log filter pulls in the parent transaction; the fields.transaction selection then chooses what comes back with it. This is the same join pattern EVM traces use to recover their transaction hash, and it is the one piece of Tron plumbing that does not look like Ethereum.

7. Why this is harder elsewhere

The naive way to get USDT-on-Tron transfers is to run a Tron full node, follow the TRC-20 contract, and decode its logs yourself, which means operating the node, handling the base58 and resource quirks, and writing the join from log to transaction. A general node gateway gives you the raw calls but not a filtered, decodable range over HTTP.

The harder thing is serving Tron's transfers in the same declarative request shape as Ethereum's, so a USDT flow that touches both chains is one query model, not two. That is what lets a payments or compliance pipeline follow stablecoin value across Tron and Ethereum without re-learning the data layer at each hop.

For the protocol detail behind the transfer, see what is a Tron indexer and TRC-20 vs ERC-20. For cross-chain stablecoin flows and peg health, stablecoin data.

Frequently asked questions

How do I get USDT transfers on Tron without running a node?
USDT on Tron is a TRC-20 token, so each transfer is an event log with the standard Transfer signature. You send one declarative request to the SQD Portal (dataset tron-mainnet, request type tron) filtering by the USDT contract address and the Transfer topic0, and the stream returns every matching transfer in your block range as newline-delimited JSON. No Tron full node and no indexer to run.
What is the USDT contract address on Tron?
USDT on Tron is at TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t in Tron's base58 format. On the wire, the Portal returns and filters addresses as 20-byte hex without a 0x prefix, so the same contract is a614f803b6fd780986a42c78ec9c7f77e6ded13c in a query. USDT on Tron uses 6 decimals, so a raw amount of 320000000 is 320 USDT.
Why do USDT transfers on Tron often show no fee?
Tron meters execution in energy and bandwidth rather than gas. Accounts obtain those resources by staking TRX, and resources can be delegated between accounts. When a transfer's energy and bandwidth are covered by staked or delegated resources, no TRX is burned, so the transaction's fee fields come back null even though it consumed tens of thousands of energy units. The data shows the resource usage on the transaction directly.
Can I get an address's USDT balance from this data?
Not directly, and the distinction is worth stating. The Portal serves transfer events: who sent USDT to whom, and how much, per transaction. A current balance is a reconstruction, the running sum of every transfer in and out of an address across all history, which you build on top of the transfer stream rather than read from a single call. This guide stays on transfers, the movement, which is what most monitoring and accounting needs.
How do I link a USDT transfer log to its transaction hash on Tron?
A Tron log does not carry a transactionHash field. To attach a transfer to its transaction, set "transaction": true on the log filter and request fields.transaction.hash; the Portal joins the parent transaction and returns its hash alongside the log. The same join also gives you the transaction's type, result, and energy and bandwidth usage.

Building stablecoin or payments tooling?

See how transfer data feeds analytics and payments on the stablecoins and wallets and payments pages.