Draw a separate origin for every nested dynamic tuple.
LET’S PICTURE IT
A building has a street address, while a room map measures from the entrance of its own floor.
SEE IT FOR YOURSELF
Follow a dynamic string from head to tailStep 1 / 4
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.
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.At argument byte 32, the string tail begins with length five. This counts the UTF-8 payload bytes and excludes all padding.At argument byte 64, read 68 65 6c 6c 6f for hello. Twenty-seven following zero bytes fill the final content word.The encoding uses ninety-six argument bytes: one offset word, one length word and one padded content word. A normal function call adds a four-byte selector before these bytes.
Animated local teaching model. No wallet, RPC or live blockchain data. Some labels and hashes are abbreviated for readability.
Label the outer structure
The top-level tuple parameter in this example contains a boolean and another tuple. The inner tuple contains an integer and a string, making both tuple layers dynamic.
Resolve one pointer at a time
The first word locates the outer body. Within that body, its second head word locates the inner tuple relative to the outer body start.
Change the origin inside
Inside the inner tuple, the string offset is measured from the inner tuple body. Reusing the outer base would point to the wrong length or value word.
Keep a small trace table
For each pointer, write its word location, numeric offset, chosen base and resulting destination. This makes a wrong origin visible before attempting to read the final text.
Trace a local example
types: (bool,(uint256,string))
values: [[true,["7","hi"]]]
no function selector prefix
word 0 · argument offset 0 bytes
0x0000000000000000000000000000000000000000000000000000000000000020
word 1 · argument offset 32 bytes
0x0000000000000000000000000000000000000000000000000000000000000001
word 2 · argument offset 64 bytes
0x0000000000000000000000000000000000000000000000000000000000000040
word 3 · argument offset 96 bytes
0x0000000000000000000000000000000000000000000000000000000000000007
word 4 · argument offset 128 bytes
0x0000000000000000000000000000000000000000000000000000000000000040
word 5 · argument offset 160 bytes
0x0000000000000000000000000000000000000000000000000000000000000002
word 6 · argument offset 192 bytes
0x6869000000000000000000000000000000000000000000000000000000000000
Trace the outer tuple, inner tuple, then string tail separately.