abiEncode method

  1. @override
EncoderResult abiEncode(
  1. AbiParameter params,
  2. List input
)
override

Encodes a array of arbitrary types to ABI-encoded bytes.

Implementation

@override
EncoderResult abiEncode(AbiParameter params, List<dynamic> input) {
  final param = ABIUtils._toArrayType(params);
  final encodedParams = input.map((e) => param.$1.abiEncode(e)).toList();
  final dynamicItems =
      encodedParams.isNotEmpty && encodedParams.first.isDynamic;
  final bool isDynamic = param.$2 == -1;
  if (!isDynamic && input.length != param.$2) {
    throw const SolidityAbiException('Invalid argument length detected.');
  }
  if (isDynamic || dynamicItems) {
    final encode = ABIUtils._encodeDynamicParams(encodedParams);
    if (isDynamic) {
      final length =
          const NumbersCoder()
              .abiEncode(
                AbiParameter.uint256,
                BigInt.from(encodedParams.length),
              )
              .encoded;
      return EncoderResult(
        isDynamic: true,
        encoded: encodedParams.isEmpty ? length : [...length, ...encode],
        name: params.name,
      );
    }
    return EncoderResult(isDynamic: true, encoded: encode, name: params.name);
  }
  final resultBytes = encodedParams.map((e) => e.encoded);
  return EncoderResult(
    isDynamic: false,
    encoded: [for (final i in resultBytes) ...i],
    name: params.name,
  );
}