encode method

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

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