Bounds-checked decoding
Malformed or hostile calldata can claim a string length of 2^255 bytes or an offset far beyond the payload. The decoder validates every offset, length and array count against the bytes actually present before reading or allocating, so such input produces a precise diagnostic instead of freezing the tab.
- Offsets that point outside the payload, or back into the head area, are reported with the byte position of the offending word.
- Dirty high bits in uint8–uint248, non-sign-extended intN, non-zero address padding and bool values other than 0 or 1 are reported as errors, matching strict decoders.
- Trailing bytes after the last referenced field are reported rather than silently ignored.
- Integers beyond 2^53 are kept exact from decode through display and export.
Selectors, topics and collisions
A function selector is the first 4 bytes of Keccak-256 of the canonical signature, such as transfer(address,uint256) → 0xa9059cbb. An event topic is the full 32-byte hash, such as Transfer(address,address,uint256) → 0xddf252ad…. Keccak-256 here comes from the audited @noble/hashes library; it is not the same function as FIPS SHA3-256, and the tool shows both so the difference is visible.
Four bytes collide. burn(uint256) and collate_propagate_storage(bytes16) share 0x42966c68. When a selector matches several known signatures, every candidate is shown.
Event logs
Indexed parameters live in topics, the rest in data. An indexed string, bytes, array or struct is stored as a hash, so its original value cannot be recovered from the log; the decoder says so instead of guessing. A topic count that does not match the ABI's indexed flags is reported, since ERC-20 and ERC-721 Transfer events share a signature but not a layout.
Questions
Do I need the contract ABI?
For a full decode, yes. Without one, the calldata view still splits the selector and 32-byte words and looks the selector up in a small bundled signature pack, labelled as a guess.
Which ABI formats are accepted?
Solidity JSON ABI (an array, or an artifact object with an "abi" field) and human-readable lines like "function transfer(address to, uint256 amount)". Tuples and nested arrays are supported; fixed-point types are not.
Can it decode a reverted call?
Yes. Paste revert data to decode Error(string), Panic(uint256) with its documented code meaning, or a custom error from the supplied ABI.
Is my calldata uploaded anywhere?
No. Decoding runs in your browser. Drafts are saved only in this browser's local storage, and you can export or clear them.