In this track: Dynamic ABI and nested layouts
advanced · 5 MIN READ

Malformed offsets and decoding failures

A word that looks like an offset can point outside the supplied data.

LET’S PICTURE IT

A page reference is unusable when its destination page is missing.

SEE IT FOR YOURSELF
Follow a dynamic string from head to tailStep 1 / 4
Follow a dynamic string from head to tailArgument headbyte 0 · offset 32hex word ends in 20String tailstarts at byte 32length + contentPositions are measured from argument byte zero, excluding any selectorOffset destinationargument byte 32read a length wordLength = 5hello is five UTF-8 bytescontent starts at byte 64A length word and an offset word have different jobsContent word · argument byte 6468 65 6c 6c 6f5 payload bytes27 padding bytesBlocks are schematic; their drawn widths do not represent the exact byte ratioHeadoffset: 32argument byte 0Tail lengthlength: 5argument byte 32Tail contenthello + paddingargument byte 6432 + 32 + 32 = 96 bytesWith a four-byte selector, total calldata length is 100 bytes

This example encodes one string parameter with value hello. A dynamic argument uses an offset in its head, even when it is the only argument.

Animated local teaching model. No wallet, RPC or live blockchain data. Some labels and hashes are abbreviated for readability.

Require enough bytes for the head

Before following a dynamic pointer, a decoder needs the words required by the schema. A truncated head cannot provide a complete offset value.

Check the destination and length

The referenced tail must include a readable length word, and the declared payload must fit within the supplied byte region. A huge offset does not create extra data.

Separate rejection reasons

Out-of-bounds data, incorrect alignment and non-canonical gaps are related but distinct concerns. Decoder implementations can differ in how strictly they reject unusual yet in-bounds layouts.

Report failure without inventing values

A failed decode should not be presented as a successful empty string or zero balance. Preserve the error and the schema so the user can inspect the actual mismatch.

Trace a local example

types: string
values: ["safe"]
no function selector prefix

word 0 · argument offset 0 bytes
0x0000000000000000000000000000000000000000000000000000000000000020

word 1 · argument offset 32 bytes
0x0000000000000000000000000000000000000000000000000000000000000004

word 2 · argument offset 64 bytes
0x7361666500000000000000000000000000000000000000000000000000000000

This valid control example provides a baseline before testing truncated or corrupted data.

TURN UNDERSTANDING INTO PRACTICEOpen the ABI encoder →
QUICK CHECK · NO PRESSURE

What should happen when a tail points beyond the data?

Your progress stays in this browser.
Keep exploring the original referenceSolidity documentation ↗

Original explanations by EtherTools. Examples are educational and source-linked; this site is independent of the Ethereum Foundation. Our approach.