encode method
Encodes a value of this type.
Implementation
@override
Uint8List encode(dynamic value) {
final values = value is Map ? value.values.toList() : value as List;
if (values.length != components.length) {
throw ArgumentError(
'Expected ${components.length} values, got ${values.length}');
}
// Similar to array encoding
final parts = <Uint8List>[];
if (isDynamic) {
final offsets = <int?>[];
final encodedElements = <Uint8List>[];
// Calculate head size: sum of static sizes for each component
// Dynamic components use 32 bytes for offset pointer
// Static components use their actual static size
var headSize = 0;
for (final component in components) {
if (component.isDynamic) {
headSize += 32; // Offset pointer
} else {
headSize += component.getStaticSize();
}
}
var currentOffset = headSize;
for (var i = 0; i < components.length; i++) {
if (components[i].isDynamic) {
offsets.add(currentOffset);
final encoded = components[i].encode(values[i]);
encodedElements.add(encoded);
currentOffset += encoded.length;
} else {
offsets.add(null);
encodedElements.add(components[i].encode(values[i]));
}
}
for (var i = 0; i < components.length; i++) {
if (offsets[i] != null) {
parts.add(AbiUint(256).encode(offsets[i]));
} else {
parts.add(encodedElements[i]);
}
}
for (var i = 0; i < components.length; i++) {
if (offsets[i] != null) {
parts.add(encodedElements[i]);
}
}
} else {
for (var i = 0; i < components.length; i++) {
parts.add(components[i].encode(values[i]));
}
}
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;
}