encodeMultiKey static method
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()});
}
}