encode method
Encodes a value of this type.
Implementation
@override
Uint8List encode(dynamic value) {
final list = value as List;
if (length != null && list.length != length) {
throw ArgumentError('Expected $length elements, got ${list.length}');
}
final parts = <Uint8List>[];
// For dynamic arrays, prepend length
if (length == null) {
parts.add(AbiUint(256).encode(list.length));
}
if (elementType.isDynamic) {
// Dynamic elements: encode offsets then data
// Each offset pointer is 32 bytes, regardless of element size
final offsets = <int>[];
final encodedElements = <Uint8List>[];
var currentOffset =
list.length * 32; // Offset pointers are always 32 bytes
for (final element in list) {
offsets.add(currentOffset);
final encoded = elementType.encode(element);
encodedElements.add(encoded);
currentOffset += encoded.length;
}
for (final offset in offsets) {
parts.add(AbiUint(256).encode(offset));
}
parts.addAll(encodedElements);
} else {
// Static elements: encode directly (each element uses its full static size)
for (final element in list) {
parts.add(elementType.encode(element));
}
}
// Concatenate all parts
final totalLength = parts.fold<int>(0, (sum, p) => sum + p.length);
final result = Uint8List(totalLength);
var offset = 0;
for (final part in parts) {
result.setRange(offset, offset + part.length, part);
offset += part.length;
}
return result;
}