UNPKG

aptos

Version:
198 lines (174 loc) 7.29 kB
// Copyright © Aptos Foundation // SPDX-License-Identifier: Apache-2.0 /* eslint-disable @typescript-eslint/naming-convention */ import { AccountAddress } from "./account_address"; import { Serializer, Deserializer, Seq, deserializeVector, serializeVector } from "../bcs"; import { Ed25519PublicKey, Ed25519Signature } from "./ed25519"; import { MultiEd25519PublicKey, MultiEd25519Signature } from "./multi_ed25519"; export abstract class TransactionAuthenticator { abstract serialize(serializer: Serializer): void; static deserialize(deserializer: Deserializer): TransactionAuthenticator { const index = deserializer.deserializeUleb128AsU32(); switch (index) { case 0: return TransactionAuthenticatorEd25519.load(deserializer); case 1: return TransactionAuthenticatorMultiEd25519.load(deserializer); case 2: return TransactionAuthenticatorMultiAgent.load(deserializer); case 3: return TransactionAuthenticatorFeePayer.load(deserializer); default: throw new Error(`Unknown variant index for TransactionAuthenticator: ${index}`); } } } export class TransactionAuthenticatorEd25519 extends TransactionAuthenticator { /** * An authenticator for single signature. * * @param public_key Client's public key. * @param signature Signature of a raw transaction. * @see {@link https://aptos.dev/guides/creating-a-signed-transaction/ | Creating a Signed Transaction} * for details about generating a signature. */ constructor( public readonly public_key: Ed25519PublicKey, public readonly signature: Ed25519Signature, ) { super(); } serialize(serializer: Serializer): void { serializer.serializeU32AsUleb128(0); this.public_key.serialize(serializer); this.signature.serialize(serializer); } static load(deserializer: Deserializer): TransactionAuthenticatorEd25519 { const public_key = Ed25519PublicKey.deserialize(deserializer); const signature = Ed25519Signature.deserialize(deserializer); return new TransactionAuthenticatorEd25519(public_key, signature); } } export class TransactionAuthenticatorMultiEd25519 extends TransactionAuthenticator { /** * An authenticator for multiple signatures. * * @param public_key * @param signature * */ constructor( public readonly public_key: MultiEd25519PublicKey, public readonly signature: MultiEd25519Signature, ) { super(); } serialize(serializer: Serializer): void { serializer.serializeU32AsUleb128(1); this.public_key.serialize(serializer); this.signature.serialize(serializer); } static load(deserializer: Deserializer): TransactionAuthenticatorMultiEd25519 { const public_key = MultiEd25519PublicKey.deserialize(deserializer); const signature = MultiEd25519Signature.deserialize(deserializer); return new TransactionAuthenticatorMultiEd25519(public_key, signature); } } export class TransactionAuthenticatorMultiAgent extends TransactionAuthenticator { constructor( public readonly sender: AccountAuthenticator, public readonly secondary_signer_addresses: Seq<AccountAddress>, public readonly secondary_signers: Seq<AccountAuthenticator>, ) { super(); } serialize(serializer: Serializer): void { serializer.serializeU32AsUleb128(2); this.sender.serialize(serializer); serializeVector<AccountAddress>(this.secondary_signer_addresses, serializer); serializeVector<AccountAuthenticator>(this.secondary_signers, serializer); } static load(deserializer: Deserializer): TransactionAuthenticatorMultiAgent { const sender = AccountAuthenticator.deserialize(deserializer); const secondary_signer_addresses = deserializeVector(deserializer, AccountAddress); const secondary_signers = deserializeVector(deserializer, AccountAuthenticator); return new TransactionAuthenticatorMultiAgent(sender, secondary_signer_addresses, secondary_signers); } } export class TransactionAuthenticatorFeePayer extends TransactionAuthenticator { constructor( public readonly sender: AccountAuthenticator, public readonly secondary_signer_addresses: Seq<AccountAddress>, public readonly secondary_signers: Seq<AccountAuthenticator>, public readonly fee_payer: { address: AccountAddress; authenticator: AccountAuthenticator }, ) { super(); } serialize(serializer: Serializer): void { serializer.serializeU32AsUleb128(3); this.sender.serialize(serializer); serializeVector<AccountAddress>(this.secondary_signer_addresses, serializer); serializeVector<AccountAuthenticator>(this.secondary_signers, serializer); this.fee_payer.address.serialize(serializer); this.fee_payer.authenticator.serialize(serializer); } static load(deserializer: Deserializer): TransactionAuthenticatorMultiAgent { const sender = AccountAuthenticator.deserialize(deserializer); const secondary_signer_addresses = deserializeVector(deserializer, AccountAddress); const secondary_signers = deserializeVector(deserializer, AccountAuthenticator); const address = AccountAddress.deserialize(deserializer); const authenticator = AccountAuthenticator.deserialize(deserializer); const fee_payer = { address, authenticator }; return new TransactionAuthenticatorFeePayer(sender, secondary_signer_addresses, secondary_signers, fee_payer); } } export abstract class AccountAuthenticator { abstract serialize(serializer: Serializer): void; static deserialize(deserializer: Deserializer): AccountAuthenticator { const index = deserializer.deserializeUleb128AsU32(); switch (index) { case 0: return AccountAuthenticatorEd25519.load(deserializer); case 1: return AccountAuthenticatorMultiEd25519.load(deserializer); default: throw new Error(`Unknown variant index for AccountAuthenticator: ${index}`); } } } export class AccountAuthenticatorEd25519 extends AccountAuthenticator { constructor( public readonly public_key: Ed25519PublicKey, public readonly signature: Ed25519Signature, ) { super(); } serialize(serializer: Serializer): void { serializer.serializeU32AsUleb128(0); this.public_key.serialize(serializer); this.signature.serialize(serializer); } static load(deserializer: Deserializer): AccountAuthenticatorEd25519 { const public_key = Ed25519PublicKey.deserialize(deserializer); const signature = Ed25519Signature.deserialize(deserializer); return new AccountAuthenticatorEd25519(public_key, signature); } } export class AccountAuthenticatorMultiEd25519 extends AccountAuthenticator { constructor( public readonly public_key: MultiEd25519PublicKey, public readonly signature: MultiEd25519Signature, ) { super(); } serialize(serializer: Serializer): void { serializer.serializeU32AsUleb128(1); this.public_key.serialize(serializer); this.signature.serialize(serializer); } static load(deserializer: Deserializer): AccountAuthenticatorMultiEd25519 { const public_key = MultiEd25519PublicKey.deserialize(deserializer); const signature = MultiEd25519Signature.deserialize(deserializer); return new AccountAuthenticatorMultiEd25519(public_key, signature); } }