encode method

  1. @override
Uint8List encode(
  1. dynamic value
)
override

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;
}