Concepts · 9 min read
TRC-20 vs ERC-20: one token standard, two chains
TRC-20 is Tron's token standard, and it is a near-exact mirror of Ethereum's ERC-20: the same functions, the same events, and because Tron's TVM is EVM-compatible, the same event-signature hashes down to the byte. A token decoder built for one reads the other unchanged. What separates them is not the token interface but the chain underneath it: the address format, the native token, how fees work, how fast blocks finalize, and how you fetch the data. This page shows both, with real USDT transfers pulled live from each chain.
1. The same interface, two chains
TRC-20 is Tron's fungible-token standard, and it was defined to be fully compatible with ERC-20. A TRC-20 token exposes the same methods, transfer, approve, transferFrom, balanceOf, totalSupply, and emits the same two events, Transfer and Approval. The reason is that Tron's TVM is EVM-compatible: the same Solidity, compiled to the same bytecode model, so a contract written against ERC-20 deploys to Tron and behaves identically.
The one thing the shared interface does not mean is that the tokens are interchangeable. USDT on Tron and USDT on Ethereum are two separate contracts on two separate chains. They represent the same Tether liability but they do not move between chains on their own; that takes a bridge or an exchange. The standard is shared; the assets are not.
2. Identical event, identical topic0
The clearest proof that the standards match is in the data. An EVM log identifies its event by topic0, the keccak-256 hash of the event signature. Here is the first real USDT Transfer from each chain, pulled from the SQD Portal:
- topic0ddf252ad…523b3efddf252ad…523b3ef
- contract0xdac17f…831ec7TR7NHq…jLj6t
- amount224.721247 USDT320.000000 USDT
- decimals66
The topic0 is byte-for-byte identical: ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef on both, the hash of Transfer(address,address,uint256). The Ethereum transfer is in transaction 0x12f2…09c1; the Tron one in 32675254…a750b6. Same event, same structure, same six-decimal amount encoding. Any decoder that matches that topic0 and reads three topics plus a uint256 data field works on both, which is exactly how token transfer indexing stays chain-agnostic.
3. What actually differs: the envelope
Everything that distinguishes a TRC-20 transfer from an ERC-20 one sits around the token, in the chain it runs on:
- Address format0x + 20-byte hexbase58 (T…), 0x41 prefix
- Native tokenETHTRX
- Fee modelgas (gasPrice × gasUsed)energy + bandwidth (staked TRX)
- Block time~12s3s
- Transfer eventTransfer(address,address,uint256)identical
- Log → tx hashtransactionHash on the logjoin the parent transaction
- Portal request typeevmtron
The fee row is the one with real consequences. Ethereum charges gas in ETH that floats with demand. Tron meters execution in energy and bandwidth, obtained by staking TRX, so a transfer can settle with no TRX burned at all. The address and tx-hash rows are what trip up tooling: the same decoder reads the event, but the surrounding plumbing is chain-specific.
4. The same query shape, two datasets
In the SQD Portal the difference reduces to two things: the dataset name and the request type. The filter, by contract address and Transfer topic0, is the same. ERC-20 USDT on Ethereum:
TRC-20 USDT on Tron, the same shape with type tron, the base58 contract as 0x-less hex, and no transactionHash on the log:
Two differences in the request, the dataset and the type, plus the address encoding and the dropped transactionHash. The decode that follows, three topics and a six-decimal amount, is the same code for both. That is the one-query-shape idea applied to a single token standard on two chains.
5. Which USDT should you use?
For a plain transfer, the practical answer comes down to cost, speed, and what the other side accepts. TRC-20 USDT on Tron is usually the cheapest and fastest path: low or zero visible fees and 3-second blocks, which is why it carries more USDT than any other network and dominates payments and remittance flows. ERC-20 USDT on Ethereum costs a variable gas fee and confirms more slowly, but it plugs into the deepest DeFi ecosystem, lending, DEX liquidity, and the broadest set of integrations.
The constraint that overrides preference is the receiving side. An exchange or wallet supports specific networks per asset, and sending USDT on a network the recipient does not credit can lose the funds. Always match the network to where it is going. This is general information, not financial advice.
6. What it means for indexing
Because the event is identical, the expensive part of indexing, decoding logs against an ABI, is written once and reused. Where naive setups break is the assumption that the envelope is identical too: code that expects a 0x address or reads transactionHash straight off a log works on Ethereum and quietly fails on Tron.
Serving both behind one declarative request shape, same filter, same decode, with only the dataset and request type changing, is what lets a stablecoin pipeline follow USDT across Tron and Ethereum as one dataset instead of two integrations. The token standard was designed to be portable; the data layer has to be too.
Go deeper on each side: what is a Tron indexer, USDT on Tron, and what is an EVM indexer. For the multi-standard transfer picture, token transfer indexing.
Frequently asked questions
Is TRC-20 the same as ERC-20?
Can I send USDT from an ERC-20 wallet to a TRC-20 address?
Is TRC-20 or ERC-20 cheaper for USDT transfers?
Why do TRC-20 and ERC-20 transfers have the same event signature?
How do I tell a TRC-20 transfer from an ERC-20 transfer in the data?
Related guides
Indexing tokens across chains?
One Transfer decoder, every chain. Tron and Ethereum are both live on the Portal.