Dynamic Length Inputs
How variable length arguments are encoded in calldata
// Example: dynamic length data type sandwiched between two fixed length data types
function threeArgs(
uint256 a,
uint256[] calldata b,
uint256 c
) external {}
calldata for input values of
5, [1,2,3], 7
0xc6f922d0
0000000000000000000000000000000000000000000000000000000000000005 // first input argument
0000000000000000000000000000000000000000000000000000000000000060 // 60 - pointer to location of dynamic array data
0000000000000000000000000000000000000000000000000000000000000007 // third input argument
0000000000000000000000000000000000000000000000000000000000000003 // length of array data to look at
0000000000000000000000000000000000000000000000000000000000000001 // array values
0000000000000000000000000000000000000000000000000000000000000002 // .....
0000000000000000000000000000000000000000000000000000000000000003 // .....
Using a struct instead of an array will encode the variables directly into memory in order, since it knows in advance how big the struct is
0x01e58fb4
0000000000000000000000000000000000000000000000000000000000000005
0000000000000000000000000000000000000000000000000000000000000001
0000000000000000000000000000000000000000000000000000000000000002
0000000000000000000000000000000000000000000000000000000000000003
0000000000000000000000000000000000000000000000000000000000000007
Last updated