{"version":3,"sources":["../../src/transactions/typeTag/index.ts"],"sourcesContent":["// Copyright © Aptos Foundation\n// SPDX-License-Identifier: Apache-2.0\n\n/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable class-methods-use-this */\n/* eslint-disable max-classes-per-file */\nimport { Deserializer } from \"../../bcs/deserializer\";\nimport { Serializable, Serializer } from \"../../bcs/serializer\";\nimport { AccountAddress } from \"../../core\";\nimport { Identifier } from \"../instances/identifier\";\nimport { TypeTagVariants } from \"../../types\";\n\nexport abstract class TypeTag extends Serializable {\n  abstract serialize(serializer: Serializer): void;\n\n  static deserialize(deserializer: Deserializer): TypeTag {\n    const index = deserializer.deserializeUleb128AsU32();\n    switch (index) {\n      case TypeTagVariants.Bool:\n        return TypeTagBool.load(deserializer);\n      case TypeTagVariants.U8:\n        return TypeTagU8.load(deserializer);\n      case TypeTagVariants.U64:\n        return TypeTagU64.load(deserializer);\n      case TypeTagVariants.U128:\n        return TypeTagU128.load(deserializer);\n      case TypeTagVariants.Address:\n        return TypeTagAddress.load(deserializer);\n      case TypeTagVariants.Signer:\n        return TypeTagSigner.load(deserializer);\n      case TypeTagVariants.Vector:\n        return TypeTagVector.load(deserializer);\n      case TypeTagVariants.Struct:\n        return TypeTagStruct.load(deserializer);\n      case TypeTagVariants.U16:\n        return TypeTagU16.load(deserializer);\n      case TypeTagVariants.U32:\n        return TypeTagU32.load(deserializer);\n      case TypeTagVariants.U256:\n        return TypeTagU256.load(deserializer);\n      case TypeTagVariants.Generic:\n        // This is only used for ABI representation, and cannot actually be used as a type.\n        return TypeTagGeneric.load(deserializer);\n      default:\n        throw new Error(`Unknown variant index for TypeTag: ${index}`);\n    }\n  }\n\n  abstract toString(): string;\n\n  isBool(): this is TypeTagBool {\n    return this instanceof TypeTagBool;\n  }\n\n  isAddress(): this is TypeTagAddress {\n    return this instanceof TypeTagAddress;\n  }\n\n  isGeneric(): this is TypeTagGeneric {\n    return this instanceof TypeTagGeneric;\n  }\n\n  isSigner(): this is TypeTagSigner {\n    return this instanceof TypeTagSigner;\n  }\n\n  isVector(): this is TypeTagVector {\n    return this instanceof TypeTagVector;\n  }\n\n  isStruct(): this is TypeTagStruct {\n    return this instanceof TypeTagStruct;\n  }\n\n  isU8(): this is TypeTagU8 {\n    return this instanceof TypeTagU8;\n  }\n\n  isU16(): this is TypeTagU16 {\n    return this instanceof TypeTagU16;\n  }\n\n  isU32(): this is TypeTagU32 {\n    return this instanceof TypeTagU32;\n  }\n\n  isU64(): this is TypeTagU64 {\n    return this instanceof TypeTagU64;\n  }\n\n  isU128(): this is TypeTagU128 {\n    return this instanceof TypeTagU128;\n  }\n\n  isU256(): this is TypeTagU256 {\n    return this instanceof TypeTagU256;\n  }\n}\n\nexport class TypeTagBool extends TypeTag {\n  toString(): string {\n    return \"bool\";\n  }\n\n  serialize(serializer: Serializer): void {\n    serializer.serializeU32AsUleb128(TypeTagVariants.Bool);\n  }\n\n  static load(_deserializer: Deserializer): TypeTagBool {\n    return new TypeTagBool();\n  }\n}\n\nexport class TypeTagU8 extends TypeTag {\n  toString(): string {\n    return \"u8\";\n  }\n\n  serialize(serializer: Serializer): void {\n    serializer.serializeU32AsUleb128(TypeTagVariants.U8);\n  }\n\n  static load(_deserializer: Deserializer): TypeTagU8 {\n    return new TypeTagU8();\n  }\n}\n\nexport class TypeTagU16 extends TypeTag {\n  toString(): string {\n    return \"u16\";\n  }\n\n  serialize(serializer: Serializer): void {\n    serializer.serializeU32AsUleb128(TypeTagVariants.U16);\n  }\n\n  static load(_deserializer: Deserializer): TypeTagU16 {\n    return new TypeTagU16();\n  }\n}\n\nexport class TypeTagU32 extends TypeTag {\n  toString(): string {\n    return \"u32\";\n  }\n\n  serialize(serializer: Serializer): void {\n    serializer.serializeU32AsUleb128(TypeTagVariants.U32);\n  }\n\n  static load(_deserializer: Deserializer): TypeTagU32 {\n    return new TypeTagU32();\n  }\n}\n\nexport class TypeTagU64 extends TypeTag {\n  toString(): string {\n    return \"u64\";\n  }\n\n  serialize(serializer: Serializer): void {\n    serializer.serializeU32AsUleb128(TypeTagVariants.U64);\n  }\n\n  static load(_deserializer: Deserializer): TypeTagU64 {\n    return new TypeTagU64();\n  }\n}\n\nexport class TypeTagU128 extends TypeTag {\n  toString(): string {\n    return \"u128\";\n  }\n\n  serialize(serializer: Serializer): void {\n    serializer.serializeU32AsUleb128(TypeTagVariants.U128);\n  }\n\n  static load(_deserializer: Deserializer): TypeTagU128 {\n    return new TypeTagU128();\n  }\n}\n\nexport class TypeTagU256 extends TypeTag {\n  toString(): string {\n    return \"u256\";\n  }\n\n  serialize(serializer: Serializer): void {\n    serializer.serializeU32AsUleb128(TypeTagVariants.U256);\n  }\n\n  static load(_deserializer: Deserializer): TypeTagU256 {\n    return new TypeTagU256();\n  }\n}\n\nexport class TypeTagAddress extends TypeTag {\n  toString(): string {\n    return \"address\";\n  }\n\n  serialize(serializer: Serializer): void {\n    serializer.serializeU32AsUleb128(TypeTagVariants.Address);\n  }\n\n  static load(_deserializer: Deserializer): TypeTagAddress {\n    return new TypeTagAddress();\n  }\n}\n\nexport class TypeTagSigner extends TypeTag {\n  toString(): string {\n    return \"signer\";\n  }\n\n  serialize(serializer: Serializer): void {\n    serializer.serializeU32AsUleb128(TypeTagVariants.Signer);\n  }\n\n  static load(_deserializer: Deserializer): TypeTagSigner {\n    return new TypeTagSigner();\n  }\n}\n\nexport class TypeTagReference extends TypeTag {\n  toString(): `&${string}` {\n    return `&${this.value.toString()}`;\n  }\n\n  constructor(public readonly value: TypeTag) {\n    super();\n  }\n\n  serialize(serializer: Serializer): void {\n    serializer.serializeU32AsUleb128(TypeTagVariants.Reference);\n  }\n\n  static load(deserializer: Deserializer): TypeTagReference {\n    const value = TypeTag.deserialize(deserializer);\n    return new TypeTagReference(value);\n  }\n}\n\n/**\n * Generics are used for type parameters in entry functions.  However,\n * they are not actually serialized into a real type, so they cannot be\n * used as a type directly.\n */\nexport class TypeTagGeneric extends TypeTag {\n  toString(): `T${number}` {\n    return `T${this.value}`;\n  }\n\n  constructor(public readonly value: number) {\n    super();\n    if (value < 0) throw new Error(\"Generic type parameter index cannot be negative\");\n  }\n\n  serialize(serializer: Serializer): void {\n    serializer.serializeU32AsUleb128(TypeTagVariants.Generic);\n    serializer.serializeU32(this.value);\n  }\n\n  static load(deserializer: Deserializer): TypeTagGeneric {\n    const value = deserializer.deserializeU32();\n    return new TypeTagGeneric(value);\n  }\n}\n\nexport class TypeTagVector extends TypeTag {\n  toString(): `vector<${string}>` {\n    return `vector<${this.value.toString()}>`;\n  }\n\n  constructor(public readonly value: TypeTag) {\n    super();\n  }\n\n  static u8(): TypeTagVector {\n    return new TypeTagVector(new TypeTagU8());\n  }\n\n  serialize(serializer: Serializer): void {\n    serializer.serializeU32AsUleb128(TypeTagVariants.Vector);\n    this.value.serialize(serializer);\n  }\n\n  static load(deserializer: Deserializer): TypeTagVector {\n    const value = TypeTag.deserialize(deserializer);\n    return new TypeTagVector(value);\n  }\n}\n\nexport class TypeTagStruct extends TypeTag {\n  toString(): `0x${string}::${string}::${string}` {\n    // Collect type args and add it if there are any\n    let typePredicate = \"\";\n    if (this.value.typeArgs.length > 0) {\n      typePredicate = `<${this.value.typeArgs.map((typeArg) => typeArg.toString()).join(\", \")}>`;\n    }\n\n    return `${this.value.address.toString()}::${this.value.moduleName.identifier}::${\n      this.value.name.identifier\n    }${typePredicate}`;\n  }\n\n  constructor(public readonly value: StructTag) {\n    super();\n  }\n\n  serialize(serializer: Serializer): void {\n    serializer.serializeU32AsUleb128(TypeTagVariants.Struct);\n    this.value.serialize(serializer);\n  }\n\n  static load(deserializer: Deserializer): TypeTagStruct {\n    const value = StructTag.deserialize(deserializer);\n    return new TypeTagStruct(value);\n  }\n\n  isTypeTag(address: AccountAddress, moduleName: string, structName: string): boolean {\n    return (\n      this.value.moduleName.identifier === moduleName &&\n      this.value.name.identifier === structName &&\n      this.value.address.equals(address)\n    );\n  }\n\n  isString(): boolean {\n    return this.isTypeTag(AccountAddress.ONE, \"string\", \"String\");\n  }\n\n  isOption(): boolean {\n    return this.isTypeTag(AccountAddress.ONE, \"option\", \"Option\");\n  }\n\n  isObject(): boolean {\n    return this.isTypeTag(AccountAddress.ONE, \"object\", \"Object\");\n  }\n}\n\nexport class StructTag extends Serializable {\n  public readonly address: AccountAddress;\n\n  public readonly moduleName: Identifier;\n\n  public readonly name: Identifier;\n\n  public readonly typeArgs: Array<TypeTag>;\n\n  constructor(address: AccountAddress, module_name: Identifier, name: Identifier, type_args: Array<TypeTag>) {\n    super();\n    this.address = address;\n    this.moduleName = module_name;\n    this.name = name;\n    this.typeArgs = type_args;\n  }\n\n  serialize(serializer: Serializer): void {\n    serializer.serialize(this.address);\n    serializer.serialize(this.moduleName);\n    serializer.serialize(this.name);\n    serializer.serializeVector(this.typeArgs);\n  }\n\n  static deserialize(deserializer: Deserializer): StructTag {\n    const address = AccountAddress.deserialize(deserializer);\n    const moduleName = Identifier.deserialize(deserializer);\n    const name = Identifier.deserialize(deserializer);\n    const typeArgs = deserializer.deserializeVector(TypeTag);\n    return new StructTag(address, moduleName, name, typeArgs);\n  }\n}\n\nexport function aptosCoinStructTag(): StructTag {\n  return new StructTag(AccountAddress.ONE, new Identifier(\"aptos_coin\"), new Identifier(\"AptosCoin\"), []);\n}\n\nexport function stringStructTag(): StructTag {\n  return new StructTag(AccountAddress.ONE, new Identifier(\"string\"), new Identifier(\"String\"), []);\n}\n\nexport function optionStructTag(typeArg: TypeTag): StructTag {\n  return new StructTag(AccountAddress.ONE, new Identifier(\"option\"), new Identifier(\"Option\"), [typeArg]);\n}\n\nexport function objectStructTag(typeArg: TypeTag): StructTag {\n  return new StructTag(AccountAddress.ONE, new Identifier(\"object\"), new Identifier(\"Object\"), [typeArg]);\n}\n"],"mappings":"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","names":["TypeTag","Serializable","deserializer","index","TypeTagBool","TypeTagU8","TypeTagU64","TypeTagU128","TypeTagAddress","TypeTagSigner","TypeTagVector","TypeTagStruct","TypeTagU16","TypeTagU32","TypeTagU256","TypeTagGeneric","_TypeTagBool","serializer","_deserializer","_TypeTagU8","_TypeTagU16","_TypeTagU32","_TypeTagU64","_TypeTagU128","_TypeTagU256","_TypeTagAddress","_TypeTagSigner","TypeTagReference","_TypeTagReference","value","_TypeTagGeneric","_TypeTagVector","_TypeTagStruct","typePredicate","typeArg","StructTag","address","moduleName","structName","AccountAddress","_StructTag","module_name","name","type_args","Identifier","typeArgs","aptosCoinStructTag","stringStructTag","optionStructTag","objectStructTag"]}