{"version":3,"file":"record.mjs","sources":["../../../src/states/record.ts"],"sourcesContent":["import {\r\n  Address,\r\n  GetAccountInfoApi,\r\n  GetMultipleAccountsApi,\r\n  Rpc,\r\n  fetchEncodedAccount,\r\n  fetchEncodedAccounts,\r\n} from \"@solana/kit\";\r\nimport { Schema, deserialize } from \"borsh\";\r\n\r\nimport {\r\n  InvalidSerializedDataError,\r\n  InvalidValidationError,\r\n  NoRecordDataError,\r\n} from \"../errors\";\r\nimport { Validation } from \"../types/validation\";\r\n\r\n/** Byte length of the common SNS name-registry account header. */\r\nexport const NAME_REGISTRY_LEN = 96;\r\n\r\n/**\r\n * Returns the byte length of an identifier encoded for a validation mode.\r\n *\r\n * @example\r\n * ```ts\r\n * const length = getValidationLength(Validation.Solana);\r\n * ```\r\n */\r\nexport const getValidationLength = (validation: Validation) => {\r\n  switch (validation) {\r\n    case Validation.None:\r\n      return 0;\r\n    case Validation.Ethereum:\r\n      return 20;\r\n    case Validation.Solana:\r\n      return 32;\r\n    case Validation.UnverifiedSolana:\r\n      return 32;\r\n    default:\r\n      throw new InvalidValidationError(\"Invalid validation enum\");\r\n  }\r\n};\r\n\r\n/**\r\n * Input for decoding an SNS V2 record header.\r\n *\r\n * @example\r\n * ```ts\r\n * const params: RecordHeaderStateParams = { stalenessValidation: 0, rightOfAssociationValidation: 0, contentLength: 0 };\r\n * ```\r\n */\r\nexport interface RecordHeaderStateParams {\r\n  /** Staleness validation mode. */\r\n  stalenessValidation: number;\r\n  /** Right of Association validation mode. */\r\n  rightOfAssociationValidation: number;\r\n  /** Record content length in bytes. */\r\n  contentLength: number;\r\n}\r\n\r\n/** Decoded header of an SNS V2 record account. */\r\nexport class RecordHeaderState {\r\n  /** Staleness validation mode. */\r\n  stalenessValidation: number;\r\n  /** Right of Association validation mode. */\r\n  rightOfAssociationValidation: number;\r\n  /** Record content length in bytes. */\r\n  contentLength: number;\r\n\r\n  static schema: Schema = {\r\n    struct: {\r\n      stalenessValidation: \"u16\",\r\n      rightOfAssociationValidation: \"u16\",\r\n      contentLength: \"u32\",\r\n    },\r\n  };\r\n\r\n  // The total length of the struct is calculated as the sum of:\r\n  // - `stalenessValidation`: 2 bytes (`u16`)\r\n  // - `rightOfAssociationValidation`: 2 bytes (`u16`)\r\n  // - `contentLength`: 4 bytes (`u32`)\r\n  static LEN = 8;\r\n\r\n  constructor(obj: RecordHeaderStateParams) {\r\n    this.stalenessValidation = obj.stalenessValidation;\r\n    this.rightOfAssociationValidation = obj.rightOfAssociationValidation;\r\n    this.contentLength = obj.contentLength;\r\n  }\r\n\r\n  static deserialize(data: Uint8Array): RecordHeaderState {\r\n    return new RecordHeaderState(deserialize(this.schema, data, true) as any);\r\n  }\r\n\r\n  static async retrieve(\r\n    rpc: Rpc<GetAccountInfoApi>,\r\n    address: Address\r\n  ): Promise<RecordHeaderState> {\r\n    const recordAccount = await fetchEncodedAccount(rpc, address);\r\n\r\n    if (!recordAccount.exists) {\r\n      throw new NoRecordDataError(\"Record account not found\");\r\n    }\r\n\r\n    return this.deserialize(\r\n      recordAccount.data.slice(NAME_REGISTRY_LEN, NAME_REGISTRY_LEN + this.LEN)\r\n    );\r\n  }\r\n}\r\n\r\n/** Decoded SNS V2 record account, including its validation data and content. */\r\nexport class RecordState {\r\n  /** Decoded record header. */\r\n  header: RecordHeaderState;\r\n  /** Validation identifiers and record content. */\r\n  data: Uint8Array;\r\n\r\n  constructor(header: RecordHeaderState, data: Uint8Array) {\r\n    this.data = data;\r\n    this.header = header;\r\n  }\r\n\r\n  static deserialize(data: Uint8Array): RecordState {\r\n    const offset = NAME_REGISTRY_LEN;\r\n    const header = RecordHeaderState.deserialize(\r\n      data.slice(offset, offset + RecordHeaderState.LEN)\r\n    );\r\n\r\n    return new RecordState(header, data.slice(offset + RecordHeaderState.LEN));\r\n  }\r\n\r\n  static async retrieve(\r\n    rpc: Rpc<GetAccountInfoApi>,\r\n    address: Address\r\n  ): Promise<RecordState> {\r\n    const recordAccount = await fetchEncodedAccount(rpc, address);\r\n    if (!recordAccount.exists) {\r\n      throw new NoRecordDataError(\"Record account not found\");\r\n    }\r\n\r\n    return this.deserialize(recordAccount.data);\r\n  }\r\n\r\n  static async retrieveBatch(\r\n    rpc: Rpc<GetMultipleAccountsApi>,\r\n    addresses: Address[]\r\n  ): Promise<(RecordState | undefined)[]> {\r\n    const recordAccounts = await fetchEncodedAccounts(rpc, addresses);\r\n\r\n    return recordAccounts.map((account) =>\r\n      account.exists ? this.deserialize(account.data) : undefined\r\n    );\r\n  }\r\n\r\n  getContent(): Uint8Array {\r\n    const startOffset =\r\n      getValidationLength(this.header.stalenessValidation) +\r\n      getValidationLength(this.header.rightOfAssociationValidation);\r\n    const endOffset = startOffset + this.header.contentLength;\r\n    if (endOffset > this.data.length) {\r\n      throw new InvalidSerializedDataError(\r\n        \"Record content length exceeds account data\"\r\n      );\r\n    }\r\n\r\n    return this.data.slice(startOffset, endOffset);\r\n  }\r\n\r\n  getStalenessId(): Uint8Array {\r\n    const endOffset = getValidationLength(this.header.stalenessValidation);\r\n\r\n    return this.data.slice(0, endOffset);\r\n  }\r\n\r\n  getRoAId(): Uint8Array {\r\n    const startOffset = getValidationLength(this.header.stalenessValidation);\r\n    const endOffset =\r\n      startOffset +\r\n      getValidationLength(this.header.rightOfAssociationValidation);\r\n\r\n    return this.data.slice(startOffset, endOffset);\r\n  }\r\n}\r\n"],"names":[],"mappings":"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"}