Ethereum Calldata: Selectors, Arguments and Meaning
Understand Ethereum transaction input data, four-byte selectors and ABI arguments, including why decoding alone cannot prove a business action.

Overview
When translating these concepts into an integration, keep the scope described by the wallet history api with the result. The examples in wallet transaction history and smart contract event logs show how the same distinction affects neighbouring data questions.
Transaction input data carries bytes supplied to the recipient. Contract calls often start with a function selector followed by ABI-encoded arguments. Those bytes become useful only when decoded with the correct contract and execution context.
Identify the interface first
A four-byte selector usually comes from the beginning of a function signature hash. It is a dispatch hint, not a globally unique function name. Different signatures can collide, and proxy contracts can execute another implementation. Native-currency transfers and contract creation also need different input interpretation from an ordinary contract function call.
Worked example: decoding an intended transfer
A decoded call appears to request transfer(recipient, amount). That describes an input intention. The transaction might revert, the implementation might apply a fee, or another call path might produce a different result. Compare the receipt and relevant state or events before describing an actual delivered amount. Keep requested and observed quantities in separate fields.
Build a cautious decoder
Record recipient contract, block reference, ABI identity and decoder version. Preserve undecoded bytes when no trustworthy interface is available. Test dynamic arguments, empty input, overloaded function names and proxy upgrades. A friendly method label is a convenience for readers; it should never replace the underlying bytes or the evidence of execution.
A practical acceptance test
Decode transfer-shaped calldata in one fixture with a successful receipt and another with a reverted receipt. The requested recipient and quantity can match while the observed outcomes differ. Also supply an unknown selector. Preserve its raw bytes and an undecoded status rather than borrowing a method name from an unrelated contract.
Questions about the topic
Frequently asked questions
Is a selector a unique function identifier?
Not globally; four-byte selector collisions are possible.
Does decoded calldata prove a transfer happened?
No. It describes input, while execution evidence establishes the outcome.
Standards & technical documentation
