{"version":3,"file":"getSnsNftsForAddress.cjs","sources":["../../../src/address/getSnsNftsForAddress.ts"],"sourcesContent":["import {\r\n  Address,\r\n  Base58EncodedBytes,\r\n  GetMultipleAccountsApi,\r\n  GetProgramAccountsApi,\r\n  Rpc,\r\n} from \"@solana/kit\";\r\n\r\nimport { base64Codec, tokenCodec } from \"../codecs\";\r\nimport { TOKEN_PROGRAM_ADDRESS } from \"../constants/addresses\";\r\nimport { NftState } from \"../states/nft\";\r\nimport { reverseLookupBatch } from \"../utils/reverseLookupBatch\";\r\n\r\n/**\r\n * Parameters for retrieving SNS domain NFTs owned by an address.\r\n *\r\n * @example\r\n * ```ts\r\n * const params: GetSnsNftsForAddressParams = { rpc, address };\r\n * ```\r\n */\r\nexport interface GetSnsNftsForAddressParams {\r\n  /** RPC client. */\r\n  rpc: Rpc<GetMultipleAccountsApi & GetProgramAccountsApi>;\r\n  /** Owner address. */\r\n  address: Address;\r\n}\r\n\r\n/**\r\n * An SNS domain NFT owned by an address.\r\n *\r\n * @example\r\n * ```ts\r\n * const domain: GetSnsNftsForAddressResult = {\r\n *   domain: \"example\",\r\n *   domainAddress,\r\n *   mint,\r\n * };\r\n * ```\r\n */\r\nexport interface GetSnsNftsForAddressResult {\r\n  /** TLD-less domain name. */\r\n  domain: string;\r\n  /** Domain account address. */\r\n  domainAddress: Address;\r\n  /** NFT mint address. */\r\n  mint: Address;\r\n}\r\n\r\n/**\r\n * Retrieves tokenized SNS domain NFT states for an address.\r\n *\r\n * Failed NFT state lookups are skipped. If token account retrieval fails, an\r\n * empty array is returned.\r\n *\r\n * @param params NFT state retrieval parameters\r\n * @param params.rpc RPC client implementing program account lookup\r\n * @param params.address Address whose tokenized domain NFT states are retrieved\r\n * @returns Successfully decoded NFT states.\r\n */\r\nconst getNftStatesForAddress = async ({\r\n  rpc,\r\n  address,\r\n}: {\r\n  rpc: Rpc<GetProgramAccountsApi>;\r\n  address: Address;\r\n}): Promise<NftState[]> => {\r\n  try {\r\n    const results = await rpc\r\n      .getProgramAccounts(TOKEN_PROGRAM_ADDRESS, {\r\n        encoding: \"base64\",\r\n        filters: [\r\n          {\r\n            memcmp: {\r\n              offset: 32n,\r\n              bytes: address as string as Base58EncodedBytes,\r\n              encoding: \"base58\",\r\n            },\r\n          },\r\n          {\r\n            memcmp: {\r\n              offset: 64n,\r\n              bytes: \"2\" as Base58EncodedBytes,\r\n              encoding: \"base58\",\r\n            },\r\n          },\r\n          { dataSize: 165n },\r\n        ],\r\n      })\r\n      .send();\r\n\r\n    const nftStates = await Promise.all(\r\n      results.map(({ account }) => {\r\n        const { mint } = tokenCodec.decode(base64Codec.encode(account.data[0]));\r\n        return NftState.retrieveFromMint(rpc, mint).catch(() => undefined);\r\n      })\r\n    );\r\n\r\n    return nftStates.filter((state) => state !== undefined);\r\n  } catch (error) {\r\n    console.error(\"Error retrieving NFT records:\", error);\r\n    return [];\r\n  }\r\n};\r\n\r\n/**\r\n * Retrieves the SNS domain NFTs owned by a given address.\r\n *\r\n * Returned `domain` values do not include a `.sns` or `.sol` suffix.\r\n * If NFT records cannot be retrieved or decoded, this function returns an empty\r\n * array instead of throwing.\r\n *\r\n * Entries without reverse lookup results are omitted.\r\n *\r\n * @param params Tokenized domain retrieval parameters\r\n * @param params.rpc RPC client implementing multiple-account and program account APIs\r\n * @param params.address Address whose SNS domain NFTs are retrieved\r\n * @returns Tokenized domain records with names without a TLD suffix, domain addresses, and mints.\r\n *\r\n * @example\r\n * ```ts\r\n * const domains = await getSnsNftsForAddress({ rpc, address });\r\n * ```\r\n */\r\nexport const getSnsNftsForAddress = async ({\r\n  rpc,\r\n  address,\r\n}: GetSnsNftsForAddressParams): Promise<GetSnsNftsForAddressResult[]> => {\r\n  const nftStates = await getNftStatesForAddress({ rpc, address });\r\n  const nftNameAccounts = nftStates.map((state) => state.nameAccount);\r\n  const domains = await reverseLookupBatch({\r\n    rpc,\r\n    domainAddresses: nftNameAccounts,\r\n  });\r\n\r\n  return domains\r\n    .map((domain, idx) =>\r\n      domain\r\n        ? {\r\n            domain,\r\n            domainAddress: nftStates[idx].nameAccount,\r\n            mint: nftStates[idx].nftMint,\r\n          }\r\n        : undefined\r\n    )\r\n    .filter((e) => e !== undefined);\r\n};\r\n"],"names":["TOKEN_PROGRAM_ADDRESS","tokenCodec","base64Codec","NftState","reverseLookupBatch"],"mappings":";;;;;;;;;AAiDA;;;;;;;;;;AAUG;AACH,MAAM,sBAAsB,GAAG,OAAO,EACpC,GAAG,EACH,OAAO,GAIR,KAAyB;AACxB,IAAA,IAAI;QACF,MAAM,OAAO,GAAG,MAAM;aACnB,kBAAkB,CAACA,+BAAqB,EAAE;AACzC,YAAA,QAAQ,EAAE,QAAQ;AAClB,YAAA,OAAO,EAAE;AACP,gBAAA;AACE,oBAAA,MAAM,EAAE;AACN,wBAAA,MAAM,EAAE,GAAG;AACX,wBAAA,KAAK,EAAE,OAAuC;AAC9C,wBAAA,QAAQ,EAAE,QAAQ;AACnB,qBAAA;AACF,iBAAA;AACD,gBAAA;AACE,oBAAA,MAAM,EAAE;AACN,wBAAA,MAAM,EAAE,GAAG;AACX,wBAAA,KAAK,EAAE,GAAyB;AAChC,wBAAA,QAAQ,EAAE,QAAQ;AACnB,qBAAA;AACF,iBAAA;gBACD,EAAE,QAAQ,EAAE,IAAI,EAAE;AACnB,aAAA;SACF;AACA,aAAA,IAAI,EAAE;AAET,QAAA,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CACjC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,KAAI;YAC1B,MAAM,EAAE,IAAI,EAAE,GAAGC,iBAAU,CAAC,MAAM,CAACC,kBAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACvE,YAAA,OAAOC,YAAQ,CAAC,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC;SACnE,CAAC,CACH;AAED,QAAA,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,KAAK,SAAS,CAAC;;IACvD,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC;AACrD,QAAA,OAAO,EAAE;;AAEb,CAAC;AAED;;;;;;;;;;;;;;;;;;AAkBG;AACI,MAAM,oBAAoB,GAAG,OAAO,EACzC,GAAG,EACH,OAAO,GACoB,KAA2C;IACtE,MAAM,SAAS,GAAG,MAAM,sBAAsB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AAChE,IAAA,MAAM,eAAe,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,WAAW,CAAC;AACnE,IAAA,MAAM,OAAO,GAAG,MAAMC,qCAAkB,CAAC;QACvC,GAAG;AACH,QAAA,eAAe,EAAE,eAAe;AACjC,KAAA,CAAC;AAEF,IAAA,OAAO;SACJ,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,KACf;AACE,UAAE;YACE,MAAM;AACN,YAAA,aAAa,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,WAAW;AACzC,YAAA,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO;AAC7B;UACD,SAAS;SAEd,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC;AACnC;;;;"}