{"version":3,"file":"getPrimaryDomainsBatch.cjs","sources":["../../../src/address/getPrimaryDomainsBatch.ts"],"sourcesContent":["import { findAssociatedTokenPda } from \"@solana-program/token\";\r\nimport {\r\n  Address,\r\n  GetMultipleAccountsApi,\r\n  GetTokenLargestAccountsApi,\r\n  Rpc,\r\n  fetchEncodedAccounts,\r\n} from \"@solana/kit\";\r\n\r\nimport { tokenCodec } from \"../codecs\";\r\nimport {\r\n  DEFAULT_ADDRESS,\r\n  NAME_OFFERS_ADDRESS,\r\n  NAME_PROGRAM_ADDRESS,\r\n  SNS_ROOT_DOMAIN_ACCOUNT,\r\n  TOKEN_PROGRAM_ADDRESS,\r\n} from \"../constants/addresses\";\r\nimport { getSnsNftMint } from \"../nft/getSnsNftMint\";\r\nimport { PrimaryDomainState } from \"../states/primaryDomain\";\r\nimport { RegistryState } from \"../states/registry\";\r\nimport { deserializeReverse } from \"../utils/deserializers/deserializeReverse\";\r\nimport { getReverseAddressFromDomainAddress } from \"../utils/getReverseAddressFromDomainAddress\";\r\n\r\n/**\r\n * Parameters for retrieving primary domains for multiple wallets.\r\n *\r\n * @example\r\n * ```ts\r\n * const params: GetPrimaryDomainsBatchParams = { rpc, walletAddresses };\r\n * ```\r\n */\r\nexport interface GetPrimaryDomainsBatchParams {\r\n  /** RPC client. */\r\n  rpc: Rpc<GetMultipleAccountsApi & GetTokenLargestAccountsApi>;\r\n  /** Wallet addresses. */\r\n  walletAddresses: Address[];\r\n}\r\n\r\ninterface ValidPrimary {\r\n  index: number;\r\n  domainAddress: Address;\r\n  registry?: RegistryState;\r\n}\r\n\r\n/**\r\n * Retrieves primary SNS domain names for multiple wallet addresses.\r\n *\r\n * Returned values are index-aligned with `walletAddresses`. Domain names omit\r\n * the TLD suffix; subdomain primary names can include parent labels such as\r\n * `sub.parent`.\r\n *\r\n * @param params Primary domain retrieval parameters\r\n * @param params.rpc RPC client implementing multiple-account and token-largest-account APIs\r\n * @param params.walletAddresses Wallet addresses whose primary domains are retrieved\r\n * @returns Primary domain names, or `undefined` when no valid non-stale primary domain is found.\r\n *\r\n * @example\r\n * ```ts\r\n * const domains = await getPrimaryDomainsBatch({ rpc, walletAddresses });\r\n * ```\r\n */\r\nexport const getPrimaryDomainsBatch = async ({\r\n  rpc,\r\n  walletAddresses,\r\n}: GetPrimaryDomainsBatchParams): Promise<(string | undefined)[]> => {\r\n  const result: (string | undefined)[] = new Array(walletAddresses.length).fill(\r\n    undefined\r\n  );\r\n  const addresses = await Promise.all(\r\n    walletAddresses.map((address) =>\r\n      PrimaryDomainState.getAddress(NAME_OFFERS_ADDRESS, address)\r\n    )\r\n  );\r\n  const primaries = await PrimaryDomainState.retrieveBatch(rpc, addresses);\r\n\r\n  let validPrimaries = primaries.reduce<ValidPrimary[]>((acc, curr, idx) => {\r\n    if (curr) {\r\n      acc.push({ index: idx, domainAddress: curr.nameAccount });\r\n    }\r\n    return acc;\r\n  }, []);\r\n\r\n  const registries = await RegistryState.retrieveBatch(\r\n    rpc,\r\n    validPrimaries.map((item) => item.domainAddress)\r\n  );\r\n\r\n  validPrimaries = validPrimaries\r\n    .map((primary, idx) => ({ ...primary, registry: registries[idx] }))\r\n    .filter(({ registry }) => !!registry);\r\n\r\n  const revAddressesPromises: Promise<Address>[] = [];\r\n  const parentRevAddressesPromises: (Promise<Address> | Address)[] = [];\r\n  const atasPromises: Promise<Address>[] = [];\r\n\r\n  for (const { index, domainAddress, registry } of validPrimaries) {\r\n    const isSub = registry!.parentName !== SNS_ROOT_DOMAIN_ACCOUNT;\r\n\r\n    parentRevAddressesPromises.push(\r\n      isSub\r\n        ? getReverseAddressFromDomainAddress({\r\n            domainAddress: registry!.parentName,\r\n          })\r\n        : DEFAULT_ADDRESS\r\n    );\r\n    revAddressesPromises.push(\r\n      getReverseAddressFromDomainAddress({\r\n        domainAddress,\r\n        parentAddress: isSub ? registry!.parentName : undefined,\r\n      })\r\n    );\r\n    atasPromises.push(\r\n      getSnsNftMint({ domainAddress })\r\n        .then((mint) =>\r\n          findAssociatedTokenPda({\r\n            mint,\r\n            owner: walletAddresses[index],\r\n            tokenProgram: TOKEN_PROGRAM_ADDRESS,\r\n          })\r\n        )\r\n        .then(([pda]) => pda)\r\n    );\r\n  }\r\n\r\n  const [revs, parentRevs, tokenAccs] = await Promise.all([\r\n    Promise.all(revAddressesPromises).then((addresses) =>\r\n      fetchEncodedAccounts(rpc, addresses)\r\n    ),\r\n    Promise.all(parentRevAddressesPromises).then((addresses) =>\r\n      fetchEncodedAccounts(rpc, addresses)\r\n    ),\r\n    Promise.all(atasPromises).then((addresses) =>\r\n      fetchEncodedAccounts(rpc, addresses)\r\n    ),\r\n  ]);\r\n\r\n  for (const [i, { index, registry }] of validPrimaries.entries()) {\r\n    let parentRev = \"\";\r\n    const rev = revs[i];\r\n    const parentRevAccount = parentRevs[i];\r\n    const tokenAcc = tokenAccs[i];\r\n\r\n    if (!rev.exists) {\r\n      continue;\r\n    }\r\n\r\n    if (\r\n      parentRevAccount.exists &&\r\n      parentRevAccount.programAddress === NAME_PROGRAM_ADDRESS\r\n    ) {\r\n      const des = deserializeReverse({\r\n        data: parentRevAccount.data.slice(96),\r\n      });\r\n      parentRev = `.${des}`;\r\n    }\r\n\r\n    if (registry!.owner === walletAddresses[index]) {\r\n      result[index] =\r\n        deserializeReverse({\r\n          data: rev.data.slice(96),\r\n          trimFirstNullByte: true,\r\n        }) + parentRev;\r\n      continue;\r\n    }\r\n\r\n    // Tokenized\r\n    if (\r\n      tokenAcc.exists &&\r\n      Number(tokenCodec.decode(tokenAcc.data).amount) === 1\r\n    ) {\r\n      result[index] =\r\n        deserializeReverse({ data: rev?.data.slice(96) }) + parentRev;\r\n      continue;\r\n    }\r\n\r\n    // Stale otherwise\r\n  }\r\n\r\n  return result;\r\n};\r\n"],"names":["addresses","PrimaryDomainState","NAME_OFFERS_ADDRESS","RegistryState","SNS_ROOT_DOMAIN_ACCOUNT","getReverseAddressFromDomainAddress","DEFAULT_ADDRESS","getSnsNftMint","findAssociatedTokenPda","TOKEN_PROGRAM_ADDRESS","fetchEncodedAccounts","NAME_PROGRAM_ADDRESS","deserializeReverse","tokenCodec"],"mappings":"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"}