{"version":3,"sources":["../../src/internal/ans.ts"],"sourcesContent":["// Copyright © Endless\n// Copyright © Aptos Foundation\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * This file contains the underlying implementations for exposed API surface in\n * the {@link api/name}. By moving the methods out into a separate file,\n * other namespaces and processes can access these methods without depending on the entire\n * name namespace and without having a dependency cycle error.\n */\n\nimport { EndlessConfig } from \"../api/endlessConfig\";\nimport { Account } from \"../account\";\nimport { AccountAddress, AccountAddressInput } from \"../core\";\nimport { InputGenerateTransactionOptions } from \"../transactions/types\";\nimport { MoveAddressType } from \"../types\";\nimport { Network } from \"../utils/apiEndpoints\";\nimport { view } from \"./view\";\nimport { generateTransaction } from \"./transactionSubmission\";\nimport { SimpleTransaction } from \"../transactions/instances/simpleTransaction\";\n\nexport const VALIDATION_RULES_DESCRIPTION = [\n  \"A name must be between 3 and 63 characters long,\",\n  \"and can only contain lowercase a-z, 0-9, and hyphens.\",\n  \"A name may not start or end with a hyphen.\",\n].join(\" \");\n\n/**\n *\n * @param fragment A fragment of a name, either the domain or subdomain\n * @returns boolean indicating if the fragment is a valid fragment\n */\nexport function isValidANSSegment(fragment: string): boolean {\n  if (!fragment) return false;\n  if (fragment.length < 3) return false;\n  if (fragment.length > 63) return false;\n  // only lowercase a-z and 0-9 are allowed, along with -. a domain may not start or end with a hyphen\n  if (!/^[a-z\\d][a-z\\d-]{1,61}[a-z\\d]$/.test(fragment)) return false;\n  return true;\n}\n\n/**\n * Checks if an ANS name is valid or not\n *\n * @param name A string of the domain name, can include or exclude the .apt suffix\n */\nexport function isValidANSName(name: string): { domainName: string; subdomainName?: string } {\n  const [first, second, ...rest] = name.replace(/\\.apt$/, \"\").split(\".\");\n\n  if (rest.length > 0) {\n    throw new Error(`${name} is invalid. A name can only have two parts, a domain and a subdomain separated by a \".\"`);\n  }\n\n  if (!isValidANSSegment(first)) {\n    throw new Error(`${first} is not valid. ${VALIDATION_RULES_DESCRIPTION}`);\n  }\n\n  if (second && !isValidANSSegment(second)) {\n    throw new Error(`${second} is not valid. ${VALIDATION_RULES_DESCRIPTION}`);\n  }\n\n  return {\n    domainName: second || first,\n    subdomainName: second ? first : undefined,\n  };\n}\n\n// export const LOCAL_ANS_ACCOUNT_PK =\n//   process.env.ANS_TEST_ACCOUNT_PRIVATE_KEY ?? \"0x37368b46ce665362562c6d1d4ec01a08c8644c488690df5a17e13ba163e20221\";\nexport const LOCAL_ANS_ACCOUNT_PK = \"0x37368b46ce665362562c6d1d4ec01a08c8644c488690df5a17e13ba163e20221\";\n// export const LOCAL_ANS_ACCOUNT_ADDRESS =\n//   process.env.ANS_TEST_ACCOUNT_ADDRESS ?? \"0x585fc9f0f0c54183b039ffc770ca282ebd87307916c215a3e692f2f8e4305e82\";\nexport const LOCAL_ANS_ACCOUNT_ADDRESS = \"0x585fc9f0f0c54183b039ffc770ca282ebd87307916c215a3e692f2f8e4305e82\";\n\nconst NetworkToAnsContract: Record<Network, string | null> = {\n  [Network.TESTNET]: \"0x5f8fd2347449685cf41d4db97926ec3a096eaf381332be4f1318ad4d16a8497c\",\n  [Network.MAINNET]: \"0x867ed1f6bf916171b1de3ee92849b8978b7d1b9e0a8cc982a3d19d535dfd9c0c\",\n  [Network.LOCAL]: LOCAL_ANS_ACCOUNT_ADDRESS,\n  [Network.CUSTOM]: null,\n  [Network.DEVNET]: null,\n};\n\nexport function getRouterAddress(endlessConfig: EndlessConfig): string {\n  const address = NetworkToAnsContract[endlessConfig.network];\n  if (!address) throw new Error(`The ANS contract is not deployed to ${endlessConfig.network}`);\n  return address;\n}\n\nconst unwrapOption = <T>(option: any): T | undefined => {\n  if (!!option && typeof option === \"object\" && \"vec\" in option && Array.isArray(option.vec)) {\n    return option.vec[0];\n  }\n\n  return undefined;\n};\n\nexport async function getOwnerAddress(args: {\n  endlessConfig: EndlessConfig;\n  name: string;\n}): Promise<AccountAddress | undefined> {\n  const { endlessConfig, name } = args;\n  const routerAddress = getRouterAddress(endlessConfig);\n  const { domainName, subdomainName } = isValidANSName(name);\n\n  const res = await view({\n    endlessConfig,\n    payload: {\n      function: `${routerAddress}::router::get_owner_addr`,\n      functionArguments: [domainName, subdomainName],\n    },\n  });\n\n  const owner = unwrapOption<MoveAddressType>(res[0]);\n\n  return owner ? AccountAddress.from(owner) : undefined;\n}\n\nexport interface RegisterNameParameters {\n  endlessConfig: EndlessConfig;\n  sender: Account;\n  name: string;\n  expiration:\n  | { policy: \"domain\"; years?: 1 }\n  | { policy: \"subdomain:follow-domain\" }\n  | { policy: \"subdomain:independent\"; expirationDate: number };\n  transferable?: boolean;\n  toAddress?: AccountAddressInput;\n  targetAddress?: AccountAddressInput;\n  options?: InputGenerateTransactionOptions;\n}\n\nexport async function registerName(args: RegisterNameParameters): Promise<SimpleTransaction> {\n  const { endlessConfig, expiration, name, sender, targetAddress, toAddress, options, transferable } = args;\n  const routerAddress = getRouterAddress(endlessConfig);\n  const { domainName, subdomainName } = isValidANSName(name);\n\n  const hasSubdomainPolicy =\n    expiration.policy === \"subdomain:independent\" || expiration.policy === \"subdomain:follow-domain\";\n\n  if (subdomainName && !hasSubdomainPolicy) {\n    throw new Error(\n      \"Subdomains must have an expiration policy of either 'subdomain:independent' or 'subdomain:follow-domain'\",\n    );\n  }\n\n  if (hasSubdomainPolicy && !subdomainName) {\n    throw new Error(`Policy is set to ${expiration.policy} but no subdomain was provided`);\n  }\n\n  if (expiration.policy === \"domain\") {\n    const years = expiration.years ?? 1;\n    if (years !== 1) {\n      throw new Error(\"For now, names can only be registered for 1 year at a time\");\n    }\n\n    const secondsInYear = 31536000;\n    const registrationDuration = years * secondsInYear;\n\n    const transaction = await generateTransaction({\n      endlessConfig,\n      sender: sender.accountAddress.toString(),\n      data: {\n        function: `${routerAddress}::router::register_domain`,\n        functionArguments: [domainName, registrationDuration, targetAddress, toAddress],\n      },\n      options,\n    });\n\n    return transaction;\n  }\n\n  // We are a subdomain\n  if (!subdomainName) {\n    throw new Error(`${expiration.policy} requires a subdomain to be provided.`);\n  }\n\n  const tldExpiration = await getExpiration({ endlessConfig, name: domainName });\n  if (!tldExpiration) {\n    throw new Error(\"The domain does not exist\");\n  }\n\n  const expirationDateInMillisecondsSinceEpoch =\n    expiration.policy === \"subdomain:independent\" ? expiration.expirationDate : tldExpiration;\n\n  if (expirationDateInMillisecondsSinceEpoch > tldExpiration) {\n    throw new Error(\"The subdomain expiration time cannot be greater than the domain expiration time\");\n  }\n\n  const transaction = await generateTransaction({\n    endlessConfig,\n    sender: sender.accountAddress.toString(),\n    data: {\n      function: `${routerAddress}::router::register_subdomain`,\n      functionArguments: [\n        domainName,\n        subdomainName,\n        Math.round(expirationDateInMillisecondsSinceEpoch / 1000),\n        expiration.policy === \"subdomain:follow-domain\" ? 1 : 0,\n        !!transferable,\n        targetAddress,\n        toAddress,\n      ],\n    },\n    options,\n  });\n\n  return transaction;\n}\n\nexport async function getExpiration(args: { endlessConfig: EndlessConfig; name: string }): Promise<number | undefined> {\n  const { endlessConfig, name } = args;\n  const routerAddress = getRouterAddress(endlessConfig);\n  const { domainName, subdomainName } = isValidANSName(name);\n\n  try {\n    const res = await view({\n      endlessConfig,\n      payload: {\n        function: `${routerAddress}::router::get_expiration`,\n        functionArguments: [domainName, subdomainName],\n      },\n    });\n\n    // Normalize expiration time from epoch seconds to epoch milliseconds\n    return Number(res[0]) * 1000;\n  } catch (e) {\n    return undefined;\n  }\n}\n\nexport async function getPrimaryName(args: {\n  endlessConfig: EndlessConfig;\n  address: AccountAddressInput;\n}): Promise<string | undefined> {\n  const { endlessConfig, address } = args;\n  const routerAddress = getRouterAddress(endlessConfig);\n\n  const res = await view({\n    endlessConfig,\n    payload: {\n      function: `${routerAddress}::router::get_primary_name`,\n      functionArguments: [AccountAddress.from(address).toString()],\n    },\n  });\n\n  const domainName = unwrapOption<MoveAddressType>(res[1]);\n  const subdomainName = unwrapOption<MoveAddressType>(res[0]);\n\n  if (!domainName) return undefined;\n\n  return [subdomainName, domainName].filter(Boolean).join(\".\");\n}\n\nexport async function setPrimaryName(args: {\n  endlessConfig: EndlessConfig;\n  sender: Account;\n  name?: string;\n  options?: InputGenerateTransactionOptions;\n}): Promise<SimpleTransaction> {\n  const { endlessConfig, sender, name, options } = args;\n  const routerAddress = getRouterAddress(endlessConfig);\n\n  if (!name) {\n    const transaction = await generateTransaction({\n      endlessConfig,\n      sender: sender.accountAddress.toString(),\n      data: {\n        function: `${routerAddress}::router::clear_primary_name`,\n        functionArguments: [],\n      },\n      options,\n    });\n\n    return transaction;\n  }\n\n  const { domainName, subdomainName } = isValidANSName(name);\n\n  const transaction = await generateTransaction({\n    endlessConfig,\n    sender: sender.accountAddress.toString(),\n    data: {\n      function: `${routerAddress}::router::set_primary_name`,\n      functionArguments: [domainName, subdomainName],\n    },\n    options,\n  });\n\n  return transaction;\n}\n\nexport async function getTargetAddress(args: {\n  endlessConfig: EndlessConfig;\n  name: string;\n}): Promise<AccountAddress | undefined> {\n  const { endlessConfig, name } = args;\n  const routerAddress = getRouterAddress(endlessConfig);\n  const { domainName, subdomainName } = isValidANSName(name);\n\n  const res = await view({\n    endlessConfig,\n    payload: {\n      function: `${routerAddress}::router::get_target_addr`,\n      functionArguments: [domainName, subdomainName],\n    },\n  });\n\n  const target = unwrapOption<MoveAddressType>(res[0]);\n  return target ? AccountAddress.from(target) : undefined;\n}\n\nexport async function setTargetAddress(args: {\n  endlessConfig: EndlessConfig;\n  sender: Account;\n  name: string;\n  address: AccountAddressInput;\n  options?: InputGenerateTransactionOptions;\n}): Promise<SimpleTransaction> {\n  const { endlessConfig, sender, name, address, options } = args;\n  const routerAddress = getRouterAddress(endlessConfig);\n  const { domainName, subdomainName } = isValidANSName(name);\n\n  const transaction = await generateTransaction({\n    endlessConfig,\n    sender: sender.accountAddress.toString(),\n    data: {\n      function: `${routerAddress}::router::set_target_addr`,\n      functionArguments: [domainName, subdomainName, address],\n    },\n    options,\n  });\n\n  return transaction;\n}\n\nexport async function renewDomain(args: {\n  endlessConfig: EndlessConfig;\n  sender: Account;\n  name: string;\n  years?: 1;\n  options?: InputGenerateTransactionOptions;\n}): Promise<SimpleTransaction> {\n  const { endlessConfig, sender, name, years = 1, options } = args;\n  const routerAddress = getRouterAddress(endlessConfig);\n  const renewalDuration = years * 31536000;\n  const { domainName, subdomainName } = isValidANSName(name);\n\n  if (subdomainName) {\n    throw new Error(\"Subdomains cannot be renewed\");\n  }\n\n  if (years !== 1) {\n    throw new Error(\"Currently, only 1 year renewals are supported\");\n  }\n\n  const transaction = await generateTransaction({\n    endlessConfig,\n    sender: sender.accountAddress.toString(),\n    data: {\n      function: `${routerAddress}::router::renew_domain`,\n      functionArguments: [domainName, renewalDuration],\n    },\n    options,\n  });\n\n  return transaction;\n}\n"],"mappings":"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","names":["VALIDATION_RULES_DESCRIPTION","isValidANSSegment","fragment","isValidANSName","name","first","second","rest","LOCAL_ANS_ACCOUNT_PK","LOCAL_ANS_ACCOUNT_ADDRESS","NetworkToAnsContract","getRouterAddress","endlessConfig","address","unwrapOption","option","getOwnerAddress","args","routerAddress","domainName","subdomainName","res","view","owner","AccountAddress","registerName","expiration","sender","targetAddress","toAddress","options","transferable","hasSubdomainPolicy","years","registrationDuration","generateTransaction","tldExpiration","getExpiration","expirationDateInMillisecondsSinceEpoch","getPrimaryName","setPrimaryName","getTargetAddress","target","setTargetAddress","renewDomain","renewalDuration"]}