encodeMultiKey static method

List<int> encodeMultiKey(
  1. List<IPublicKey> publicKeys,
  2. int requiredSignature
)

encode Multi Public keys to MultiKey address

Implementation

static List<int> encodeMultiKey(
    List<IPublicKey> publicKeys, int requiredSignature) {
  try {
    final pubkeyLayoutStruct = publicKeys.map((e) {
      return switch (e.curve) {
        EllipticCurveTypes.secp256k1 => {e.curve.name: e.uncompressed},
        EllipticCurveTypes.ed25519 => {e.curve.name: e.compressed.sublist(1)},
        _ => throw AddressConverterException(
            "Unsupported public key: Aptos Multikey address can only be generated from secp256k1 or ed25519 public keys.")
      };
    }).toList();
    final keys = publicKeys.toSet();
    if (keys.length != publicKeys.length) {
      throw AddressConverterException("Duplicate public key detected.");
    }
    if (publicKeys.length < AptosAddrConst.multikeyMinPublicKey ||
        publicKeys.length > AptosAddrConst.multikeyMaxPublicKey) {
      throw AddressConverterException(
          "The number of public keys provided is invalid. It must be between ${AptosAddrConst.multikeyMinPublicKey} and ${AptosAddrConst.multikeyMaxPublicKey}.");
    }

    if (requiredSignature < AptosAddrConst.minthreshold ||
        requiredSignature > AptosAddrConst.multiKeyMaxSignature) {
      throw AddressConverterException(
          "Invalid threshold. The threshold must be between ${AptosAddrConst.minthreshold} and ${AptosAddrConst.multiKeyMaxSignature}.");
    }
    if (publicKeys.length < requiredSignature) {
      throw AddressConverterException(
          "The number of public keys must be at least equal to the required signatures.");
    }
    final layoutStruct = {
      "requiredSignature": requiredSignature,
      "publicKeys": pubkeyLayoutStruct
    };
    final encode =
        AptosAddrConst.multiKeyAddressLayout.serialize(layoutStruct);
    return hashKeyBytes(
        bytes: encode, scheme: AptosAddrConst.multikeyAddressFlag);
  } on AddressConverterException {
    rethrow;
  } catch (e) {
    throw AddressConverterException("Invalid aptos MultiKey address bytes.",
        details: {"error": e.toString()});
  }
}