@aptos-labs/ts-sdk
Version:
Aptos TypeScript SDK
99 lines (89 loc) • 3.33 kB
text/typescript
import { AnyPublicKey, AnySignature } from "./singleKey.js";
import { Ed25519PublicKey, Ed25519Signature } from "./ed25519.js";
import { MultiKey, MultiKeySignature } from "./multiKey.js";
import { KeylessPublicKey, KeylessSignature } from "./keyless.js";
import { MultiEd25519PublicKey, MultiEd25519Signature } from "./multiEd25519.js";
import { FederatedKeylessPublicKey } from "./federatedKeyless.js";
import { Secp256k1PublicKey, Secp256k1Signature } from "./secp256k1.js";
import { PublicKey } from "./publicKey.js";
import { Signature } from "./signature.js";
import { Deserializer } from "../../bcs/deserializer.js";
import { HexInput } from "../../types/index.js";
const MULTIPLE_DESERIALIZATIONS_ERROR_MSG = "Multiple possible deserializations found";
/**
* Deserializes a public key from a hex string.
* Attempts to deserialize using various public key types in sequence until one succeeds.
*
* @param publicKey - The hex string representation of the public key to deserialize
* @returns The deserialized public key
* @throws Error if deserialization fails for all supported key types or if multiple deserializations are found
*/
export function deserializePublicKey(publicKey: HexInput): PublicKey {
const publicKeyTypes = [
Ed25519PublicKey,
AnyPublicKey,
MultiEd25519PublicKey,
MultiKey,
KeylessPublicKey,
FederatedKeylessPublicKey,
Secp256k1PublicKey,
];
let result: PublicKey | undefined;
for (const KeyType of publicKeyTypes) {
try {
const deserializer = Deserializer.fromHex(publicKey);
const key = KeyType.deserialize(deserializer);
deserializer.assertFinished();
if (result) {
throw new Error(`${MULTIPLE_DESERIALIZATIONS_ERROR_MSG}: ${publicKey}`);
}
result = key;
} catch (error) {
if (error instanceof Error && error.message.includes(MULTIPLE_DESERIALIZATIONS_ERROR_MSG)) {
throw error;
}
}
}
if (!result) {
throw new Error(`Failed to deserialize public key: ${publicKey}`);
}
return result;
}
/**
* Deserializes a signature from a hex string.
* Attempts to deserialize using various signature types in sequence until one succeeds.
*
* @param signature - The hex string representation of the signature to deserialize
* @returns The deserialized signature
* @throws Error if deserialization fails for all supported signature types or if multiple deserializations are found
*/
export function deserializeSignature(signature: HexInput): Signature {
const signatureTypes = [
Ed25519Signature,
AnySignature,
MultiEd25519Signature,
MultiKeySignature,
KeylessSignature,
Secp256k1Signature,
];
let result: Signature | undefined;
for (const SignatureType of signatureTypes) {
try {
const deserializer = Deserializer.fromHex(signature);
const sig = SignatureType.deserialize(deserializer);
deserializer.assertFinished();
if (result) {
throw new Error(`${MULTIPLE_DESERIALIZATIONS_ERROR_MSG}: ${signature}`);
}
result = sig;
} catch (error) {
if (error instanceof Error && error.message.includes(MULTIPLE_DESERIALIZATIONS_ERROR_MSG)) {
throw error;
}
}
}
if (!result) {
throw new Error(`Failed to deserialize signature: ${signature}`);
}
return result;
}