A fixed element count can still contain dynamic content.
LET’S PICTURE IT
A two-pocket folder can hold two attachments of changing lengths.
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.
Classify the element type
string[2] has two positions, but strings are dynamic. The fixed array therefore has dynamic ABI classification and receives an outer offset in a parameter tuple.
Omit a dynamic-array count
The number two comes from the fixed array type. Its body is encoded as a two-member tuple and does not begin with a dynamic-array length word.
Use the fixed-array body base
Its two string offsets are relative to the beginning of the fixed-array body. For a and bb, those offsets are 64 and 128.
Compare the nearby types
uint256[2] is static, while string[] is dynamic and includes a count. The square brackets alone do not answer both classification and length-prefix questions.
Trace a local example
types: string[2]
values: [["a","bb"]]
no function selector prefix
word 0 · argument offset 0 bytes
0x0000000000000000000000000000000000000000000000000000000000000020
word 1 · argument offset 32 bytes
0x0000000000000000000000000000000000000000000000000000000000000040
word 2 · argument offset 64 bytes
0x0000000000000000000000000000000000000000000000000000000000000080
word 3 · argument offset 96 bytes
0x0000000000000000000000000000000000000000000000000000000000000001
word 4 · argument offset 128 bytes
0x6100000000000000000000000000000000000000000000000000000000000000
word 5 · argument offset 160 bytes
0x0000000000000000000000000000000000000000000000000000000000000002
word 6 · argument offset 192 bytes
0x6262000000000000000000000000000000000000000000000000000000000000
The outer pointer leads directly to two element offsets.