{"version":3,"file":"getSnsNftOwner.mjs","sources":["../../../src/nft/getSnsNftOwner.ts"],"sourcesContent":["import {\r\n  Address,\r\n  GetAccountInfoApi,\r\n  GetTokenLargestAccountsApi,\r\n  Rpc,\r\n  SOLANA_ERROR__JSON_RPC__INVALID_PARAMS,\r\n  fetchEncodedAccount,\r\n  isSolanaError,\r\n} from \"@solana/kit\";\r\n\r\nimport { tokenCodec } from \"../codecs\";\r\nimport { getSnsNftMint } from \"./getSnsNftMint\";\r\n\r\n/**\r\n * Parameters for retrieving an SNS NFT owner.\r\n *\r\n * @example\r\n * ```ts\r\n * const params: GetSnsNftOwnerParams = { rpc, domainAddress };\r\n * ```\r\n */\r\nexport interface GetSnsNftOwnerParams {\r\n  /** RPC client. */\r\n  rpc: Rpc<GetAccountInfoApi & GetTokenLargestAccountsApi>;\r\n  /** Tokenized domain account address. */\r\n  domainAddress: Address;\r\n}\r\n\r\n/**\r\n * Retrieves the owner of a tokenized SNS domain.\r\n *\r\n * @param params NFT owner retrieval parameters\r\n * @param params.rpc RPC client implementing account and token-largest-account APIs\r\n * @param params.domainAddress Domain account address whose tokenized owner is retrieved\r\n * @returns The SNS domain NFT owner address, or `null` when no valid tokenized owner is found.\r\n *\r\n * @example\r\n * ```ts\r\n * const owner = await getSnsNftOwner({ rpc, domainAddress });\r\n * ```\r\n */\r\nexport const getSnsNftOwner = async ({\r\n  rpc,\r\n  domainAddress,\r\n}: GetSnsNftOwnerParams): Promise<Address | null> => {\r\n  try {\r\n    const mint = await getSnsNftMint({ domainAddress });\r\n    const largestAccounts = await rpc.getTokenLargestAccounts(mint).send();\r\n\r\n    if (largestAccounts.value.length === 0) {\r\n      return null;\r\n    }\r\n\r\n    const largestAccountInfo = await fetchEncodedAccount(\r\n      rpc,\r\n      largestAccounts.value[0].address\r\n    );\r\n\r\n    if (!largestAccountInfo.exists) {\r\n      return null;\r\n    }\r\n\r\n    const decoded = tokenCodec.decode(largestAccountInfo.data);\r\n    if (decoded.amount.toString() === \"1\") {\r\n      return decoded.owner;\r\n    }\r\n\r\n    return null;\r\n  } catch (err) {\r\n    if (isSolanaError(err, SOLANA_ERROR__JSON_RPC__INVALID_PARAMS)) {\r\n      return null;\r\n    }\r\n    throw err;\r\n  }\r\n};\r\n"],"names":[],"mappings":";;;;AA4BA;;;;;;;;;;;;AAYG;AACI,MAAM,cAAc,GAAG,OAAO,EACnC,GAAG,EACH,aAAa,GACQ,KAA6B;AAClD,IAAA,IAAI;QACF,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,EAAE,aAAa,EAAE,CAAC;AACnD,QAAA,MAAM,eAAe,GAAG,MAAM,GAAG,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;QAEtE,IAAI,eAAe,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACtC,YAAA,OAAO,IAAI;;AAGb,QAAA,MAAM,kBAAkB,GAAG,MAAM,mBAAmB,CAClD,GAAG,EACH,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CACjC;AAED,QAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE;AAC9B,YAAA,OAAO,IAAI;;QAGb,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC;QAC1D,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,GAAG,EAAE;YACrC,OAAO,OAAO,CAAC,KAAK;;AAGtB,QAAA,OAAO,IAAI;;IACX,OAAO,GAAG,EAAE;AACZ,QAAA,IAAI,aAAa,CAAC,GAAG,EAAE,sCAAsC,CAAC,EAAE;AAC9D,YAAA,OAAO,IAAI;;AAEb,QAAA,MAAM,GAAG;;AAEb;;;;"}