abiEncode method
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,
);
}