{"version":3,"file":"getSnsDomainAddress.mjs","sources":["../../../src/domain/getSnsDomainAddress.ts"],"sourcesContent":["import { Address } from \"@solana/kit\";\r\n\r\nimport {\r\n  CENTRAL_STATE_DOMAIN_RECORDS,\r\n  SNS_ROOT_DOMAIN_ACCOUNT,\r\n} from \"../constants/addresses\";\r\nimport { InvalidInputError } from \"../errors\";\r\nimport { RecordVersion } from \"../types/record\";\r\nimport { _deriveAddress } from \"../utils/deriveAddress\";\r\n\r\n/**\r\n * Parameters for deriving an SNS domain address.\r\n *\r\n * @example\r\n * ```ts\r\n * const params: GetSnsDomainAddressParams = { domain: \"example\" };\r\n * ```\r\n */\r\nexport interface GetSnsDomainAddressParams {\r\n  /** TLD-less domain name. */\r\n  domain: string;\r\n  /** Record version. */\r\n  record?: RecordVersion;\r\n}\r\n\r\n/**\r\n * A derived SNS domain address.\r\n *\r\n * @example\r\n * ```ts\r\n * const derived: GetSnsDomainAddressResult = {\r\n *   domainAddress,\r\n *   isSub: false,\r\n * };\r\n * ```\r\n */\r\nexport interface GetSnsDomainAddressResult {\r\n  /** Derived account address. */\r\n  domainAddress: Address;\r\n  /** Parent domain address for subdomains. */\r\n  parentAddress?: Address;\r\n  /** Whether the input is a subdomain. */\r\n  isSub: boolean;\r\n  /** Whether the input is a subdomain record. */\r\n  isSubRecord?: boolean;\r\n}\r\n\r\n/**\r\n * Derives the address of a domain, subdomain, or record account.\r\n *\r\n * @param params Derivation parameters\r\n * @param params.domain TLD-trimmed SNS domain name\r\n * @param params.record Optional record account version for record derivation\r\n * @returns Derived account address and metadata describing top-level, subdomain, or sub-record derivation.\r\n *\r\n * @example\r\n * ```ts\r\n * const derived = await getSnsDomainAddress({ domain: \"example\" });\r\n * ```\r\n */\r\nexport const getSnsDomainAddress = async ({\r\n  domain,\r\n  record,\r\n}: GetSnsDomainAddressParams): Promise<GetSnsDomainAddressResult> => {\r\n  const recordClass =\r\n    record === RecordVersion.V2 ? CENTRAL_STATE_DOMAIN_RECORDS : undefined;\r\n  const recordPrefix =\r\n    {\r\n      [RecordVersion.V2]: \"\\x02\",\r\n      [RecordVersion.V1]: \"\\x01\",\r\n    }[record as RecordVersion] || \"\\x00\";\r\n  const splitted = domain.split(\".\");\r\n\r\n  if (splitted.length === 2) {\r\n    const parentAddress = await _deriveAddress(\r\n      splitted[1],\r\n      SNS_ROOT_DOMAIN_ACCOUNT\r\n    );\r\n    const domainAddress = await _deriveAddress(\r\n      recordPrefix + splitted[0],\r\n      parentAddress,\r\n      recordClass\r\n    );\r\n\r\n    return { domainAddress, parentAddress, isSub: true };\r\n  } else if (splitted.length === 3 && !!record) {\r\n    // Parent domain\r\n    const parentAddress = await _deriveAddress(\r\n      splitted[2],\r\n      SNS_ROOT_DOMAIN_ACCOUNT\r\n    );\r\n\r\n    // Sub domain\r\n    const subAddress = await _deriveAddress(\"\\0\" + splitted[1], parentAddress);\r\n\r\n    // Sub record\r\n    const domainAddress = await _deriveAddress(\r\n      recordPrefix + splitted[0],\r\n      subAddress,\r\n      recordClass\r\n    );\r\n\r\n    return { domainAddress, parentAddress, isSub: true, isSubRecord: true };\r\n  } else if (splitted.length >= 3) {\r\n    throw new InvalidInputError(\"The domain is malformed\");\r\n  }\r\n\r\n  const domainAddress = await _deriveAddress(domain, SNS_ROOT_DOMAIN_ACCOUNT);\r\n\r\n  return { domainAddress, isSub: false };\r\n};\r\n"],"names":[],"mappings":";;;;;AA+CA;;;;;;;;;;;;AAYG;AACI,MAAM,mBAAmB,GAAG,OAAO,EACxC,MAAM,EACN,MAAM,GACoB,KAAwC;AAClE,IAAA,MAAM,WAAW,GACf,MAAM,KAAK,aAAa,CAAC,EAAE,GAAG,4BAA4B,GAAG,SAAS;AACxE,IAAA,MAAM,YAAY,GAChB;AACE,QAAA,CAAC,aAAa,CAAC,EAAE,GAAG,MAAM;AAC1B,QAAA,CAAC,aAAa,CAAC,EAAE,GAAG,MAAM;AAC3B,KAAA,CAAC,MAAuB,CAAC,IAAI,MAAM;IACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;AAElC,IAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AACzB,QAAA,MAAM,aAAa,GAAG,MAAM,cAAc,CACxC,QAAQ,CAAC,CAAC,CAAC,EACX,uBAAuB,CACxB;AACD,QAAA,MAAM,aAAa,GAAG,MAAM,cAAc,CACxC,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,EAC1B,aAAa,EACb,WAAW,CACZ;QAED,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE;;SAC/C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE;;AAE5C,QAAA,MAAM,aAAa,GAAG,MAAM,cAAc,CACxC,QAAQ,CAAC,CAAC,CAAC,EACX,uBAAuB,CACxB;;AAGD,QAAA,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC;;AAG1E,QAAA,MAAM,aAAa,GAAG,MAAM,cAAc,CACxC,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,EAC1B,UAAU,EACV,WAAW,CACZ;AAED,QAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;;AAClE,SAAA,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE;AAC/B,QAAA,MAAM,IAAI,iBAAiB,CAAC,yBAAyB,CAAC;;IAGxD,MAAM,aAAa,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,uBAAuB,CAAC;AAE3E,IAAA,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE;AACxC;;;;"}