Confirmation semantics

Distinguish broadcast acceptance, transaction inclusion, execution receipts, solidified blocks, and indexer delay so intermediate states are not treated as final results.

TRON APIs return different data at different stages. Before using a response as a final result, decide whether it represents broadcast acceptance, the transaction body, an execution receipt, solidified state, or indexed service data. Do not treat an intermediate state as final.

📘

Prerequisites


State semantics quick reference

Result you seeWhat it meansWhat it does not meanNext step
BroadcastTransaction returns result: trueThe broadcast node accepted the transaction and tries to place it in the local mempoolThe transaction is not necessarily included, executed successfully, or solidifiedContinue querying the transaction body or receipt
GetTransactionById returns a transaction objectThe node can find the transaction body, including raw_data, signatures, and contract parametersIt does not prove contract execution succeeded and does not include fees, Events, or internal transactionsQuery GetTransactionInfoById
GetTransactionInfoById returns a receiptThe transaction has been executed and produced fees, Energy usage, Events, internal transactions, and other execution resultsThe FullNode version does not necessarily mean the result is solidifiedQuery the SolidityNode version when final state is required
SolidityNode returns a transaction or blockThe data comes from a solidified blockIt is not a complete historical indexUse it as the basis for final confirmation or reconciliation
TronGrid returns historical transactions or EventsThe index service has processed the corresponding dataIt is not the same as native node state and can be affected by pagination, rate limits, and index delayRe-check critical state with a node or self-hosted indexer

Broadcast acceptance is not execution success

The broadcast API only checks whether the node can accept the transaction. It does not tell you whether the contract executed successfully or whether the transaction has entered a solidified block.

A common mistake is treating this response as final success:

{ "result": true, "txid": "..." }

The correct flow is to continue querying the receipt:

  1. Use GetTransactionById to query the transaction body and confirm that the node can find the transaction.
  2. Use GetTransactionInfoById to query the execution receipt.
  3. When final state is required, use GetTransactionInfoById, SolidityNode to query the solidified receipt.

Transaction body is not execution receipt

The transaction body describes what the requester submitted. The execution receipt describes what actually happened during on-chain execution.

Data typeRecommended APIContains
Transaction bodyGetTransactionByIdraw_data, signatures, and contract-call parameters
Execution receiptGetTransactionInfoByIdFees, Energy usage, contract execution status, Events, and internal transactions
Solidified execution receiptGetTransactionInfoById, SolidityNodeExecution receipt from a solidified block

For plain TRX / TRC-10 top-level transfers, the transaction body usually contains the recipient and amount. For TriggerSmartContract, read the receipt to determine the actual execution result.


Latest head is not solidified state

FullNode returns the latest head seen by the node. This state has low latency but may not be solidified. SolidityNode returns state at the latest solidified block and usually lags the latest head by about 1 minute.

Read targetRecommended API
Latest block displayGetNowBlock, FullNode
Latest solidified blockGetNowBlock, SolidityNode
Query latest-head view by block numberGetBlockByNum, FullNode
Confirm whether a block number is solidifiedGetBlockByNum, SolidityNode

If a flow requires final state, such as transaction confirmation, balance reconciliation, report generation, or block monitoring, base the decision on SolidityNode or a local solidified-block index.


Indexed data is not native node state

TronGrid V1 API and self-hosted indexers are useful for account history, TRC-20 transfer history, Events, internal transactions, and aggregate statistics. Index services are usually more convenient than scanning blocks directly, but pagination, rate limits, retries, and index delay still matter.

When complete state judgment is required, combine them as follows:

  1. Use TronGrid or a self-hosted indexer to discover candidate transactions, Events, or internal transactions.
  2. Use SolidityNode receipts or solidified block scanning to confirm final state.
  3. Store processed block numbers, transaction IDs, and log indexes locally so retries remain idempotent.

Related resources