decode method

  1. @override
DecoderResult<List> decode(
  1. AbiParameter params,
  2. List<int> bytes
)
override

Decodes a tuple of dynamic values from the given ABI-encoded bytes.

Implementation

@override
DecoderResult<List<dynamic>> decode(AbiParameter params, List<int> bytes) {
  int consumed = 0;

  if (params.components.isEmpty) {
    return DecoderResult(result: [], consumed: consumed, name: params.name);
  }
  int dynamicConsumed = 0;
  final List<dynamic> result = [];
  for (int index = 0; index < params.components.length; index++) {
    final AbiParameter childParam = params.components[index];
    DecoderResult<dynamic> decodedResult;

    if (childParam.isDynamic) {
      final DecoderResult<BigInt> offsetResult = const NumbersCoder().decode(
        AbiParameter.uint32,
        bytes.sublist(consumed),
      );

      decodedResult = ABIUtils._decodeParamFromAbiParameter(
        childParam,
        bytes.sublist(offsetResult.result.toInt()),
      );

      consumed += offsetResult.consumed;
      dynamicConsumed += decodedResult.consumed;
    } else {
      decodedResult = ABIUtils._decodeParamFromAbiParameter(
        childParam,
        bytes.sublist(consumed),
      );
      consumed += decodedResult.consumed;
    }

    result.add(decodedResult.result);
  }
  return DecoderResult(
    result: result,
    consumed: consumed + dynamicConsumed,
    name: params.name,
  );
}