{"version":3,"file":"getSubdomains.cjs","sources":["../../../src/domain/getSubdomains.ts"],"sourcesContent":["import {\r\n  Address,\r\n  Base58EncodedBytes,\r\n  GetProgramAccountsApi,\r\n  Rpc,\r\n} from \"@solana/kit\";\r\n\r\nimport { addressCodec, base64Codec } from \"../codecs\";\r\nimport {\r\n  NAME_PROGRAM_ADDRESS,\r\n  REVERSE_LOOKUP_CLASS,\r\n} from \"../constants/addresses\";\r\nimport { deserializeReverse } from \"../utils/deserializers/deserializeReverse\";\r\nimport { getReverseAddressFromDomainAddress } from \"../utils/getReverseAddressFromDomainAddress\";\r\nimport { getDomainAddress } from \"./getDomainAddress\";\r\n\r\ninterface GetSubdomainsParams {\r\n  rpc: Rpc<GetProgramAccountsApi>;\r\n  domain: string;\r\n}\r\n\r\ninterface Result {\r\n  subdomain: string;\r\n  owner: Address;\r\n}\r\n\r\n/**\r\n * Retrieves all subdomains under the specified domain, including their owners.\r\n *\r\n * @param params - An object containing the following properties:\r\n *   - `rpc`: An RPC interface implementing GetProgramAccountsApi.\r\n *   - `domain`: The domain whose subdomains are to be retrieved.\r\n * @returns A promise that resolves to an array of subdomain objects, each containing the subdomain name and owner address.\r\n */\r\nexport const getSubdomains = async ({\r\n  rpc,\r\n  domain,\r\n}: GetSubdomainsParams): Promise<Result[]> => {\r\n  const { domainAddress, isSub } = await getDomainAddress({ domain });\r\n\r\n  if (isSub) return [];\r\n\r\n  const getReversesAsync = rpc\r\n    .getProgramAccounts(NAME_PROGRAM_ADDRESS, {\r\n      encoding: \"base64\",\r\n      filters: [\r\n        {\r\n          memcmp: {\r\n            offset: 0n,\r\n            bytes: domainAddress as string as Base58EncodedBytes,\r\n            encoding: \"base58\",\r\n          },\r\n        },\r\n        {\r\n          memcmp: {\r\n            offset: 64n,\r\n            bytes: REVERSE_LOOKUP_CLASS as string as Base58EncodedBytes,\r\n            encoding: \"base58\",\r\n          },\r\n        },\r\n      ],\r\n    })\r\n    .send();\r\n\r\n  const getSubsAsync = rpc\r\n    .getProgramAccounts(NAME_PROGRAM_ADDRESS, {\r\n      encoding: \"base64\",\r\n      filters: [\r\n        {\r\n          memcmp: {\r\n            offset: 0n,\r\n            bytes: domainAddress as string as Base58EncodedBytes,\r\n            encoding: \"base58\",\r\n          },\r\n        },\r\n      ],\r\n      dataSlice: { offset: 32, length: 32 },\r\n    })\r\n    .send();\r\n\r\n  const [reverses, subs] = await Promise.all([getReversesAsync, getSubsAsync]);\r\n\r\n  const map = new Map<string, string | undefined>(\r\n    reverses.map((e) => [\r\n      e.pubkey,\r\n      deserializeReverse({\r\n        data: base64Codec.encode(e.account.data[0]).slice(96),\r\n        trimFirstNullByte: true,\r\n      }),\r\n    ])\r\n  );\r\n\r\n  const result = await Promise.all(\r\n    subs.map((sub) =>\r\n      getReverseAddressFromDomainAddress({\r\n        domainAddress: sub.pubkey,\r\n        parentAddress: domainAddress,\r\n      }).then((revKey) => {\r\n        const subdomain = map.get(revKey);\r\n        return subdomain\r\n          ? {\r\n              subdomain,\r\n              owner: addressCodec.decode(\r\n                base64Codec.encode(sub.account.data[0])\r\n              ),\r\n            }\r\n          : undefined;\r\n      })\r\n    )\r\n  );\r\n\r\n  const filteredResult = result.filter((sub) => sub !== undefined);\r\n\r\n  return filteredResult;\r\n};\r\n"],"names":["async","rpc","domain","domainAddress","isSub","getDomainAddress","getReversesAsync","getProgramAccounts","NAME_PROGRAM_ADDRESS","encoding","filters","memcmp","offset","bytes","REVERSE_LOOKUP_CLASS","send","getSubsAsync","dataSlice","length","reverses","subs","Promise","all","map","Map","e","pubkey","deserializeReverse","data","base64Codec","encode","account","slice","trimFirstNullByte","sub","getReverseAddressFromDomainAddress","parentAddress","then","revKey","subdomain","get","owner","addressCodec","decode","undefined","filter"],"mappings":"sQAkC6BA,OAC3BC,MACAC,aAEA,MAAMC,cAAEA,EAAaC,MAAEA,SAAgBC,EAAgBA,iBAAC,CAAEH,WAE1D,GAAIE,EAAO,MAAO,GAElB,MAAME,EAAmBL,EACtBM,mBAAmBC,EAAAA,qBAAsB,CACxCC,SAAU,SACVC,QAAS,CACP,CACEC,OAAQ,CACNC,OAAQ,GACRC,MAAOV,EACPM,SAAU,WAGd,CACEE,OAAQ,CACNC,OAAQ,IACRC,MAAOC,EAAoDA,qBAC3DL,SAAU,cAKjBM,OAEGC,EAAef,EAClBM,mBAAmBC,EAAAA,qBAAsB,CACxCC,SAAU,SACVC,QAAS,CACP,CACEC,OAAQ,CACNC,OAAQ,GACRC,MAAOV,EACPM,SAAU,YAIhBQ,UAAW,CAAEL,OAAQ,GAAIM,OAAQ,MAElCH,QAEII,EAAUC,SAAcC,QAAQC,IAAI,CAAChB,EAAkBU,IAExDO,EAAM,IAAIC,IACdL,EAASI,KAAKE,GAAM,CAClBA,EAAEC,OACFC,qBAAmB,CACjBC,KAAMC,EAAAA,YAAYC,OAAOL,EAAEM,QAAQH,KAAK,IAAII,MAAM,IAClDC,mBAAmB,QA0BzB,aArBqBZ,QAAQC,IAC3BF,EAAKG,KAAKW,GACRC,qCAAmC,CACjChC,cAAe+B,EAAIR,OACnBU,cAAejC,IACdkC,MAAMC,IACP,MAAMC,EAAYhB,EAAIiB,IAAIF,GAC1B,OAAOC,EACH,CACEA,YACAE,MAAOC,EAAAA,aAAaC,OAClBd,cAAYC,OAAOI,EAAIH,QAAQH,KAAK,WAGxCgB,CAAS,QAKWC,QAAQX,QAAgBU,IAARV,GAEzB"}